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安装Imaging报错:The _imaging C module is not installed问题解决方法
Aug 22 Python
Python实现拼接多张图片的方法
Dec 01 Python
详解Python中的日志模块logging
Jun 19 Python
Python实现输出某区间范围内全部素数的方法
May 02 Python
Python实现基于POS算法的区块链
Aug 07 Python
python中的不可变数据类型与可变数据类型详解
Sep 16 Python
[原创]Python入门教程1. 基本运算【四则运算、变量、math模块等】
Oct 28 Python
Python unittest 简单实现参数化的方法
Nov 30 Python
python中数组和矩阵乘法及使用总结(推荐)
May 18 Python
python使用sklearn实现决策树的方法示例
Sep 12 Python
OpenCV图片漫画效果的实现示例
Aug 18 Python
Python Pandas 删除列操作
Mar 16 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
wiki-shan写的php在线加密的解密程序
2008/09/07 PHP
一个简单的网页密码登陆php代码
2012/07/17 PHP
在PHP中使用redis
2013/11/04 PHP
php中使用array_filter()函数过滤空数组的实现代码
2014/08/19 PHP
thinkphp循环结构用法实例
2014/11/24 PHP
PHPStrom中实用的功能和快捷键大全
2015/09/23 PHP
PHP获取redis里不存在的6位随机数应用示例【设置24小时过时】
2017/06/07 PHP
php ActiveMQ的安装与使用方法图文教程
2020/02/23 PHP
浅析PHP echo 和 print 语句
2020/06/30 PHP
将字符串转换成gb2312或者utf-8编码的参数(js版)
2013/04/10 Javascript
jquery 页面滚动到底部自动加载插件集合
2014/01/31 Javascript
javascript包装对象实例分析
2015/03/27 Javascript
JavaScript实现自动消除按钮功能的方法
2015/08/05 Javascript
JavaScript接口的实现三种方式(推荐)
2016/06/14 Javascript
微信小程序 教程之模块化
2016/10/17 Javascript
微信小程序wx.request实现后台数据交互功能分析
2017/11/25 Javascript
详解VUE里子组件如何获取父组件动态变化的值
2018/12/26 Javascript
JS实现数组去重,显示重复元素及个数的方法示例
2019/01/21 Javascript
在layui中对table中的数据进行判断(0、1)转换为提示信息的方法
2019/09/28 Javascript
关于layui 实现点击按钮添加一行(方法渲染创建的table)
2019/09/29 Javascript
基于javascript处理nginx请求过程详解
2020/07/07 Javascript
Vue $emit()不能触发父组件方法的原因及解决
2020/07/28 Javascript
js绘制一条直线并旋转45度
2020/08/21 Javascript
[11:57]《一刀刀一天》第十七期:TI中国军团加油!
2014/05/26 DOTA
[01:51]2014DOTA2西雅图邀请赛 MVP 外卡赛black场间采访
2014/07/09 DOTA
python使用str & repr转换字符串
2016/10/13 Python
centos6.7安装python2.7.11的具体方法
2017/01/16 Python
python记录程序运行时间的三种方法
2017/07/14 Python
Pytorch卷积层手动初始化权值的实例
2019/08/17 Python
Python3.x+pyqtgraph实现数据可视化教程
2020/03/14 Python
python 密码学示例——凯撒密码的实现
2020/09/21 Python
快速一键生成Python爬虫请求头
2021/03/04 Python
英国著名书店:Foyles
2018/12/01 全球购物
小松树教学反思
2014/02/11 职场文书
节能环保演讲稿
2014/08/28 职场文书
vue实现在data里引入相对路径
2022/06/05 Vue.js