如果我们事先知道测试函数会执行失败,但又不想直接跳过,而是希望显示的提示。
Pytest 使用 pytest.mark.xfail
实现预见错误功能:
# test_xfail.py @pytest.mark.xfail(gen.__version__ < '0.2.0', reason='not supported until v0.2.0') def test_api(): id_1 = gen.unique_id() id_2 = gen.unique_id() assert id_1 != id_2
执行结果:
$ pytest tests/test-function/test_xfail.py ============================= test session starts ============================= platform win32 -- Python 3.6.4, pytest-3.6.1, py-1.5.2, pluggy-0.6.0 rootdir: F:\self-repo\learning-pytest, inifile: collected 1 item tests\test-function\test_xfail.py x [100%] ========================== 1 xfailed in 0.12 seconds ==========================
pytest 使用 x
表示预见的失败(XFAIL
)。
如果预见的是失败,但实际运行测试却成功通过,pytest 使用 X
进行标记(XPASS
)。
参数化
当对一个测试函数进行测试时,通常会给函数传递多组参数。比如测试账号登陆,我们需要模拟各种千奇百怪的账号密码。
当然,我们可以把这些参数写在测试函数内部进行遍历。不过虽然参数众多,但仍然是一个测试,当某组参数导致断言失败,测试也就终止了。
通过异常捕获,我们可以保证程所有参数完整执行,但要分析测试结果就需要做不少额外的工作。
在 pytest 中,我们有更好的解决方法,就是参数化测试,即每组参数都独立执行一次测试。使用的工具就是 pytest.mark.parametrize(argnames, argvalues)
。
这里是一个密码长度的测试函数,其中参数名为 passwd
,其可选列表包含三个值:
# test_parametrize.py @pytest.mark.parametrize('passwd', ['123456', 'abcdefdfs', 'as52345fasdf4']) def test_passwd_length(passwd): assert len(passwd) >= 8
运行可知执行了三次测试:
$ pytest tests/test-function/test_parametrize.py ============================= test session starts ============================= platform win32 -- Python 3.6.4, pytest-3.6.1, py-1.5.2, pluggy-0.6.0 rootdir: F:\self-repo\learning-pytest, inifile: collected 3 items tests\test-function\test_parametrize.py F.. [100%] ================================== FAILURES ===================================
详情见:learning-pytest