pytest fixture-按fixture实例自动分组测试
2022-03-18 14:22 更新
Pytest将测试运行期间活动fixture
的数量最小化。如果您有一个参数化的fixture
,那么使用它的所有测试将首先与一个实例一起执行,然后在创建下一个fixture
实例之前调用终结器。除此之外,这简化了对创建和使用全局状态的应用程序的测试。
下面的例子使用了两个参数化的fixture
,其中一个的作用域是基于每个模块的,所有的函数都执行print调用来显示设置/拆卸流程:
# content of test_module.py
import pytest
@pytest.fixture(scope="module", params=["mod1", "mod2"])
def modarg(request):
param = request.param
print(" SETUP modarg", param)
yield param
print(" TEARDOWN modarg", param)
@pytest.fixture(scope="function", params=[1, 2])
def otherarg(request):
param = request.param
print(" SETUP otherarg", param)
yield param
print(" TEARDOWN otherarg", param)
def test_0(otherarg):
print(" RUN test0 with otherarg", otherarg)
def test_1(modarg):
print(" RUN test1 with modarg", modarg)
def test_2(otherarg, modarg):
print(" RUN test2 with otherarg {} and modarg {}".format(otherarg, modarg))
让我们以详细模式运行测试,并查看打印输出:
$ pytest -v -s test_module.py
=========================== test session starts ============================
platform linux -- Python 3.x.y, pytest-7.x.y, pluggy-1.x.y -- $PYTHON_PREFIX/bin/python
cachedir: .pytest_cache
rootdir: /home/sweet/project
collecting ... collected 8 items
test_module.py::test_0[1] SETUP otherarg 1
RUN test0 with otherarg 1
PASSED TEARDOWN otherarg 1
test_module.py::test_0[2] SETUP otherarg 2
RUN test0 with otherarg 2
PASSED TEARDOWN otherarg 2
test_module.py::test_1[mod1] SETUP modarg mod1
RUN test1 with modarg mod1
PASSED
test_module.py::test_2[mod1-1] SETUP otherarg 1
RUN test2 with otherarg 1 and modarg mod1
PASSED TEARDOWN otherarg 1
test_module.py::test_2[mod1-2] SETUP otherarg 2
RUN test2 with otherarg 2 and modarg mod1
PASSED TEARDOWN otherarg 2
test_module.py::test_1[mod2] TEARDOWN modarg mod1
SETUP modarg mod2
RUN test1 with modarg mod2
PASSED
test_module.py::test_2[mod2-1] SETUP otherarg 1
RUN test2 with otherarg 1 and modarg mod2
PASSED TEARDOWN otherarg 1
test_module.py::test_2[mod2-2] SETUP otherarg 2
RUN test2 with otherarg 2 and modarg mod2
PASSED TEARDOWN otherarg 2
TEARDOWN modarg mod2
============================ 8 passed in 0.12s =============================
您可以看到,参数化的模块范围的modarg
资源导致了测试执行的顺序,从而导致了尽可能少的活动资源。mod1参数化资源的终结器在mod2资源设置之前执行。
特别要注意test_0
是完全独立的,并且是第一个完成的。然后用mod1执行test_1
,用mod1执行test_2
,用mod2执行test_1
,最后用mod2执行test_2
。
其他参数化的资源(具有函数作用域)在每次使用它的测试之前设置,然后在测试之后删除。
以上内容是否对您有帮助:
更多建议: