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 字典dict使用介绍
Nov 30 Python
Python找出最小的K个数实例代码
Jan 04 Python
python向已存在的excel中新增表,不覆盖原数据的实例
May 02 Python
python基于itchat模块实现微信防撤回
Apr 29 Python
Django 请求Request的具体使用方法
Nov 11 Python
python获取array中指定元素的示例
Nov 26 Python
Python如何使用turtle库绘制图形
Feb 26 Python
python 实现分组求和与分组累加求和代码
May 18 Python
基于python实现matlab filter函数过程详解
Jun 08 Python
python urllib和urllib3知识点总结
Feb 08 Python
2021年pycharm的最新安装教程及基本使用图文详解
Apr 03 Python
python 下载文件的几种方式分享
Apr 07 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
手把手教你使用DedeCms的采集的图文教程
2007/03/11 PHP
md5 16位二进制与32位字符串相互转换示例
2013/12/30 PHP
PHP实现操作redis的封装类完整实例
2015/11/14 PHP
php输出图像的方法实例分析
2017/02/16 PHP
PHP code 验证码生成类定义和简单使用示例
2020/05/27 PHP
用JavaScript实现仿Windows关机效果
2007/03/10 Javascript
JavaScript Prototype对象
2009/01/07 Javascript
网页前台通过js非法字符过滤代码(骂人的话等等)
2010/05/26 Javascript
jQuery 获取对象 定位子对象
2010/05/31 Javascript
ASP.NET MVC中EasyUI的datagrid跨域调用实现代码
2012/03/14 Javascript
浅析jQuery中调用ajax方法时在不同浏览器中遇到的问题
2014/06/11 Javascript
Jquery判断form表单数据是否变化
2016/03/30 Javascript
JavaScript学习笔记整理_用于模式匹配的String方法
2016/09/19 Javascript
浅谈jquery页面初始化的4种方式
2016/11/27 Javascript
jQuery监听浏览器窗口大小的变化实例
2017/02/07 Javascript
JavaScript运动框架 多物体任意值运动(三)
2017/05/17 Javascript
node.js操作MongoDB的实例详解
2017/10/11 Javascript
javaScript动态添加Li元素的实例
2018/02/24 Javascript
jquery的 filter()方法使用教程
2018/03/22 jQuery
微信小程序wx:for和wx:for-item的用法详解
2018/04/01 Javascript
vue2.0 中使用transition实现动画效果使用心得
2018/08/13 Javascript
微信小程序开发搜索功能实现(前端+后端+数据库)
2020/03/04 Javascript
[05:46]DOTA2英雄梦之声_第18期_陈
2014/06/20 DOTA
python计算文本文件行数的方法
2015/07/06 Python
Django接收自定义http header过程详解
2019/08/23 Python
python-sys.stdout作为默认函数参数的实现
2020/02/21 Python
Matplotlib中%matplotlib inline如何使用
2020/07/28 Python
Wilson体育用品官网:美国著名运动器材品牌
2019/05/12 全球购物
大学毕业登记表自我鉴定
2013/10/09 职场文书
会议开场欢迎词
2014/01/15 职场文书
公司财务流程之主管工作流程
2014/03/03 职场文书
解除同居协议书
2015/01/29 职场文书
工作岗位职责范本
2015/02/15 职场文书
KTV员工管理制度
2015/08/06 职场文书
Python爬虫:从m3u8文件里提取小视频的正确操作
2021/05/14 Python
Python使用OpenCV和K-Means聚类对毕业照进行图像分割
2021/06/11 Python