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使用爬虫猜密码
Feb 19 Python
Python实现的摇骰子猜大小功能小游戏示例
Dec 18 Python
python 定义n个变量方法 (变量声明自动化)
Nov 10 Python
python django框架中使用FastDFS分布式文件系统的安装方法
Jun 10 Python
selenium获取当前页面的url、源码、title的方法
Jun 12 Python
在python里面运用多继承方法详解
Jul 01 Python
python 通过视频url获取视频的宽高方式
Dec 10 Python
python使用正则来处理各种匹配问题
Dec 22 Python
Python3加密解密库Crypto的RSA加解密和签名/验签实现方法实例
Feb 11 Python
Python经典五人分鱼实例讲解
Jan 04 Python
matplotlib绘制正余弦曲线图的实现
Feb 22 Python
matplotlib之多边形选区(PolygonSelector)的使用
Feb 24 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
模仿OSO的论坛(五)
2006/10/09 PHP
用PHP与XML联手进行网站编程代码实例
2008/07/10 PHP
php抽奖小程序的实现代码
2013/06/18 PHP
PHP遍历某个目录下的所有文件和子文件夹的实现代码
2013/06/28 PHP
免费手机号码归属地API查询接口和PHP使用实例分享
2014/04/10 PHP
php中ob_flush函数和flush函数用法分析
2015/03/18 PHP
Extjs EditorGridPanel中ComboBox列的显示问题
2011/07/04 Javascript
javascript基础知识大全 便于大家学习,也便于我自己查看
2012/08/17 Javascript
javascript loadScript异步加载脚本示例讲解
2013/11/14 Javascript
浅谈javascript中call()、apply()、bind()的用法
2015/04/20 Javascript
jquery实现简单的轮换出现效果实例
2015/07/23 Javascript
AngularJS在IE8的不支持的解决方法
2016/05/13 Javascript
fullCalendar中文API官方文档
2017/02/07 Javascript
浅谈JS封闭函数、闭包、内置对象
2017/07/18 Javascript
使用vue + less 实现简单换肤功能的示例
2018/02/21 Javascript
vue全局使用axios的方法实例详解
2018/11/22 Javascript
Vue中el-form标签中的自定义el-select下拉框标签功能
2020/04/20 Javascript
使用Vue+Django+Ant Design做一个留言评论模块的示例代码
2020/06/01 Javascript
vue 表单输入框不支持focus及blur事件的解决方案
2020/11/17 Vue.js
python字符串编码识别模块chardet简单应用
2015/06/15 Python
python 请求服务器的实现代码(http请求和https请求)
2018/05/25 Python
Python用字典构建多级菜单功能
2019/07/11 Python
HTML5有哪些新特征
2015/12/01 HTML / CSS
欧洲最大的美妆零售网站:Feelunique
2017/01/14 全球购物
汇集了世界上最好的天然和有机美容产品:LoveLula
2018/02/05 全球购物
TripAdvisor日本:全球领先的旅游网站
2019/02/14 全球购物
医院后勤自我鉴定
2013/10/13 职场文书
银行演讲稿范文
2014/01/03 职场文书
师范类求职信
2014/06/21 职场文书
社会体育专业大学生职业生涯规划书
2014/09/17 职场文书
2014年质量工作总结
2014/11/22 职场文书
金陵十三钗观后感
2015/06/04 职场文书
原来实习报告是这样写的呀!
2019/07/03 职场文书
告诉你创业计划书的8个实用技巧
2019/07/12 职场文书
聊聊golang中多个defer的执行顺序
2021/05/08 Golang
MySql存储过程之逻辑判断和条件控制
2021/05/26 MySQL