写点什么

软件测试|Pytest 必会技巧(三)

  • 2023-10-16
    北京
  • 本文字数:2018 字

    阅读完需:约 7 分钟

Pytest 参数化——pytest.mark.parametrize

parametrizing

首先来看一个实现检查一定的输入和期望输出测试功能的典型例子


# content of test_expectation.py
# coding:utf-8
import pytest@pytest.mark.parametrize("test_input,expected", [ ("3+5", 8), ("2+4", 6), ("6 * 9", 42), ])def test_eval(test_input, expected): assert eval(test_input) == expected
if __name__ == "__main__": pytest.main(["-s", "test_demo.py"])
复制代码


运行结果


============================= test session starts =============================collecting ... collected 3 items
test_demo.py::test_eval[3+5-8] test_demo.py::test_eval[2+4-6] test_demo.py::test_eval[6 * 9-42] PASSED [ 33%]PASSED [ 66%]FAILED [100%]test_demo.py:5 (test_eval[6 * 9-42])54 != 42
Expected :42Actual :54<Click to see difference>
test_input = '6 * 9', expected = 42
@pytest.mark.parametrize("test_input,expected", [ ("3+5", 8), ("2+4", 6), ("6 * 9", 42), ]) def test_eval(test_input, expected):> assert eval(test_input) == expectedE assert 54 == 42
test_demo.py:12: AssertionError



========================= 1 failed, 2 passed in 0.04s =========================
复制代码


在这个例子中设计的,只有一条输入/输出值的简单测试功能。和往常一样,函数的参数,你可以在运行结果看到在输入和输出值。

标记单个测试实例参数化

import pytest@pytest.mark.parametrize("test_input,expected", [                        ("3+5", 8),                        ("2+4", 6),                        pytest.param("6 * 9", 42, marks=pytest.mark.xfail),                        ])def test_eval(test_input, expected):    print("-------开始用例------")    assert eval(test_input) == expected
复制代码


运行结果:


============================= test session starts =============================collecting ... collected 3 items
test_demo.py::test_eval[3+5-8] test_demo.py::test_eval[2+4-6] test_demo.py::test_eval[6 * 9-42]
======================== 2 passed, 1 xfailed in 0.06s =========================
Process finished with exit code 0PASSED [ 33%]-------开始用例------PASSED [ 66%]-------开始用例------XFAIL [100%]-------开始用例------
test_input = '6 * 9', expected = 42
@pytest.mark.parametrize("test_input,expected", [ ("3+5", 8), ("2+4", 6), pytest.param("6 * 9", 42, marks=pytest.mark.xfail), ]) def test_eval(test_input, expected): print("-------开始用例------")> assert eval(test_input) == expectedE assert 54 == 42
test_demo.py:10: AssertionError
复制代码


标记为失败的用例,预期结果是失败,实际运行也是失败,显示 xfailed

参数组合

若要获得多个参数化参数的所有组合,可以堆叠参数化装饰器


import pytest@pytest.mark.parametrize("x", [0, 1])@pytest.mark.parametrize("y", [2, 3])def test_foo(x, y):    print("测试数据组合:x->%s, y->%s" % (x, y))

if __name__ == "__main__": pytest.main(["-s", "test_demo.py"])
复制代码


运行结果:


============================= test session starts =============================collecting ... collected 4 items
test_demo.py::test_foo[2-0] PASSED [ 25%]测试数据组合:x->0, y->2
test_demo.py::test_foo[2-1] PASSED [ 50%]测试数据组合:x->1, y->2
test_demo.py::test_foo[3-0] PASSED [ 75%]测试数据组合:x->0, y->3
test_demo.py::test_foo[3-1] PASSED [100%]测试数据组合:x->1, y->3

============================== 4 passed in 0.03s ==============================
复制代码


这将运行测试,参数设置为 x=0/y=2,x=1/y=2,x=0/y=3,x=1/y=3 组合参数。


获取更多技术资料,请点击!

用户头像

社区:ceshiren.com 微信:ceshiren2021 2019-10-23 加入

微信公众号:霍格沃兹测试开发 提供性能测试、自动化测试、测试开发等资料,实时更新一线互联网大厂测试岗位内推需求,共享测试行业动态及资讯,更可零距离接触众多业内大佬。

评论

发布
暂无评论
软件测试|Pytest必会技巧(三)_霍格沃兹测试开发学社_InfoQ写作社区