首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在pytest中,conftest.py文件的用途是什么?

在pytest中,conftest.py文件的用途是什么?
EN

Stack Overflow用户
提问于 2015-12-26 04:08:21
回答 4查看 120.3K关注 0票数 364

我最近发现了pytest。看起来很棒。然而,我觉得文档可以更好。

我正在尝试理解conftest.py文件的用途。

在我的(目前较小的)测试套件中,项目根目录下有一个conftest.py文件。我使用它来定义注入到测试中的fixture。

我有两个问题:

  1. 这是conftest.py的正确用法吗?它还有其他用途吗?
  2. 我可以有多个conftest.py文件吗?我什么时候想这么做呢?我们会很感谢这些例子的。

更一般地,您将如何定义py.test测试套件中conftest.py文件的用途和正确用法?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-12-30 07:53:09

这是conftest.py的正确用法吗?

是的。Fixture是conftest.py的一种潜在且常见的用途。您将定义的fixture将在您的测试套件中的所有测试之间共享。然而,在根conftest.py中定义fixtures可能是无用的,如果不是所有测试都使用这样的fixtures,那么它会减慢测试速度。

它还有其他用途吗?

是的,确实如此。

  • Fixtures:为测试使用的静态数据定义了fixture。除非另有说明,否则套件中的所有测试都可以访问此数据。这可以是数据,也可以是将传递给所有测试的模块的帮助器。

  • External插件加载conftest.py用于导入外部插件或模块。通过定义以下全局变量,pytest将加载模块并使其可用于测试。插件通常是在您的项目中定义的文件或测试中可能需要的其他模块。您还可以加载一组预定义的插件,如here所述。

pytest_plugins = "someapp.someplugin"

  • Hooks:您可以指定钩子,如setup和teardown方法等,以改进您的测试。有关一组可用钩子,请阅读Hooks link。示例:

def pytest_runtest_setup(item):在pytest_runtest_call(item)之前调用“。”#do pytest_runtest_setup stuff`

  • Test根路径:这是一个有点隐藏的特性。通过在根路径中定义conftest.py,您将使pytest能够识别您的应用程序模块,而无需指定PYTHONPATH。在后台,py.test通过包含从根路径找到的所有子模块来修改sys.path

我可以有多个conftest.py文件吗?

是的,你可以,如果你的测试结构有点复杂,强烈建议你这样做。conftest.py文件具有目录范围。因此,创建有针对性的fixture和helper是很好的实践。

我什么时候想这样做?我们会很欣赏这些例子的。

有几种情况可以适用:

为一组特定的测试创建一组工具或钩子

root/mod/conftest.py

代码语言:javascript
复制
def pytest_runtest_setup(item):
    print("I am mod")
    #do some stuff


test root/mod2/test.py will NOT produce "I am mod"

加载一组fixtures用于某些测试,但不用于其他测试。

root/mod/conftest.py

代码语言:javascript
复制
@pytest.fixture()
def fixture():
    return "some stuff"

root/mod2/conftest.py

代码语言:javascript
复制
@pytest.fixture()
def fixture():
    return "some other stuff"

root/mod2/test.py

代码语言:javascript
复制
def test(fixture):
    print(fixture)

将打印“一些其他的东西”。

覆盖从根conftest.py继承的挂钩。

root/mod/conftest.py

代码语言:javascript
复制
def pytest_runtest_setup(item):
    print("I am mod")
    #do some stuff

root/conftest.py

代码语言:javascript
复制
def pytest_runtest_setup(item):
    print("I am root")
    #do some stuff

通过在root/mod中运行任何测试,只会打印"I am mod“。

您可以阅读有关conftest.py here的更多信息。

编辑:

如果我需要从不同模块中的许多测试中调用普通的助手函数,该怎么办?如果我将它们放在conftest.py中,它们是否可用?或者我应该简单地将它们放在一个helpers.py模块中,然后在我的测试模块中导入并使用它?

您可以使用conftest.py定义您的帮助器。但是,您应该遵循惯例。至少在pytest中,Helpers可以用作fixture。例如,在我的测试中,我有一个模拟的redis助手,我以这种方式将其注入到我的测试中。

root/helper/redis/redis.py

代码语言:javascript
复制
@pytest.fixture
def mock_redis():
    return MockRedis()

root/tests/stuff/conftest.py

代码语言:javascript
复制
pytest_plugin="helper.redis.redis"

root/tests/stuff/test.py

代码语言:javascript
复制
def test(mock_redis):
    print(mock_redis.get('stuff'))

这将是一个测试模块,您可以在测试中自由导入。请注意,如果您的模块redis包含更多测试,您可能会将redis.py命名为conftest.py。然而,由于模棱两可,这种做法是不受欢迎的。

如果要使用conftest.py,只需将帮助器放在根conftest.py中并在需要时注入它即可。

root/tests/conftest.py

代码语言:javascript
复制
@pytest.fixture
def mock_redis():
    return MockRedis()

root/tests/stuff/test.py

代码语言:javascript
复制
def test(mock_redis):
    print(mock_redis.get(stuff))

你可以做的另一件事是编写一个可安装的插件。在这种情况下,您的帮助器可以在任何地方编写,但它需要定义一个入口点,以便安装在您的和其他潜在的测试框架中。参见this

如果您不想使用fixture,您当然可以定义一个简单的helper,并在需要的任何地方使用普通的旧导入。

root/tests/helper/redis.py

代码语言:javascript
复制
class MockRedis():
    # stuff

root/tests/stuff/test.py

代码语言:javascript
复制
from helper.redis import MockRedis

def test():
    print(MockRedis().get(stuff))

但是,在这里您可能会遇到路径问题,因为模块不在测试的子文件夹中。您应该能够通过向您的帮助器添加__init__.py来克服这一点(未经过测试

root/tests/helper/init.py

代码语言:javascript
复制
from .redis import MockRedis

或者简单地将助手模块添加到您的PYTHONPATH

票数 450
EN

Stack Overflow用户

发布于 2015-12-28 20:55:38

从广义上讲,conftest.py是一个本地的、按目录的插件。在这里,您可以定义特定于目录的挂钩和fixture。在我的例子中,a有一个根目录,包含特定于项目的测试目录。一些常见的魔法驻留在“根”conftest.py中。具体项目--在他们自己的项目中。在conftest.py中存储fixture没有什么不好的地方,除非它们没有被广泛使用(在这种情况下,我更喜欢在测试文件中直接定义它们)

票数 17
EN

Stack Overflow用户

发布于 2018-08-07 11:47:05

我使用conftest.py文件来定义注入到我的测试中的fixture,这是conftest.py的正确用法吗?

,一个fixture通常用于为多次测试准备数据。

它还有其他用途吗?

,fixture是pytest在实际测试函数之前运行的函数,有时是在实际测试函数之后运行的函数。fixture中的代码可以做任何您想做的事情。例如,一个fixture可用于获取测试所需的数据集,或者fixture还可用于在运行测试之前使系统进入已知状态。

我可以有多个conftest.py文件吗?我什么时候想这么做呢?

首先,可以将fixture放入单独的测试文件中。然而,要在多个测试文件之间共享fixture,您需要为所有测试集中放置一个conftest.py文件。任何测试都可以共享Fixtures。如果您希望fixture仅供该文件中的测试使用,则可以将它们放在单独的测试文件中。

其次,测试是,你可以在top conftest.py目录的子目录中放置其他的测试文件。如果您这样做了,这些低级conftest.py文件中定义的装置将可用于该目录和子目录中的测试。

最后,将fixture放在测试根目录下的conftest.py文件中将使它们在所有测试文件中都可用。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34466027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档