ddt

Python 中如何实现参数化测试?

旧时模样 提交于 2019-12-09 22:34:25
之前,我曾转过一个单元测试框架系列的文章,里面介绍了 unittest、nose/nose2 与 pytest 这三个最受人欢迎的 Python 测试框架。 本文想针对测试中一种很常见的测试场景,即参数化测试,继续聊聊关于测试的话题,并尝试将这几个测试框架串联起来,做一个横向的比对,加深理解。 1、什么是参数化测试? 对于普通测试来说,一个测试方法只需要运行一遍,而参数化测试对于一个测试方法,可能需要传入一系列参数,然后进行多次测试。 比如,我们要测试某个系统的登录功能,就可能要分别传入不同的用户名与密码,进行测试:使用包含非法字符的用户名、使用未注册的用户名、使用超长的用户名、使用错误的密码、使用合理的数据等等。 参数化测试是一种“数据驱动测试”(Data-Driven Test),在同一个方法上测试不同的参数,以覆盖所有可能的预期分支的结果。它的测试数据可以与测试行为分离,被放入文件、数据库或者外部介质中,再由测试程序读取。 2、参数化测试的实现思路? 通常而言,一个测试方法就是一个最小的测试单元,其功能应该尽量地原子化和单一化。 先来看看两种实现参数化测试的思路:一种是写一个测试方法,在其内部对所有测试参数进行遍历;另一种是在测试方法之外写遍历参数的逻辑,然后依次调用该测试方法。 这两种思路都能达到测试目的,在简单业务中,没有毛病。然而,实际上它们都只有一个测试单元

python之ddt模式随记二

旧时模样 提交于 2019-12-09 19:04:02
前言:之前记录了一次ddt模式的简单使用,这次再介绍一下ddt的多数据使用。 需求:有的时候你需要用到的数据是一个整体的可迭代数据,而你每条用例里面只需要这个数据中的一个数据。这时ddt也可以解决。 比如你有{"a":1,"b":2,"c":3},这些数据是你从各个地方读取到的,然后你要用这个给ddt去传值,但是你想执行3次,每次依次传值。 废话不多说,直接上代码 import ddt,unittest dict1 = {"a":1,"b":2,"c":3} list1 = [1,2,3,"a",{"b":"1"}] tuple1 = (1,2,3,4,"a") @ddt.ddt class Test(unittest.TestCase): ## 直接传入 @ddt.data(dict1) def test(self,d1): print(d1) @ddt.data(list1) def test1(self,l1): print(l1) @ddt.data(tuple1) def test2(self,t1): print(t1) if __name__ == '__main__': unittest.main() 上面的代码就是直接把整个的参数全部推进去了。但是现在是需要各个参数里面每个值作为一次参数去执行一下,前面学习过多次执行的方法,如下 import ddt

python -- unittest测试用例函数无法传参的处理方法(ddt)

馋奶兔 提交于 2019-12-06 10:57:51
1、超继承   重写测试用例类的init方法,如下所示。 import requests import unittest class XiaoheiCases(unittest.TestCase): def __init__(self,methodName,url,data,cookies=None): super(XiaoheiCases,self).__init__(methodName) self.url = url self.data = data self.cookies = cookies 2、ddt模块 ''' ddt结合unittest来进行数据处理的第三方库,很强大 安装pip install ddt ddt需要和unittest或pytest结合使用 ''' from ddt import ddt,data,unpack import unittest test_print = [1,3] test_b = [[1,2,3],[4,5,6]] @ddt #装饰测试类 class TestMath(unittest.TestCase): @data(test_print) #装饰测试函数,通过这种方式传参,如果通过*test_data传参,则有几个参数,执行几次测试用例 def test_print(self,item): print('item:{0}'

自动化测试中的数据驱动和关键字驱动

笑着哭i 提交于 2019-12-05 08:39:09
a.数据驱动:从某个数据文件(odbc,csv,excel,txt)中读取输入输出的测试数据,然后通过变量传入手动测试脚本中,通过这些数据来验证测试数据 程序和数据分离,测试数据存放到一个文件中,脚本是另外一个文件 b.关键字驱动:从面向对象角度出发,同样业务逻辑编写成一个类或者函数作为关键字被不同的脚本调用 每个步骤对应文件中一行内容 c.DDT:官网参考:https://ddt.readthedocs.io/en/latest/ Data-Driven Tests缩写 包含类的装饰器ddt和两个方法装饰器: data 直接输入数据 file_data 从文件中获取测试的数据 ddt.data 装饰测试的方法,参数是一系列的值 ddt.file_data 装饰测试方法,参数是文件名 ddt.unpack 传递的是复杂数据结构时候,比如元组字典,添加unpack之后,ddt会自动把元素或者列表对应到各个参数上 使用前必须安装好ddt模块:pip install ddt 来源: https://www.cnblogs.com/yuxiaofeng/p/11915647.html

selenium ddt调试单个用例时报 AttributeError: type object ... has no attribute

只愿长相守 提交于 2019-12-04 22:02:55
使用ddt做数据驱动,调试单个用例时,遇到报错:AttributeError: type object ..., 一脸懵逼,不用ddt运行时好好的,用到ddt报错 Error Traceback (most recent call last): File "C:\Python37\lib\unittest\case.py", line 59, in testPartExecutor yield File "C:\Python37\lib\unittest\case.py", line 615, in run testMethod() File "C:\Python37\lib\unittest\loader.py", line 34, in testFailure raise self._exception File "C:\Python37\lib\unittest\loader.py", line 169, in loadTestsFromName parent, obj = obj, getattr(obj, part) AttributeError: type object 'test_aaa' has no attribute 'test_j_xxx' 网上找了一圈,没有找到具体的解决办法。 目前想的是通过@unittest.skip(u"无条件跳过此用例")

ddt-数据驱动

匿名 (未验证) 提交于 2019-12-03 00:38:01
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): print(first, second, third) self

修改ddt源码,测试报告用例名称更加准确

匿名 (未验证) 提交于 2019-12-03 00:17:01
一般不允许直接修改源码: 一旦修改完之后,其他项目需要用到这个源码时比较麻烦 可以把源码放到当前文件夹下面进行修改 ddt源码中―― mk_test_name――def mk_test_name(name, value, index=0) def mk_test_name(name, value, index=0): # Add zeros before index to keep order index = "{0:0{1}}".format(index + 1, index_len) # 之前的源码 # if not is_trivial(value): # return "{0}_{1}".format(name, index) # 修改,拼接上用例标题title # 添加对字典数据的处理 # not isinstance(value,dict) ――――value不是字典类型 if not is_trivial(value) and not isinstance(value,dict): return "{0}_{1}".format(name, index) # 拼接索引和名字 # 如果数据是字典,刚获取字典当中的excel中title对应的值,添加到测试用例名称中。 if isinstance(value,dict): try: value = value['title

ddt学习笔记

匿名 (未验证) 提交于 2019-12-02 23:47:01
ddt安装Pip install ddtddt的使用导入from ddt import ddt,data,file_data说明:@data(a,b)表示a和b各运行一次用例@data([a,d],[c,d])如果没有unpack,那么[a,b]当成一个参数传入用例运行如果有unpack,那么[a,b]被分解开,按照用例中的两个参数传递@file_data(filename)对于json的文件,每一个json元素按照一个用例运行,可以依照python分解元组,列表或者字典的方式分解传入支持yaml例子import unittestfrom ddt import ddt,data,file_data,unpack@ddtclass demotest(unittest.TestCase): def setup(self): print "this is the setup" @data(2,3) def testb(self,value): print value print "this is test b" @data([2,3],[4,5]) def testa(self,value): print value print "this is test a" @data([2, 3], [4, 5]) @unpack def testc(self, first,second):

Selenium3+Python3_15:数据驱动ddt+excel

匿名 (未验证) 提交于 2019-12-02 22:51:30
安装ddt:pip install ddt 安装xlrd:pip install xlrd 数据驱动的基本思路: 1.import ddt 2.从excel读取测试数据,给到变量名,如testdata (可封装readexcel.py,调用其以读取数据) 读取数据: 不在同一个文件夹下,需要用os.path获取userinfo.xlsx的路径,传参ExcelUtil(path) dd = ExcelUtil("userinfo.xlsx", sheetName="Sheet1") d= dd.dict_data() print(d) 3.类名前边加上:@ddt.ddt 4.测试用例前边加上:@ddt.data(*testdata)

Python之数据驱动ddt

本小妞迷上赌 提交于 2019-12-01 12:26:01
一、背景 一般进行接口测试时,每个接口的传参都不止一种情况,一般会考虑正向、逆向等多种组合,所以在测试一个接口时,通常会编写多条case,而这些除了传参不同外,并没有什么区别。这个时候就可以利用ddt来管理测试数据,提高代码复用率。 二、ddt安装 ddt是python的第三方库,安装可以进行命令安装,或者通过pycharm界面中settings进行安装。 三、ddt模块组成 1、ddt模块包含类的装饰器ddt和两个方法装饰器data ddt.ddt:装饰类,也就是继承TestCase的类。 ddt.data:装饰测试方法,参数是一系列的值。 ddt.file_data:装饰测试方法,参数是文件名。文件可以是json或者yaml类型。 注意,如果文件是以“.yml”或者".yaml"结尾,ddt会作为yaml类型处理,其他文件都会作为json文件处理。 如果文件是列表,列表的值会作为测试用例参数,同时,会作为测试用例方法名后缀显示。 如果文件是字典,字典的key会作为测试用例方法的后缀显示,字典的value会作为测试用例参数。 ddt.unpack:传递的是复杂的数据结构时使用,比如使用列表或者元组, 添加unpack后,ddt会自动把元组或者列表对应到多个参数上。 四、示例 来源: https://www.cnblogs.com/tianpin/p/11685484.html