Python+unittest+DDT实现数据驱动测试


Posted in Python onNovember 30, 2020

前言

数据驱动测试:

  • 避免编写重复代码
  • 数据与测试脚本分离
  • 通过使用数据驱动测试,来验证多组数据测试场景
  • 通常来说,多用于单元测试和接口测试

ddt介绍

Data-Driven Tests(DDT)即数据驱动测试,可以实现不同数据运行同一个测试用例。ddt本质其实就是装饰器,一组数据一个场景。

ddt模块包含了一个类的装饰器ddt和三个个方法的装饰器:

data:包含多个你想要传给测试用例的参数,可以为列表、元组、字典等;

file_data:会从json或yaml中加载数据;

unpack:分割元素,如以下示例:

@data([a,d],[c,d])

如果没有@unpack,那么[a,b]当成一个参数传入用例运行

如果有@unpack,那么[a,b]被分解开,按照用例中的两个参数传递

安装

pip install ddt

使用data装饰器

传递整体列表,字典、元组

import unittest
from ddt import ddt,data,unpack
def add(a,b):
  return a+b
@ddt
class MyTest(unittest.TestCase):
  # @data([1,2,3,4,5,6,7])
  @data({"a":"1","b":2})
  # @data((1,2,3))
  def test(self,data):
    print(data)
if __name__ == '__main__':
  unittest.main(verbosity=2)

嵌套列表、元组、字典的整体传递方式

import unittest
from ddt import ddt,data,unpack
def add(a,b):
  return a+b
@ddt
class MyTest(unittest.TestCase):
  # @data(*[[1,2,3],[1,0,1],[0,0,0],[1,1,3]])
  # @data(*[{"a":1}, {"a":2}, {"a":3}, {"a":4}])
  @data(*[(1,5), (4,2), (6,7), (5,6)])
  def test(self,data):
    print(data)

if __name__ == '__main__':
  unittest.main(verbosity=2)

使用unpack装饰器

unpack 依次传递元组

import unittest
from ddt import ddt,data,unpack
def add(a,b):
  return a+b
@ddt
class MyTest(unittest.TestCase):
  @data((1,2,3),(1,0,1),(0,0,0),(1,1,3))
  @unpack
  def test(self,a,b,c):
    print(a,b,c)
    if a+b == c:
      print(True)
    else:
      print(False)
if __name__ == '__main__':
  unittest.main(verbosity=2)

输出结果:

1 2 3
True
1 0 1
True
0 0 0
True
1 1 3
False

依次传递字典

import unittest
from ddt import ddt,data,unpack

def add(a,b):
  return a+b
@ddt
class MyTest(unittest.TestCase):
  @data({"a":1,"b":1,"c":2},
     {"a":0,"b":0,"c":0},
     {"a":-1,"b":1,"c":0})
  @unpack
  def test(self,a,b,c):
    print(a,b,c)
    if a + b == c:
      print(True)
    else:
      print(False)

if __name__ == '__main__':
  unittest.main(verbosity=2)

输出结果:

1 1 2
True
0 0 0
True
-1 1 0
True

依次传递列表

import unittest
from ddt import ddt,data,unpack

def add(a,b):
  return a+b
@ddt
class MyTest(unittest.TestCase):
  @data([1,2,3],[1,0,1],[0,0,0],[1,1,3])
  @unpack
  def test(self,a,b,c):
    print(a,b,c)
    if a + b == c:
      print(True)
    else:
      print(False)

if __name__ == '__main__':
  unittest.main(verbosity=2)

输出结果:

1 2 3
True
1 0 1
True
0 0 0
True
1 1 3
False

使用file_data装饰器

ddt支持从文件中加载数据,@file_data()装饰器会从json或yaml中加载数据。只有以“.yml” 和 “.yaml” 结尾的文件被加载为Yaml文件。所有其他格式文件都作为json文件加载,比如txt。

传递json数据

test.json文件

{
  "case1": {
    "a": 1,
    "b": 1,
    "c": 2
  },
  "case2": {
    "a": -1,
    "b": 1,
    "c": 0
  },
  "case3": {
    "a": 0,
    "b": 0,
    "c": 0
  }
}
import unittest
from ddt import ddt,file_data

def add(a,b):
  return a+b

@ddt
class MyTest(unittest.TestCase):
  @file_data("test.json")
  def test(self, a, b, c):
    print(a,b,c)


if __name__ == '__main__':
  unittest.main(verbosity=2)

传递多层json文件

test.json文件

{
  "case1": {
    "data": {
      "a": 1,
      "b": 1
    },
    "result": 2
  },
  "case2": {
    "data": {
      "a": 0,
      "b": 1
    },
    "result": 1
  },
  "case3": {
    "data": {
      "a": 0,
      "b": 0
    },
    "result": 0
  }
}
import unittest
from ddt import ddt,file_data

def add(a,b):
  return a+b

@ddt
class MyTest(unittest.TestCase):
  @file_data("test.json")
  def test(self,data,result):
    print(data,result)

if __name__ == '__main__':
  unittest.main(verbosity=2)

传递yml数据

yml 需要安装yml(pip install PyYAML)

test.yml

Python+unittest+DDT实现数据驱动测试

def add(a,b):
  return a+b
@ddt
class MyTest(unittest.TestCase):
  @file_data("test.yml")
  def test(self,a,b,c):
    print(a,b,c)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python判断变量是否已经定义的方法
Aug 18 Python
Python中的Matplotlib模块入门教程
Apr 15 Python
python 计算文件的md5值实例
Jan 13 Python
关于python写入文件自动换行的问题
Jun 23 Python
Python代码块批量添加Tab缩进的方法
Jun 25 Python
对matplotlib改变colorbar位置和方向的方法详解
Dec 13 Python
Python自动化之数据驱动让你的脚本简洁10倍【推荐】
Jun 04 Python
python 自定义装饰器实例详解
Jul 20 Python
关于Python形参打包与解包小技巧分享
Aug 24 Python
解决python 读取 log日志的编码问题
Dec 24 Python
PyTorch里面的torch.nn.Parameter()详解
Jan 03 Python
python爬虫请求库httpx和parsel解析库的使用测评
May 10 Python
Python logging自定义字段输出及打印颜色
Nov 30 #Python
详解Python中string模块除去Str还剩下什么
Nov 30 #Python
使用django自带的user做外键的方法
Nov 30 #Python
python 实现简易的记事本
Nov 30 #Python
详解pycharm自动import所需的库的操作方法
Nov 30 #Python
Django REST Framework 分页(Pagination)详解
Nov 30 #Python
python代码实现猜拳小游戏
Nov 30 #Python
You might like
全国FM电台频率大全 - 28 甘肃省
2020/03/11 无线电
通过ODBC连接的SQL SERVER实例
2006/10/09 PHP
基于PHP异步执行的常用方式详解
2013/06/03 PHP
高性能PHP框架Symfony2经典入门教程
2014/07/08 PHP
PHP中模拟处理HTTP PUT请求的例子
2014/07/22 PHP
YII2自动登录Cookie总是失效的解决方法
2017/06/28 PHP
php微信公众号开发之图片回复
2018/10/20 PHP
PHP simplexml_load_file()函数讲解
2019/02/03 PHP
function, new function, new Function之间的区别
2007/03/08 Javascript
Extjs学习笔记之四 工具栏和菜单
2010/01/07 Javascript
functional继承模式 摘自javascript:the good parts
2011/06/20 Javascript
jquery的ajax跨域请求原理和示例
2014/05/08 Javascript
5款JavaScript代码压缩工具推荐
2014/07/07 Javascript
javascript顺序加载图片的方法
2015/07/18 Javascript
Node.js中使用jQuery的做法
2016/08/17 Javascript
微信小程序 网络API发起请求详解
2016/11/09 Javascript
javascript history对象详解
2017/02/09 Javascript
vue完成项目后,打包成静态文件的方法
2018/09/03 Javascript
JS实现li标签的删除
2019/04/12 Javascript
JavaScript享元模式原理与用法实例详解
2020/03/09 Javascript
小程序实现列表展开收起效果
2020/07/29 Javascript
详解Vue的组件中data选项为什么必须是函数
2020/08/17 Javascript
python使用paramiko模块实现ssh远程登陆上传文件并执行
2014/01/27 Python
Python新手在作用域方面经常容易碰到的问题
2015/04/03 Python
Python pygorithm模块用法示例【常见算法测试】
2018/08/16 Python
我喜欢你 抖音表白程序python版
2019/04/07 Python
Python函数的返回值、匿名函数lambda、filter函数、map函数、reduce函数用法实例分析
2019/12/26 Python
台湾7-ELEVEN线上购物中心:7-11
2021/01/21 全球购物
JAVA程序员自荐书
2014/01/30 职场文书
大学生学习2014年全国两会心得体会
2014/03/12 职场文书
鸿星尔克广告词
2014/03/21 职场文书
校庆口号
2014/06/20 职场文书
单位推荐信范文
2015/03/27 职场文书
检察院起诉意见书
2015/05/20 职场文书
利用Selenium添加cookie实现自动登录的示例代码(fofa)
2021/05/08 Python
MybatisPlus代码生成器的使用方法详解
2021/06/13 Java/Android