2014-11-21 57 views
10

我有一个大的conftest.py文件,我想分割成更小的部分,有两个原因:拆分conftest.py文件分成几个小conftest样件

  1. 该文件是非常大的(〜1000线,包括文件)
  2. 一些灯具的依赖于其他灯具,我没有理由揭露那些其他附着物作为conftest“API”的一部分,当用户寻找相关的灯具

我不知道pytest提供的任何机制来解决mul中的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 

这适用于我的需求,但我不知道是否有更好的方法。

回答

12

你可以把你的东西,在其他模块,并在您conftest.py使用pytest_plugins变量引用它们:

pytest_plugins = ['module1', 'module2'] 

这也将工作,如果你conftest.py对他们hooks

+0

这非常优雅。谢谢! – alkalinity 2014-11-21 20:41:48

3

你不应该需要任何奇特的魔术。 py.test会自动将当前测试文件的路径添加到sys.path以及所有父目录路径直到目标目录。

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

此外,还有本说明有关在documentationconftest.py进口:

如果你不居住在一个Python包 目录conftest.py文件(即包含一个一个__init__.py),那么“ import conftest“ 可能不明确,因为您的PYTHONPATHsys.path上可能有其他conftest.py文件为 。因此, 项目的良好做法是将conftest.py置于程序包范围之下或从不 从conftest.py文件导入任何东西。

+1

我本来希望能够使用夹具,而不需要他们在“main”conftest.py文件中。很高兴知道路径。 – alkalinity 2014-11-21 21:05:32

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码 - 例如,测试/包1/conftest.py:

from tests.conftest import * 

然后,在测试/包1/TEST_内的较低水平测试*。py,你只需导入通过:

from tests.package1 import conftest 

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