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

    前言

    在真正测试时,我们时常需要用到不同的参数进行传参,如何实现呢?pytest框架 @pytest.mark.parametrize  的方法可以很轻松实现。

    @pytest.mark.parametrize

      应用场景:比如测试登录场景的时候,需要输入不同的测试账号和测试密码,实际上我们不可能写若干个测试用例去测试登录,最好是保持用例不变只变参数,

    该方法就是实现这种场景的最佳选择。

    1 #测试demo
    2 # content of test_expectation.py
    3 import pytest
    4 #test_input,expected 就是后面对应的参数
    5 @pytest.mark.parametrize("test_input,expected", [("3+5", 8), ("2+4", 6), ("6*9", 42)]) 
    6 def test_eval(test_input, expected):
    7   assert eval(test_input) == expected

    运行结果:

     1 $ pytest
     2 =========================== test session starts ============================
     3 platform linux -- Python 3.x.y, pytest-6.x.y, py-1.x.y, pluggy-0.x.y
     4 cachedir: $PYTHON_PREFIX/.pytest_cache
     5 rootdir: $REGENDOC_TMPDIR
     6 collected 3 items
     7 
     8 test_expectation.py ..F                                              [100%]
     9 
    10 ================================= FAILURES =================================
    11 ____________________________ test_eval[6*9-42] _____________________________
    12 
    13 test_input = '6*9', expected = 42
    14 
    15     @pytest.mark.parametrize("test_input,expected", [("3+5", 8), ("2+4", 6), ("6*9", 42)])
    16     def test_eval(test_input, expected):
    17 >       assert eval(test_input) == expected
    18 E       AssertionError: assert 54 == 42
    19 E        +  where 54 = eval('6*9')
    20 
    21 test_expectation.py:6: AssertionError
    22 ========================= short test summary info ==========================
    23 FAILED test_expectation.py::test_eval[6*9-42] - AssertionError: assert 54...
    24 ======================= 1 failed, 2 passed in 0.12s ========================

    pytest.mark.xfail

      表示将该用例标记成xfail失败,并且该用例中的后续代码不会执行。一般这种场景可以用于已经知道此条用例会失败,或者功能未实现
    这样可以避免代码重复运行,提高效率。
     1 # content of test_expectation.py
     2 import pytest
     3 
     4 
     5 @pytest.mark.parametrize(
     6     "test_input,expected",
     7     [("3+5", 8), ("2+4", 6), pytest.param("6*9", 42, marks=pytest.mark.xfail)],
     8 )
     9 def test_eval(test_input, expected):
    10     assert eval(test_input) == expected

    运行结果:

     1 $ pytest
     2 =========================== test session starts ============================
     3 platform linux -- Python 3.x.y, pytest-6.x.y, py-1.x.y, pluggy-0.x.y
     4 cachedir: $PYTHON_PREFIX/.pytest_cache
     5 rootdir: $REGENDOC_TMPDIR
     6 collected 3 items
     7 
     8 test_expectation.py ..x                                              [100%]
     9 
    10 ======================= 2 passed, 1 xfailed in 0.12s =======================

    两组参数时,就可以组成排列组合的几种结果, x=0/y=2x=1/y=2x=0/y=3, and x=1/y=3 四种情况。

    1 import pytest
    2 
    3 
    4 @pytest.mark.parametrize("x", [0, 1])
    5 @pytest.mark.parametrize("y", [2, 3])
    6 def test_foo(x, y):
    7     pass

    运行结果:

    collecting ... collected 4 items
    
    testdemo.py::test_foo[2-0] 
    testdemo.py::test_foo[2-1] 
    testdemo.py::test_foo[3-0] 
    testdemo.py::test_foo[3-1] 
    
    ============================== 4 passed in 0.06s ==============================
    
    Process finished with exit code 0
    PASSED                                        [ 25%]PASSED 

    关注个人公众号:测试开发进阶之路

     
  • 相关阅读:
    Leetcode 238. Product of Array Except Self
    Leetcode 103. Binary Tree Zigzag Level Order Traversal
    Leetcode 290. Word Pattern
    Leetcode 205. Isomorphic Strings
    Leetcode 107. Binary Tree Level Order Traversal II
    Leetcode 102. Binary Tree Level Order Traversal
    三目运算符
    简单判断案例— 分支结构的应用
    用switch判断月份的练习
    java基本打印练习《我行我素购物系统》
  • 原文地址:https://www.cnblogs.com/zengxuejie/p/13673200.html
Copyright © 2011-2022 走看看