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

文章介绍了如何使用Pytest的`@pytest.mark.parametrize`进行测试用例参数化,包括如何创建基于不同输入和预期输出的测试,如何标记特定测试实例为预期失败(xfail),以及如何组合多个参数化参数来运行所有可能的测试组合。

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 :42
Actual   :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) == expected
E       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 0
PASSED                                    [ 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) == expected
E       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组合参数。

更多技术文章

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值