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 

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

     
  • 相关阅读:
    redis 基本指令
    php 魔术变量
    php 常用函数总结
    linux 命令——3 pwd (转)
    linux 命令——2 cd (转)
    linux 命令——ls
    ffmeg过滤器介绍[转]
    最简单的基于FFMPEG的转码程序 —— 分析
    ffmpga结构体和常用函数(总结)
    leetcode--3
  • 原文地址:https://www.cnblogs.com/zengxuejie/p/13673200.html
Copyright © 2011-2022 走看看