将conftest.py文件拆分为几个较小的类似conftest的部分

时间:2014-11-21 14:48:55

标签: python pytest

我有一个大的conftest.py文件,我希望将其分成更小的部分,原因有两个:

  1. 文件非常大(约1000行,包括文档)
  2. 有些灯具依赖于其他灯具,当用户寻找相关灯具时,我没有理由将其他灯具作为conftest“API”的一部分曝光
  3. 我不知道pytest提供了解决同一文件夹中多个位置的conftest文件的任何机制,所以我设计了一个,如下:

    import sys
    import os
    
    
    sys.path.append(os.path.dirname(__file__))
    
    
    from _conftest_private_part_1 import *
    from _conftest_private_part_2 import *
    from _conftest_private_part_3 import *
    
    
    @pytest.fixture
    def a_fixture_that_is_part_of_the_public_conftest_api():
        pass
    

    这适合我的需要,但我确实想知道是否有更好的方法。

4 个答案:

答案 0 :(得分:20)

您可以将您的资料放入其他模块,并使用pytest_plugins中的conftest.py变量引用它们:

pytest_plugins = ['module1', 'module2']

如果conftest.py上有hooks,这也会有用。

答案 1 :(得分:3)

你不应该为此花费任何神奇的魔力。 py.test自动将当前测试文件的路径添加到sys.path,以及直到目标目录的所有父路径。

因此,您甚至不需要将该共享代码放入conftest.py。你可以放入普通的模块或包然后导入它(如果你想共享灯具,那些必须在conftest.py)。

此外,还有关于从documentation中的conftest.py导入

的说明
  

如果你有conftest.py文件,它们不在python包中   目录(即包含__init__.py的目录)然后“import conftest”   可能含糊不清,因为可能有其他conftest.py个文件   在您的PYTHONPATHsys.path上。因此,这是一个很好的做法   将conftest.py放在包范围内或从不放置的项目   从conftest.py文件中导入任何内容。

答案 2 :(得分:0)

这对我有用,看起来更容易/更清晰:

顶级测试/ conftest.py(requests.Response的可重复打印调试示例):

import pytest
import requests
from requests_toolbelt.utils import dump


@pytest.fixture(scope="session")
def print_response(response: requests.Response):
    data = dump.dump_all(response)
    print("========================")
    print(data.decode('utf-8'))
    print("========================")

    print("response.url = {}".format(response.url))
    print("response.request = {}".format(response.request))
    print("response.status_code = {}".format(response.status_code))
    print("response.headers['content-type'] = {}".format(response.headers['content-type']))
    print("response.encoding = {}".format(response.encoding))
    try:
        print("response.json = {}".format(response.json()))
    except Exception:
        print("response.text = {}".format(response.text))
    print("response.end")

从较低级别的conftest导入更高级别的conftest代码 - 例如,tests / package1 / conftest.py:

from tests.conftest import *

然后,在tests / package1 / test _ *。py中的低级测试中,您只需通过以下方式导入:

from tests.package1 import conftest

然后你可以从一个conftest中获得合并的配置测试。在整个测试层次结构中为您的其他较低级别详细/模块化conftest.py文件重复此模式。

答案 3 :(得分:0)

或者,您可以尝试:

my_fixtures.py中:

@pytest.fixture
def some_fixture():
  yield

conftest.py中:

import my_fixtures


# Adding the fixture to attributes of `conftest` will register it
some_fixture = my_fixtures.some_fixture

似乎pytest通过遍历conftest属性并检查attr._pytestfixturefunction添加的某些@pytest.fixture来检测固定装置。

只要conftest.py包含fixture属性,定义的fixture并不重要: