从本地代码

时间:2016-08-23 02:34:02

标签: python pytest

我正在构建一个包,它提供(1)带有(2)可插拔驱动程序的固定接口。所需的驱动程序将由包的用户选择。我的软件包将包含至少一个驱动程序,但我希望其他开发人员能够实现和验证符合软件包界面的驱动程序。因此,我希望这些开发人员能够针对他们的驱动程序运行我的测试。

目前,我正在使用py.test的参数化灯具将我的驱动程序注入我的测试中:

# conftest.py
import my_pkg
import pytest

@pytest.fixture(params=[my_pkg.MyDriver])
def driver(request):
    return request.param
# my_pkg/tests/conftest.py
import my_pkg
import pytest

@pytest.fixture
def my_interface(driver):
    return my_pkg.MyInterface(driver)
# my_pkg/tests/test_my_interface.py
def test_that_it_does_the_right_thing(my_interface):
    assert my_interface.some_method() == "some return value"

我以这种方式构建它,希望有人能够针对他们的driver装置版本收集和运行我的测试。换句话说,他们的包看起来像这样:

# setup.py
from setuptools import setup

setup(
    # ...
    install_requires=["my-pkg"])
# conftest.py
import their_pkg
import pytest

@pytest.fixture(params=[their_pkg.TheirDriver])
def driver(request):
    return request.param

显然这还不足以使它工作,因为py.test似乎没有提供从外部包注入测试的选项。 但是,如果有的话,这怎么可能呢?

This question似乎在概念上相似,但作者似乎完全在一个代码库中工作。我想要一个完全独立的 pip安装包,以便能够引用测试包含在我的 pip安装包中。)

1 个答案:

答案 0 :(得分:1)

I solved this

  1. 实施a custom py.test collector,从我的包中移植必要的测试套件,
  2. 要求消费者在其中一个测试文件中实例化我的自定义类my_pkg.MyDriverSuite,然后
  3. 编写使用pytest_pycollect_makeitem挂钩截取自定义实例并注入我的收集器的a custom py.test plugin
  4. (注意:这种方法避免了使用参数化装置。)

    自定义收集器是迄今为止最棘手的部分,因为它需要大量挖掘py.test内部结构,并最终重新实现核心py.test收集器的精简版本,{{ 1}},其自定义会话Session的{​​{1}}设置为我的包。