关于unittest中的ddt、pytest中的@pytest.mark.parametrize

测试一个接口时通常会编写多条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"])

 

posted @ 2021-03-11 19:12  whitewall  阅读(425)  评论(0)    收藏  举报