测试一个接口时通常会编写多条case,而这些case除了传参不同外,其实并没什么区别。这个时候就可以利用ddt来管理测试数据,提高代码复用率;
我18年所在公司的接口自动化项目,是用Excel维护的用例,然后代码中一个test对应一个用例。实际上组里的成员都是自学水平,但也算把unittest自动化也用起来了。现在想想,那时的水平都是半桶水啊。
19年我进了华住酒店集团的pms项目,当时候招我的原因仅仅是因为自动化的kpi,且pms项目当时是纯业务测试。当时候我是打算用pytest的,作为unittest的扩展框架,pytest的功能更加丰富;但是上面的领导要求用nose框架,因为其他有几个项目的自动化是nose,为了方便管理,要求科技部门下的项目自动化都使用nose框架。后面我参考了测试开发组给的示例,把项目的自动化给搭起来的,但是并没有用exce或者json或者db的方式维护用例,而是在test里面直接set接口类里面的示例请求参数。之所以这么维护用例,也是参考其他项目。
今天看了下以前自学自动化ddt部分,其实用excel维护用例也挺好的,示例+set的方式都在写在excel里面,这样不用每个用例都写一个完整的入参,excel维护用例就比较方便。但是这样的话ddt的意义就不大了,如果是出入参的数据都比较少,ddt就比较适合了。
一、unittest中的ddt
from ddt import ddt, data, unpack import unittest data1 = [{"k1": "v1", "k11": "v11"}, {"k1": "v2", "k11": "v22"}] @ddt class Test(unittest.TestCase): @data(*data1) def test_ddt1(self, data): print(data) # {'k1': 'v1', 'k11': 'v11'} # {'k2': 'v2', 'k22': 'v22'} @data(*data1) @unpack # 参数名和个数必须和实际的key相同 def test_ddt2(self, k1, k11): print(k1, k11) # v1 v11 # v2 v12 @data([3, 2, 1], [5, 3, 2]) @unpack # @unpack,那么[3,2,1]被分解开,按照用例中的三个参数传递 def test_ddt3(self, a, b, c): print(a, b, c) # 3 2 1 # 5 3 2 @data([2, 3], [4, 5]) # 没有@unpack,那么[2,3]当成一个参数传入用例运行 def test_ddt4(self, a, b): print(a, b) # TypeError: test_compare() missing 1 required positional argument: 'b' if __name__ == "__main__": unittest.main()
二、pytest中的@pytest.mark.parametrize
发现没有上面的unpack,以及上面test_ddt2的用法
import pytest list_1 = [(1, 3), (10, 35)] @pytest.mark.parametrize("a", list_1) def test_add1(a): print(a) # (1, 3) # (10, 35) @pytest.mark.parametrize("a,b", list_1) def test_add2(a, b): # 参数要保持一致 参数和列表里的也要保持一致 print(a, b) # 1 3 # 10 35 @pytest.mark.parametrize("a", [1, 2]) @pytest.mark.parametrize("b", [1, 2]) def test_add3(a, b): print(a * b) # 1 # 2 # 2 # 4 if __name__ == "__main__": pytest.main(["-v", "-s", "demo2.py"])