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中一些自然语言工具的使用的入门教程
Apr 13 Python
python删除过期文件的方法
May 29 Python
Python基础篇之初识Python必看攻略
Jun 23 Python
Python日期的加减等操作的示例
Aug 15 Python
Python使用修饰器执行函数的参数检查功能示例
Sep 26 Python
python批量修改文件编码格式的方法
May 31 Python
python爬取哈尔滨天气信息
Jul 14 Python
Django JWT Token RestfulAPI用户认证详解
Jan 23 Python
Python 点击指定位置验证码破解的实现代码
Sep 11 Python
Django实现WebSSH操作物理机或虚拟机的方法
Nov 06 Python
Python zip函数打包元素实例解析
Dec 11 Python
pytorch 移动端部署之helloworld的使用
Oct 30 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 正则判断中文UTF-8或GBK的思路及具体实现
2013/11/26 PHP
JavaScript的变量作用域深入理解
2009/10/25 Javascript
Js setInterval与setTimeout(定时执行与循环执行)的代码(可以传入参数)
2010/06/11 Javascript
JavaScript子窗口ModalDialog中操作父窗口对像
2012/12/11 Javascript
js判断样式className同时增加class或删除class
2013/01/30 Javascript
jquery简单的拖动效果实现原理及示例
2013/07/26 Javascript
JS使用eval()动态创建变量的方法
2016/06/03 Javascript
详解Vue.js入门环境搭建
2017/03/17 Javascript
图解Javascript——作用域、作用域链、闭包
2017/03/21 Javascript
JavaScript通过filereader接口读取文件
2017/05/10 Javascript
移动web开发之touch事件实例详解
2018/01/17 Javascript
Vue中用props给data赋初始值遇到的问题解决
2018/11/27 Javascript
小程序实现多列选择器
2019/02/15 Javascript
微信小程序实现元素渐入渐出动画效果封装方法
2019/05/18 Javascript
JS实现点星星消除小游戏
2020/03/24 Javascript
js实现翻牌小游戏
2020/07/31 Javascript
Openlayers实现测量功能
2020/09/25 Javascript
Python pass详细介绍及实例代码
2016/11/24 Python
python爬虫的工作原理
2017/03/05 Python
Windows下安装Django框架的方法简明教程
2018/03/28 Python
python os用法总结
2018/06/08 Python
python实现定时压缩指定文件夹发送邮件
2020/12/22 Python
Python解析json代码实例解析
2019/11/25 Python
基于Django OneToOneField和ForeignKey的区别详解
2020/03/30 Python
浅谈在django中使用filter()(即对QuerySet操作)时踩的坑
2020/03/31 Python
opencv python 图片读取与显示图片窗口未响应问题的解决
2020/04/24 Python
使用scrapy ImagesPipeline爬取图片资源的示例代码
2020/09/28 Python
python3中TQDM库安装及使用详解
2020/11/18 Python
越南综合购物网站:Lazada越南
2019/06/10 全球购物
瑞士最大的图书贸易公司:Orell Füssli
2019/12/28 全球购物
当当网软件测试笔试题
2015/11/24 面试题
经典的毕业生自荐信范文
2014/04/14 职场文书
竞选副班长演讲稿
2014/04/24 职场文书
小学优秀班主任材料
2014/12/17 职场文书
营销计划书
2015/01/17 职场文书
2015年考研复习计划
2015/01/19 职场文书