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的Twisted框架上手前所必须了解的异步编程思想
May 25 Python
Python 数据结构之旋转链表
Feb 25 Python
Python File readlines() 使用方法
Mar 19 Python
Pytorch入门之mnist分类实例
Apr 14 Python
Django结合ajax进行页面实时更新的例子
Aug 12 Python
在django模板中实现超链接配置
Aug 21 Python
Python解压 rar、zip、tar文件的方法
Nov 19 Python
如何使用repr调试python程序
Feb 28 Python
python 安装impala包步骤
Mar 28 Python
Python使用扩展库pywin32实现批量文档打印实例
Apr 09 Python
Python ADF 单位根检验 如何查看结果的实现
Jun 03 Python
Python selenium绕过webdriver监测执行javascript
Apr 12 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
php URL跳转代码 减少外链
2011/06/25 PHP
php 验证码(倾斜,正弦干扰线,黏贴,旋转)
2013/06/29 PHP
PHP使用mysqldump命令导出数据库
2015/04/14 PHP
PHP+Apache实现二级域名之间共享cookie的方法
2019/07/24 PHP
jquery tools之tooltip
2009/07/25 Javascript
javascript 操作Word和Excel的实现代码
2009/10/26 Javascript
js获取IP和PcName(IE)在vs中可用
2013/08/02 Javascript
js克隆对象、数组的常用方法介绍
2013/09/26 Javascript
按Enter键触发事件的jquery方法实现代码
2014/02/17 Javascript
Linux下使用jq友好的打印JSON技巧分享
2014/11/18 Javascript
自定义百度分享的分享按钮
2015/03/18 Javascript
jQuery对JSON数据进行排序输出的方法
2015/06/24 Javascript
JavaScript制作淘宝星级评分效果的思路
2020/06/23 Javascript
js console.log打印对像与数组用法详解
2016/01/21 Javascript
AngularJS入门教程之多视图切换用法示例
2016/11/02 Javascript
JavaScript异步上传图片文件的实例代码
2017/07/04 Javascript
CheckBox多选取值及判断CheckBox选中是否为空的实例
2017/10/31 Javascript
vue项目中的webpack-dev-sever配置方法
2017/12/14 Javascript
JavaScript分步实现一个出生日期的正则表达式
2018/03/22 Javascript
axios向后台传递数组作为参数的方法
2018/08/11 Javascript
Vue+webpack项目配置便于维护的目录结构教程详解
2018/10/14 Javascript
简单说说如何使用vue-router插件的方法
2019/04/08 Javascript
[41:12]Liquid vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.24
2019/09/10 DOTA
Python中实现从目录中过滤出指定文件类型的文件
2015/02/02 Python
对python opencv 添加文字 cv2.putText 的各参数介绍
2018/12/05 Python
FOREO官方网站:LUNA露娜洁面仪
2016/11/28 全球购物
Ralph Lauren意大利官方网站:时尚界最负盛名的品牌之一
2018/10/18 全球购物
德国的大型美妆个护电商:Flaconi
2020/06/26 全球购物
工厂会计员职责
2014/02/06 职场文书
村级换届选举方案
2014/05/10 职场文书
优秀电子工程系毕业生求职信
2014/05/24 职场文书
中秋节国旗下演讲稿
2014/09/05 职场文书
2014离婚协议书范文两篇
2014/09/15 职场文书
教师党员批评与自我批评发言稿
2014/10/15 职场文书
教研活动主持词
2015/07/03 职场文书
Vue2.0搭建脚手架
2022/03/13 Vue.js