我最近发现 pytest
.看起来很棒。但是,我觉得文档可能会更好。
我想了解什么 conftest.py
文件旨在用于。
在我的(目前很小的)测试套件中,我有一个 conftest.py
项目根目录下的文件。我用它来定义我注入(inject)到我的测试中的装置。
我有两个问题:
conftest.py
的正确用法吗? ?它还有其他用途吗? conftest.py
文件?我什么时候想要这样做?示例将不胜感激。 conftest.py
的用途和正确使用py.test 测试套件中的文件?
最佳答案
Is this the correct use of conftest.py?
conftest.py
的潜在和常见用途.这conftest.py
中定义设备可能没用,如果所有测试都没有使用这些装置,它会减慢测试速度。Does it have other uses?
conftest.py
用于导入外部插件或模块。通过定义以下全局变量,pytest 将加载模块并使其可用于测试。插件通常是在您的项目或测试中可能需要的其他模块中定义的文件。您还可以按照 here 的说明加载一组预定义的插件。 .pytest_plugins = "someapp.someplugin"
def pytest_runtest_setup(item):
""" called before ``pytest_runtest_call(item). """
#do some stuff`
conftest.py
在您的根路径中,您将拥有 pytest
无需指定即可识别您的应用程序模块 PYTHONPATH
.在后台,py.test 修改你的 sys.path
通过包含从根路径找到的所有子模块。Can I have more than one conftest.py file?
conftest.py
文件具有目录范围。因此,创建有针对性的装置和助手是一种很好的做法。When would I want to do that? Examples will be appreciated.
def pytest_runtest_setup(item):
print("I am mod")
#do some stuff
test root/mod2/test.py will NOT produce "I am mod"
加载一组灯具对于某些测试,但不适用于其他测试。@pytest.fixture()
def fixture():
return "some stuff"
root/mod2/conftest.py @pytest.fixture()
def fixture():
return "some other stuff"
root/mod2/test.py def test(fixture):
print(fixture)
将打印“其他一些东西”。conftest.py
.def pytest_runtest_setup(item):
print("I am mod")
#do some stuff
root/conftest.py def pytest_runtest_setup(item):
print("I am root")
#do some stuff
通过在 root/mod
中运行任何测试,只打印“我是 mod”。conftest.py
的信息here .What if I need plain-old helper functions to be called from a number of tests in different modules - will they be available to me if I put them in a conftest.py? Or should I simply put them in a helpers.py module and import and use it in my test modules?
conftest.py
定义你的助手。但是,您应该遵循常规做法。至少在 pytest
中,助手可以用作夹具.例如,在我的测试中,我有一个模拟 redis 助手,我以这种方式将其注入(inject)到我的测试中。@pytest.fixture
def mock_redis():
return MockRedis()
root/tests/stuff/conftest.py pytest_plugin="helper.redis.redis"
root/tests/stuff/test.py def test(mock_redis):
print(mock_redis.get('stuff'))
这将是一个测试模块,您可以在测试中自由导入。 注意 您可能会命名 redis.py
如 conftest.py
如果您的模块 redis
包含更多测试。但是,由于模棱两可,不鼓励这种做法。conftest.py
,您可以简单地将该助手放在您的根目录中 conftest.py
并在需要时注入(inject)。@pytest.fixture
def mock_redis():
return MockRedis()
root/tests/stuff/test.py def test(mock_redis):
print(mock_redis.get(stuff))
您可以做的另一件事是编写一个可安装的插件。在这种情况下,你的助手可以写在任何地方,但它需要定义一个入口点来安装在你的和其他潜在的测试框架中。见 this .class MockRedis():
# stuff
root/tests/stuff/test.py from helper.redis import MockRedis
def test():
print(MockRedis().get(stuff))
但是,在这里您可能会遇到路径问题,因为模块不在测试的子文件夹中。您应该能够通过添加 __init__.py
来克服这个问题(未经测试)。给你的 helper from .redis import MockRedis
或者简单地将 helper 模块添加到您的 PYTHONPATH
.
https://stackoverflow.com/questions/34466027/