Pytest:为整个测试制作全局夹具 运行

Pytest: making global fixture for entire test run

我有以下模块结构:

.
├── conftest.py
└── test
    ├── test_one.py
    └── test_two.py

我的 conftest.py 包含一个夹具:

import pytest

@pytest.fixture(scope='session')
def sophisticated_fixture():
    print('\nFixture init')
    yield 42
    print('\nFixture kill')

我的 test_{one,two}.py 测试是这样的:

from conftest import sophisticated_fixture


def test_a(sophisticated_fixture):
    assert sophisticated_fixture == 42


def test_b(sophisticated_fixture):
    assert sophisticated_fixture == 42

我希望顶级目录中的 运行ning pytest -s 将 运行 所有测试都使用相同的夹具,因为我已将其定义为会话级。然而,这发生了:

============================= test session starts ==============================
platform linux -- Python 3.6.6, pytest-4.0.2, py-1.7.0, pluggy-0.8.0
rootdir: /home/tomasz/example, inifile:
collected 4 items

test/test_one.py 
Fixture init
..
test/test_two.py 
Fixture init
..
Fixture kill

Fixture kill


=========================== 4 passed in 0.01 seconds ===========================

很明显,每个测试模块都会调用 fixture 函数两次,并且 fixture 在测试结束时退出 运行。

如何在整个测试会话期间使我的夹具全局化?

您不必在测试文件中导入夹具。 fixtures 由 pytest 自动发现。从测试文件中删除以下行后尝试。

from conftest import sophisticated_fixture