背景

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可以是数值,也可以是字符串。

  1. import unittest
  2. from ddt import ddt, data
  3. from ddt_demo.mycode import larger_than_two
  4.  
  5. @ddt
  6. class FooTestCase(unittest.TestCase):
  7.  
  8. @data(3, 4, 12, 23)
  9. def test_larger_than_two(self, value):
  10. self.assertTrue(larger_than_two(value))
  11.  
  12. @data(1, -3, 2, 0)
  13. def test_not_larger_than_two(self, value):
  14. self.assertFalse(larger_than_two(value))
  15.  
  16. @data(u'ascii', u'non-ascii-\N{SNOWMAN}')
  17. def test_unicode(self, value):
  18. self.assertIn(value, (u'ascii', u'non-ascii-\N{SNOWMAN}'))
  19.  
  20. if __name__=='__main__':
  21. unittest.main(verbosity=2)

输出如下:

  1. test_larger_than_two_1_3 (__main__.FooTestCase) ... ok
  2. test_larger_than_two_2_4 (__main__.FooTestCase) ... ok
  3. test_larger_than_two_3_12 (__main__.FooTestCase) ... ok
  4. test_larger_than_two_4_23 (__main__.FooTestCase) ... ok
  5. test_not_larger_than_two_1_1 (__main__.FooTestCase) ... ok
  6. test_not_larger_than_two_2__3 (__main__.FooTestCase) ... ok
  7. test_not_larger_than_two_3_2 (__main__.FooTestCase) ... ok
  8. test_not_larger_than_two_4_0 (__main__.FooTestCase) ... ok
  9. test_unicode_1_ascii (__main__.FooTestCase) ... ok
  10. test_unicode_2_non_ascii__ (__main__.FooTestCase) ... ok
  11.  
  12. ----------------------------------------------------------------------
  13. Ran 10 tests in 0.001s
  14.  
  15. OK

可以看到上面只写了3个测试方法,但是最后run了10个用例。

这里测试方法后会被ddt加一个后缀,ddt会尝试把测试数据转化为后缀附在测试方法后,组成一个新的名字。

2. data放入复杂的数据结构

使用复杂的数据结构时,需要用到@unpack,同时测试方法的参数需要使用对应的多个,比如下面的frist_value 以及 second_value。

  1. import unittest
  2. from ddt import ddt, data,unpack
  3.  
  4. @ddt
  5. class FooTestCase(unittest.TestCase):
  6.  
  7. @data((3, 2), (4, 3), (5, 3))
  8. @unpack
  9. def test_tuples_extracted_into_arguments(self, first_value, second_value):
  10. self.assertTrue(first_value > second_value)
  11.  
  12. @data([3, 2], [4, 3], [5, 3])
  13. @unpack
  14. def test_list_extracted_into_arguments(self, first_value, second_value):
  15. self.assertTrue(first_value > second_value)
  16.  
  17. @unpack
  18. @data({'first': 1, 'second': 3, 'third': 2},
  19. {'first': 4, 'second': 6, 'third': 5})
  20. def test_dicts_extracted_into_kwargs(self, first, second, third):
  21. self.assertTrue(first < third < second)
  22.  
  23. if __name__=='__main__':
  24. unittest.main(verbosity=2)

执行之后,全部pass。

3. 使用json文件

新建文件 test_data_list.json

  1. [
  2. "Hello",
  3. "Goodbye"
  4. ]

新建文件  test_data_dict.json:

  1. {
  2. "unsorted_list": [ 10, 12, 15 ],
  3. "sorted_list": [ 15, 12, 50 ]
  4. }

新建测试脚本ddt_test.py:

  1. import unittest
  2. from ddt import ddt, file_data
  3. from ddt_demo.mycode import has_three_elements,is_a_greeting
  4.  
  5. @ddt
  6. class FooTestCase(unittest.TestCase):
  7.  
  8. @file_data('test_data_dict.json')
  9. def test_file_data_json_dict(self, value):
  10. self.assertTrue(has_three_elements(value))
  11.  
  12. @file_data('test_data_list.json')
  13. def test_file_data_json_list(self, value):
  14. self.assertTrue(is_a_greeting(value))
  15.  
  16. if __name__=='__main__':
  17. unittest.main(verbosity=2)

4. 使用yaml文件

新建文件 test_data_list.yaml:

  1. - "Hello"
  2. - "Goodbye"

新建文件 test_data_dict.yaml:

  1. unsorted_list:
  2. - 10
  3. - 15
  4. - 12
  5.  
  6. sorted_list: [ 15, 12, 50 ]

新建测试脚本ddt_test.py:

  1. import unittest
  2. from ddt import ddt, file_data
  3. from ddt_demo.mycode import has_three_elements,is_a_greeting
  4.  
  5. @ddt
  6. class FooTestCase(unittest.TestCase):
  7.  
  8. @file_data('test_data_dict.yaml')
  9. def test_file_data_yaml_dict(self, value):
  10. self.assertTrue(has_three_elements(value))
  11.  
  12. @file_data('test_data_list.yaml')
  13. def test_file_data_yaml_list(self, value):
  14. self.assertTrue(is_a_greeting(value))
  15.  
  16. if __name__=='__main__':
  17. unittest.main(verbosity=2)

转载:https://www.cnblogs.com/miniren/p/7099187.html

ddt-python测试数据驱动工具(转载)的更多相关文章

  1. python测试开发工具库汇总(转载)

    Web UI测试自动化 splinter - web UI测试工具,基于selnium封装. selenium - web UI自动化测试. mechanize- Python中有状态的程序化Web浏 ...

  2. Python测试 ——开发工具库

    Web UI测试自动化 splinter - web UI测试工具,基于selnium封装. selenium - web UI自动化测试. mechanize- Python中有状态的程序化Web浏 ...

  3. 【转】Python unittest数据驱动工具:DDT

    背景 python 的unittest 没有自带数据驱动功能. 所以如果使用unittest,同时又想使用数据驱动,那么就可以使用DDT来完成. DDT是 “Data-Driven Tests”的缩写 ...

  4. 基于python3在nose测试框架的基础上添加测试数据驱动工具

    [本文出自天外归云的博客园] Python3下一些nose插件经过2to3的转换后失效了 Python的nose测试框架是通过python2编写的,通过pip3install的方式安装的nose和相关 ...

  5. 【webdriver自动化】Python数据驱动工具DDT

    一.Python数据驱动工具ddt 1.  安装 ddt pip install ddt DDT是 “Data-Driven Tests”的缩写 资料:http://ddt.readthedocs.i ...

  6. Python+Selenium+Unittest+Ddt+HTMLReport分布式数据驱动自动化测试框架结构

    1.Business:公共业务模块,如登录模块,可以把登录模块进行封装供调用 ------login_business.py from Page_Object.Common_Page.login_pa ...

  7. python测试框架&&数据生成&&工具最全资源汇总

    xUnit frameworks 单元测试框架frameworks 框架unittest - python自带的单元测试库,开箱即用unittest2 - 加强版的单元测试框架,适用于Python 2 ...

  8. python基础系列教程——Python的安装与测试:python的IDE工具PyDev和pycharm,anaconda

    ---恢复内容开始--- python基础系列教程——Python的安装与测试:python的IDE工具PyDev和pycharm,anaconda 从头开启python的开发环境搭建.安装比较简单, ...

  9. 转载:Python 包管理工具解惑

    Python 包管理工具解惑 本站文章除注明转载外,均为本站原创或者翻译. 本站文章欢迎各种形式的转载,但请18岁以上的转载者注明文章出处,尊重我的劳动,也尊重你的智商: 本站部分原创和翻译文章提供m ...

随机推荐

  1. JavaScript 之 Function

    JavaScript function 语句定义和用法: function 语句用于声明一个函数. 函数声明后,我们可以在需要的时候调用. 在 JavaScript 中,函数是对象,函数也有属性和方法 ...

  2. Class.forName(String className)解析

    功能: Class.forName(xxx.xx.xx)返回的是一个类 Class.forName(xxx.xx.xx)的作用是要求JVM查找并加载指定的类, 也就是说JVM会执行该类的静态代码段 一 ...

  3. MySQL高负载优化

    MySQL配置文件优化 [client] port = #客户端端口号为3306 socket = /data//mysql.sock # default-character-set = utf8 # ...

  4. == 与 equals区别(HashCode方法)

    1:==分析 1.2:基本类型比较 判断基本类型的数值是不是相等 1.3:对象类型比较 判断两个引用是不是指向同一个对象,即内存地址是不是相等. 2:equals分析 来判断对象内容是不是相等,一般有 ...

  5. 计算广告-GD广告

    算法 分配算法主要是解优化问题. 流量预测(traffic forecasting), 流量预估 库存分配, 粗力度的分配. 流量分配, 排单算法 在线分配(Online Allocation) 资料 ...

  6. 吴裕雄--天生自然 JAVASCRIPT开发学习: DOM 事件

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  7. HTML 回到顶部 浮动

    回到顶部 <div id="FloatDIV" style="position: absolute; top: 0px; z-index: 9999; backgr ...

  8. HashMap源码分析(一)

    基于JDK1.7 HashMap源码分析 概述 HashMap是存放键值对的集合,数据结构如下: table被称为桶,大小(capacity)始终为2的幂,当发生扩容时,map容量扩大为两倍 Hash ...

  9. ruoyi BeanUtils

    package com.ruoyi.common.utils.bean; import java.lang.reflect.Method; import java.util.ArrayList; im ...

  10. CodeForces - 1243D. 0-1 MST(补图连通分量个数)

    Ujan has a lot of useless stuff in his drawers, a considerable part of which are his math notebooks: ...