• 关于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"])
    测试进阶轨迹
  • 相关阅读:
    word 改造成html表单
    ceshi
    easyUI 多功能datagrid 用户控件
    easyUI 多功能datagrid
    实现easyUI+.net 商品管理的用户控件
    通过sql 实现简单分页(not in)
    Jquery 插件开发
    Hello Swift
    关于const_cast转换
    undefined reference to '__android_log_print'.
  • 原文地址:https://www.cnblogs.com/yinwenbin/p/14519933.html
Copyright © 2020-2023  润新知