Python 数据驱动工具:DDT
背景
python 的unittest 没有自带数据驱动功能。
所以如果使用unittest,同时又想使用数据驱动,那么就可以使用DDT来完成。
DDT是 “Data-Driven Tests”的缩写。
资料:http://ddt.readthedocs.io/en/latest/
使用方法
dd.ddt:
装饰类,也就是继承自TestCase的类。
ddt.data:
装饰测试方法。参数是一系列的值。
ddt.file_data:
装饰测试方法。参数是文件名。文件可以是json 或者 yaml类型。
注意,如果文件以”.yml”或者”.yaml”结尾,ddt会作为yaml类型处理,其他所有文件都会作为json文件处理。
如果文件中是列表,每个列表的值会作为测试用例参数,同时作为测试用例方法名后缀显示。
如果文件中是字典,字典的key会作为测试用例方法的后缀显示,字典的值会作为测试用例参数。
ddt.unpack:
传递的是复杂的数据结构时使用。比如使用元组或者列表,添加unpack之后,ddt会自动把元组或者列表对应到多个参数上。字典也可以这样处理。参见下面的示例2.
测试用例方法名生成规则
使用ddt后,会产生一个新的测试用例方法名:之前的测试用例方法名_ordinal_data
之前的测试用例方法名:即定义的测试用例方法名。比如def test_large(),这里就是test_large
ordinal:整数,从1开始递加。
data:如果传递过来的数据存在__name__属性,则这里就是该数据的__name__值。如果未定义__name__属性,ddt会尽量将传递过来的数据转化为python标识符,作为data显示。比如(3,2)就转化为3_2。需要注意的是,如果数据是字典,则这里就是字典的key。
使用示例
1. data直接放入数值
需要导入ddt包,然后再TestCase类上采用@ddt进行装饰,测试方法上装饰@data()。
data可以是数值,也可以是字符串。
import unittest
from ddt import ddt, data
from ddt_demo.mycode import larger_than_two @ddt
class FooTestCase(unittest.TestCase): @data(3, 4, 12, 23)
def test_larger_than_two(self, value):
self.assertTrue(larger_than_two(value)) @data(1, -3, 2, 0)
def test_not_larger_than_two(self, value):
self.assertFalse(larger_than_two(value)) @data(u'ascii', u'non-ascii-\N{SNOWMAN}')
def test_unicode(self, value):
self.assertIn(value, (u'ascii', u'non-ascii-\N{SNOWMAN}')) if __name__=='__main__':
unittest.main(verbosity=2)
输出如下:
test_larger_than_two_1_3 (__main__.FooTestCase) ... ok
test_larger_than_two_2_4 (__main__.FooTestCase) ... ok
test_larger_than_two_3_12 (__main__.FooTestCase) ... ok
test_larger_than_two_4_23 (__main__.FooTestCase) ... ok
test_not_larger_than_two_1_1 (__main__.FooTestCase) ... ok
test_not_larger_than_two_2__3 (__main__.FooTestCase) ... ok
test_not_larger_than_two_3_2 (__main__.FooTestCase) ... ok
test_not_larger_than_two_4_0 (__main__.FooTestCase) ... ok
test_unicode_1_ascii (__main__.FooTestCase) ... ok
test_unicode_2_non_ascii__ (__main__.FooTestCase) ... ok ----------------------------------------------------------------------
Ran 10 tests in 0.001s OK
可以看到上面只写了3个测试方法,但是最后run了10个用例。
这里测试方法后会被ddt加一个后缀,ddt会尝试把测试数据转化为后缀附在测试方法后,组成一个新的名字。
2. data放入复杂的数据结构
使用复杂的数据结构时,需要用到@unpack,同时测试方法的参数需要使用对应的多个,比如下面的frist_value 以及 second_value。
import unittest
from ddt import ddt, data,unpack @ddt
class FooTestCase(unittest.TestCase): @data((3, 2), (4, 3), (5, 3))
@unpack
def test_tuples_extracted_into_arguments(self, first_value, second_value):
self.assertTrue(first_value > second_value) @data([3, 2], [4, 3], [5, 3])
@unpack
def test_list_extracted_into_arguments(self, first_value, second_value):
self.assertTrue(first_value > second_value) @unpack
@data({'first': 1, 'second': 3, 'third': 2},
{'first': 4, 'second': 6, 'third': 5})
def test_dicts_extracted_into_kwargs(self, first, second, third):
self.assertTrue(first < third < second) if __name__=='__main__':
unittest.main(verbosity=2)
执行之后,全部pass。
3. 使用json文件
新建文件 test_data_list.json:
[
"Hello",
"Goodbye"
]
新建文件 test_data_dict.json:
{
"unsorted_list": [ 10, 12, 15 ],
"sorted_list": [ 15, 12, 50 ]
}
新建测试脚本ddt_test.py:
import unittest
from ddt import ddt, file_data
from ddt_demo.mycode import has_three_elements,is_a_greeting @ddt
class FooTestCase(unittest.TestCase): @file_data('test_data_dict.json')
def test_file_data_json_dict(self, value):
self.assertTrue(has_three_elements(value)) @file_data('test_data_list.json')
def test_file_data_json_list(self, value):
self.assertTrue(is_a_greeting(value)) if __name__=='__main__':
unittest.main(verbosity=2)
4. 使用yaml文件
新建文件 test_data_list.yaml:
- "Hello"
- "Goodbye"
新建文件 test_data_dict.yaml:
unsorted_list:
- 10
- 15
- 12 sorted_list: [ 15, 12, 50 ]
新建测试脚本ddt_test.py:
import unittest
from ddt import ddt, file_data
from ddt_demo.mycode import has_three_elements,is_a_greeting @ddt
class FooTestCase(unittest.TestCase): @file_data('test_data_dict.yaml')
def test_file_data_yaml_dict(self, value):
self.assertTrue(has_three_elements(value)) @file_data('test_data_list.yaml')
def test_file_data_yaml_list(self, value):
self.assertTrue(is_a_greeting(value)) if __name__=='__main__':
unittest.main(verbosity=2)
Python 数据驱动工具:DDT的更多相关文章
- 【webdriver自动化】Python数据驱动工具DDT
一.Python数据驱动工具ddt 1. 安装 ddt pip install ddt DDT是 “Data-Driven Tests”的缩写 资料:http://ddt.readthedocs.i ...
- Python 数据驱动 unittest + ddt
一数据驱动测试的含义: 在百度百科上的解释是: 数据驱动测试,即黑盒测试(Black-box Testing),又称为功能测试,是把测试对象看作一个黑盒子.利用黑盒测试法进行动态测试时,需要测试软件产 ...
- python - 数据驱动测试 - ddt
# -*- coding:utf-8 -*- ''' @project: jiaxy @author: Jimmy @file: study_ddt.py @ide: PyCharm Communit ...
- python 数据驱动(ddt)
DDT包含类的装饰器ddt和两个方法装饰器data(直接输入测试数据),file_data(可以从json或者yaml中获取测试数据) 实例代码: import ddt import unittest ...
- Python+Selenium+Unittest+Ddt+HTMLReport分布式数据驱动自动化测试框架结构
1.Business:公共业务模块,如登录模块,可以把登录模块进行封装供调用 ------login_business.py from Page_Object.Common_Page.login_pa ...
- Python数据驱动DDT的应用
在开始之前,我们先来明确一下什么是数据驱动,在百度百科中数据驱动的解释是:数据驱动测试,即黑盒测试(Black-box Testing),又称为功能测试,是把测试对象看作一个黑盒子.利用黑盒测试法进行 ...
- 【Machine Learning】Python开发工具:Anaconda+Sublime
Python开发工具:Anaconda+Sublime 作者:白宁超 2016年12月23日21:24:51 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现 ...
- Python开发工具PyCharm个性化设置(图解)
Python开发工具PyCharm个性化设置,包括设置默认PyCharm解析器.设置缩进符为制表符.设置IDE皮肤主题等,大家参考使用吧. JetBrains PyCharm Pro 4.5.3 中文 ...
- 下破解安装Python开发工具WingIDE4.1
步骤: 1.将系统时间调整到一个月之前,然后执行安装. 可以使用date命令调整系统时间,如:date -s '2012-08-14 10:00:00' 2.安装成功后,打开程序,按照提示信息,申请一 ...
随机推荐
- Vue 2.0学习(六)内置指令
基本指令 1.v-cloak v-cloak不需要表达式,它会在Vue实例结束编译时从绑定的HTML元素上移除,经常和CSS的display:none配合使用. <div id="ap ...
- 「POI2011 R1」Conspiracy
「POI2011 R1」Conspiracy 解题思路 : 问题转化为,将点集分成两部分,其中一部分恰好组成一个团,其中另一部分恰好组成一个独立集. 观察发现,如果求出了一个解,那么答案最多可以在这个 ...
- Codeforces Round #299 (Div. 2) A. Tavas and Nafas 水题
A. Tavas and Nafas Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/535/pr ...
- 模型的性能评估(二) 用sklearn进行模型评估
在sklearn当中,可以在三个地方进行模型的评估 1:各个模型的均有提供的score方法来进行评估. 这种方法对于每一种学习器来说都是根据学习器本身的特点定制的,不可改变,这种方法比较简单.这种方法 ...
- Reflector反编译.NET文件后修复
反编译后的工程文件用VS2010打开后,在打开窗体时会出现一系列错误提示: 第一种情况: “设计器无法处理第 152 行的代码: base.AutoScaleMode = AutoScaleMode. ...
- 调整设置 Win7休眠文件“Hiberfil.sys”
1. 显示并查看Hiberfil.sys文件
- Turn any Linux computer into SOCKS5 proxy in one command
src: http://www.catonmat.net/blog/linux-socks5-proxy/ I thought I'd do a shorter article on catonmat ...
- PostgreSql 合并多行记录
需求描述: A表有如下数据 id 1 2 3 4 B表有如下数据 id name 1 aaa 1 bbb 1 ccc 2 aa 2 bb 3 c A表和B表通过id关联,需要查询结果如下: id na ...
- servlet中获得tomcat项目根目录的绝对路径
public class CreateXmlAction extends HttpServlet { private ServletConfig config; public void init(Se ...
- jquery之超简单的div显示和隐藏特效demo
闲着无聊,看到某视频网站上讲的DIV显示和隐藏的效果,自己也写了一个. 觉得还是挺简单的. 前端改变世界!嘿嘿,还挺有成就感 <!DOCTYPE html PUBLIC "-//W3C ...