如何仅将 conftest.py 中的夹具应用到内部文件夹

How to apply fixture from conftest.py to inner folders only

我有一个固定装置位于 conftest.py。

@pytest.fixture(scope='module', autouse=True) 
def my_fixture():
    """
    Some useful code
    """

结构如下:

tests
 |
 |--first_folder
 |   |--__init__.py
 |   |--test_first_1.py
 |   |--test_first_2.py
 |   
 |--second_folder
 |   |--__init__.py
 |   |--test_second_1.py
 |
 |--__init__.py   
 |--conftest.py
 |--test_common_1.py

我希望仅在 内部文件夹 测试脚本中自动使用该夹具:在 test_first_1.pytest_first_2.py, test_second_1.py, 但不在 test_common_1.py.

我可以在每个内部文件夹中使用该夹具创建 conftest,但我不想复制代码

有没有什么方法可以将 conftest 中的 fixture 应用于内部文件夹中的测试脚本,并在公共文件夹测试脚本中忽略它?

您可以通过将文件夹 'first folder' 和 'second folder' 移动到新文件夹并在该新文件夹中有一个 conftest.py 文件来实现此目的。像这样-

tests
 |
 |--new folder
 |  |--first_folder
 |  |  |--__init__.py
 |  |  |--test_first_1.py
 |  |  |--test_first_2.py
 |  |
 |  |--second_folder
 |  |  |--__init__.py
 |  |  |--test_second_1.py
 |  |--conftest.py
 |
 |--__init__.py   
 |--conftest.py
 |--test_common_1.py

一个可能的解决方案,如果你不想改变你的文件夹的结构,你可以在你的夹具中使用 request 对象来检查测试中使用的标记,所以你可以做任何事情如果设置了特定标记:

@pytest.fixture(scope='module', autouse=True) 
def my_fixture(request):
    """
    Some useful code
    """
    if 'noautofixt' in request.keywords:
        return
    # more code

然后按如下方式标记您的测试:

@pytest.mark.noautofixt
def test_no_running_my_fixture():
    pass

@lmiguelvargasf (+1) 指出了正确的方向并使用 request 我解决了如下问题:

@pytest.fixture(scope='module', autouse=True)
def my_fixture(request):
    if request.config.invocation_dir.basename != 'tests':
        """
        Some useful code
        """

由于 调用文件夹名称不等于 'tests'

,因此此固定装置将仅应用于内部文件夹中的测试脚本