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之有容乃大的list(3)
Sep 15 Python
搞笑的程序猿:看看你是哪种Python程序员
Jun 12 Python
python实现线程池的方法
Jun 30 Python
python实现关键词提取的示例讲解
Apr 28 Python
对python中的pop函数和append函数详解
May 04 Python
python遍历文件夹,指定遍历深度与忽略目录的方法
Jul 11 Python
基于python的ini配置文件操作工具类
Apr 24 Python
Python进阶之使用selenium爬取淘宝商品信息功能示例
Sep 16 Python
Python一行代码解决矩阵旋转的问题
Nov 30 Python
详解python内置模块urllib
Sep 09 Python
python Paramiko使用示例
Sep 21 Python
如何基于Python pygame实现动画跑马灯
Nov 18 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
十大“创意”战术!
2020/03/04 星际争霸
php生成随机字符串可指定纯数字、纯字母或者混合的
2014/04/18 PHP
PHP使用socket发送HTTP请求的方法
2016/02/14 PHP
PHP闭包定义与使用简单示例
2018/04/13 PHP
PHP简单实现记录网站访问量功能示例
2018/06/06 PHP
让你的CSS像Jquery一样做筛选的实现方法
2011/07/10 Javascript
JS操作select下拉框动态变动(创建/删除/获取)
2013/06/02 Javascript
jquery如何判断某元素是否具备指定的样式
2013/11/05 Javascript
JS 屏蔽键盘不可用与鼠标右键不可用的方法
2013/11/18 Javascript
Android中的jQuery:AQuery简介
2014/05/06 Javascript
JavaScript动态创建link标签到head里的方法
2014/12/22 Javascript
js代码实现点击按钮出现60秒倒计时
2021/01/28 Javascript
javascript自动恢复文本框点击清除后的默认文本
2016/01/12 Javascript
详解js的六大数据类型
2016/12/27 Javascript
Vue.js仿Metronic高级表格(一)静态设计
2017/04/17 Javascript
react native仿微信PopupWindow效果的实例代码
2017/08/07 Javascript
jQuery ajax调用webservice注意事项
2017/10/08 jQuery
vuex实现登录状态的存储,未登录状态不允许浏览的方法
2018/03/09 Javascript
JS匿名函数和匿名自执行函数概念与用法分析
2018/03/16 Javascript
手把手教你写一个微信小程序(推荐)
2018/10/17 Javascript
vue-devtools的安装和使用步骤详解
2019/10/17 Javascript
jQuery轮播图功能制作方法详解
2019/12/03 jQuery
小程序实现列表展开收起效果
2020/07/29 Javascript
vue中activated的用法
2021/01/03 Vue.js
python 判断文件还是文件夹的简单实例
2019/06/10 Python
tensorflow图像裁剪进行数据增强操作
2020/06/30 Python
Django windows使用Apache实现部署流程解析
2020/10/12 Python
爱尔兰领先的在线体育用品零售商:theGAAstore
2018/04/16 全球购物
简历里的自我评价
2014/01/31 职场文书
环保倡议书500字
2014/05/15 职场文书
行政专员岗位职责说明书
2014/09/01 职场文书
教师自荐信范文
2015/03/06 职场文书
2015年秋季小学开学标语
2015/07/16 职场文书
考教师资格证不要错过的4个最佳时机
2019/07/17 职场文书
html+css实现滚动到元素位置显示加载动画效果
2021/08/02 HTML / CSS
疑《守望先锋2》A测截图泄露 或将推出新模式、新界面
2022/04/03 其他游戏