zoukankan      html  css  js  c++  java
  • pytest:参数化用例

    一、如果待测试的输入和输出是一组数据,可以把测试数据组织起来用不同的测试数据调用相同的测试方法。参数化顾名思义就是把不同的参数,写到一个集合里,然后程序会自动取值运行用例,直到集合为空便结束。pytest中可以使用@pytest.mark.parametrize来参数化。

    使用parametrize实现参数化

    parametrize()方法源码:

    def  parametrize(self,argnames,argvalues,indirect=False,ids=None,scope=None)

    主要参数说明

    ----argsnames:参数名 是个字符串如中间用逗号分隔则表示为多个参数名

    ----argvalues:参数值  参数组成的列表 列表中的几个元素就会生成几条用例

    使用方法:

    ---使用 @pytest.mark.paramtrize()装饰器测试方法

    ----parametrize('data',param)中的 data是自定义的参数名,param是引入的参数列表

    ----将自定义的参数名data作为参数传给测试用例test_func

    ---然后就可以在测试用例内部使用data的参数了

    创建测试用例,传入三组参数,每组两个元素,判断每组参数里面表达式和值是否相等代码如下:

    #!/usr/bin/env python
    # _*_coding: utf-8 _*_
    
    import pytest
    
    
    @pytest.mark.parametrize("test_input,expected", [("3+5", 8), ("2 + 5", 7), ("7 * 5", 30)])
    def test_eval(test_input, expected):
        assert eval(test_input) == expected

    运行结果:

    Testing started at 15:17 ...
    C:Pythonpython.exe "C:Program FilesJetBrainsPyCharm Community Edition 2019.1helperspycharm\_jb_pytest_runner.py" --target test_parametrize1.py::test_eval
    Launching pytest with arguments test_parametrize1.py::test_eval in C:UserswanwenPycharmProjectsvigoxuexi20210123
    ============================= test session starts =============================
    platform win32 -- Python 3.8.0, pytest-5.4.3, py-1.9.0, pluggy-0.13.1
    rootdir: C:UserswanwenPycharmProjectsvigoxuexi20210123
    plugins: html-2.1.1, metadata-1.11.0, ordering-0.6collected 3 items
    
    test_parametrize1.py ..F
    test_parametrize1.py:6 (test_eval[7 * 5-30])
    35 != 30
    
    Expected :30
    Actual   :35
    <Click to see difference>
    
    test_input = '7 * 5', expected = 30
    
        @pytest.mark.parametrize("test_input,expected", [("3+5", 8), ("2 + 5", 7), ("7 * 5", 30)])
        def test_eval(test_input, expected):
    >       assert eval(test_input) == expected
    E       AssertionError: assert 35 == 30
    E        +  where 35 = eval('7 * 5')
    
    test_parametrize1.py:9: AssertionError
    
    Assertion failed
                                                     [100%]
    
    ================================== FAILURES ===================================
    _____________________________ test_eval[7 * 5-30] _____________________________
    
    test_input = '7 * 5', expected = 30
    
        @pytest.mark.parametrize("test_input,expected", [("3+5", 8), ("2 + 5", 7), ("7 * 5", 30)])
        def test_eval(test_input, expected):
    >       assert eval(test_input) == expected
    E       AssertionError: assert 35 == 30
    E        +  where 35 = eval('7 * 5')
    
    test_parametrize1.py:9: AssertionError
    =========================== short test summary info ===========================
    FAILED test_parametrize1.py::test_eval[7 * 5-30] - AssertionError: assert 35 ...
    ========================= 1 failed, 2 passed in 0.12s =========================
    
    Process finished with exit code 0
    
    Assertion failed
    
    Assertion failed

    整个执行过程中,pytest将参数列表

    [("3+5", 8), ("2 + 5", 7), ("7 * 5", 30)]中的三组数据取出来,每组数据生成一条测试用例,并且将每组数据中的两个元素分别赋值到方法中,
    作为测试方法的参数有测试用例使用

    二、多次使用parametrize
    同一个测试用例还可以同时添加多个@pytest.mark.parametrize装饰器,多个
    parametrize的所有元素互相组合(类似笛卡尔积)生成大量的测试用例
    场景:比如登入场景,用户输入情况有n种,密码的输入情况有M种希望验证用户名和密码就会涉及到n*m种组合的测试用例,
    如果把这些数据一一列出来工作量也是非常大的。pytest提供了一种参数化方式
    将多组测试数据组合生成大量的测试用例
    实例代码如下:
    #!/usr/bin/env python
    # _*_coding: utf-8 _*_
    import pytest
    
    
    @pytest.mark.parametrize("x", [1, 2])
    @pytest.mark.parametrize("y", [8, 10, 11])
    def test_foo(x, y):
        print(f"测试数据组合x:{x},y:{y}")

    运行结果:

    Testing started at 15:31 ...
    C:Pythonpython.exe "C:Program FilesJetBrainsPyCharm Community Edition 2019.1helperspycharm\_jb_pytest_runner.py" --target test_parametrize2.py::test_foo
    Launching pytest with arguments test_parametrize2.py::test_foo in C:UserswanwenPycharmProjectsvigoxuexi20210123
    ============================= test session starts =============================
    platform win32 -- Python 3.8.0, pytest-5.4.3, py-1.9.0, pluggy-0.13.1
    rootdir: C:UserswanwenPycharmProjectsvigoxuexi20210123
    plugins: html-2.1.1, metadata-1.11.0, ordering-0.6collected 6 items
    
    test_parametrize2.py                                               [100%]
    
    ============================== 6 passed in 0.04s ==============================
    
    Process finished with exit code 0
    .测试数据组合x:1,y:8
    .测试数据组合x:2,y:8
    .测试数据组合x:1,y:10
    .测试数据组合x:2,y:10
    .测试数据组合x:1,y:11
    .测试数据组合x:2,y:11

    分析如上运行结果,测试方法test_foo()添加了两个@pytest.mark.parametrize()装饰器,两个装饰器分别提供两个参数值得列表,2*3=6种结合,pytest便会生成6条

    测试用例。在测试中使用这种参数自由组合,可以实现全面测.

    三、@pytest.fixture 与 @pytest.mark.parametrize结合实现参数化

    parametrize源码:

    def  parametrize(self,argnames,argvalues,indirect=False,ids=None,scope=None):

    indirect参数设置为true,pytest会把argnames当做函数去执行,将argvalues作为参数传入到argnames这个函数里

    实例代码如下:

    #!/usr/bin/env python
    # _*_coding: utf-8 _*_
    import pytest
    
    test_user_data = ['Tome', 'Jerry']
    
    
    @pytest.fixture(scope="module")
    def login_r(request):
        user = request.param
        print(f"
     登入用户:{user}")
        return user
    
    
    @pytest.mark.parametrize("login_r", test_user_data, indirect=True)
    def test_login(login_r):
        a = login_r
        print(f"测试用例中login的返回值:{a}")
        assert a != ""

    运行结果如下:

    Testing started at 15:53 ...
    C:Pythonpython.exe "C:Program FilesJetBrainsPyCharm Community Edition 2019.1helperspycharm\_jb_pytest_runner.py" --path C:/Users/wanwen/PycharmProjects/vigo/xuexi/20210123/test_parametrize3.py
    Launching pytest with arguments C:/Users/wanwen/PycharmProjects/vigo/xuexi/20210123/test_parametrize3.py in C:UserswanwenPycharmProjectsvigoxuexi20210123
    ============================= test session starts =============================
    platform win32 -- Python 3.8.0, pytest-5.4.3, py-1.9.0, pluggy-0.13.1
    rootdir: C:UserswanwenPycharmProjectsvigoxuexi20210123
    plugins: html-2.1.1, metadata-1.11.0, ordering-0.6collected 2 items
    
    test_parametrize3.py                                                   [100%]
    
    ============================== 2 passed in 0.03s ==============================
    
    Process finished with exit code 0

    上面的结果可以看出,当indirect=True时,会将login_r作为参数,test_user_data被当作参数传入到login_r方法中生成多条测试用例,通过return将结果返回,当调用login_r可以获取到login_r这个方法的返回数据。

    
    
  • 相关阅读:
    阿里云观察——阿里云总裁王坚专访
    追寻凌云梦——对话阿里云总裁王坚
    四维的王坚和三维的阿里互联网汽车
    [2011移动者开发大会]王坚:互联网最革命的事是所有事情从离线到在线
    2013年8月,阿里云飞天5K集群成功上线,所有的服务对应的都是同一个系统内核、同一套分布式文件系统
    [搜索引擎大会]谷歌CEO Eric Schmit第一次高调用云和云计算的概念来描述谷歌所提供的互联网服务
    热门搜索引擎的TOP-K算法的python实现(回溯算法遍历trie树)
    海量日志数据提取出访问次数最多的那个IP python实现 总结
    Web数据挖掘 第十二章 Web使用挖掘的读书笔记
    Web数据挖掘 第十一章 观点挖掘和情感分析的读书笔记
  • 原文地址:https://www.cnblogs.com/vigo01/p/14340233.html
Copyright © 2011-2022 走看看