pytest 固定装置在一个单独的目录中

Posted

技术标签:

【中文标题】pytest 固定装置在一个单独的目录中【英文标题】:pytest fixtures in a separate directory 【发布时间】:2015-12-10 14:27:48 【问题描述】:

我正在寻求创建一个 pytest 结构,我可以在其中将固定装置与测试完全分开。这种分离的原因是我想将 fixtures 目录作为外部项目包含在 subversion 中,并在多个项目之间共享。

所需结构的树

project
|   conftest.py
|
+---fixtures
|       __init__.py
|       conftest.py
|       fixture_cifs.py
|       fixture_ftp.py
|       fixture_service.py
|
\---tests
    |   test_sometest1.py
    |   test_sometest2.py
    |
    \---configurations
            sometest1.conf
            sometest2.conf

我想在一个单独的文件中实现每个夹具的功能,以避免单个巨大的conftest.pyconftest.py 将只包含包装器以返回每个带有 @pytest.fixture 注释的固定装置的实例。当conftest.pyfixture_*.pytest_*.py 文件都在同一个目录下时,使用fixture 和测试没有问题。

但是,当固定装置在子目录中分开时,我从 pytest fixture 'cifs' not foundavailable fixtures: ... 收到错误消息。我还没有找到任何说明如何在test_*.py 或与test_*.py 相邻的conftest.py 之外放置固定装置的文档,但没有任何说明这也不起作用。

如何在使用 pytest 时将灯具放在自己的子目录中?

【问题讨论】:

【参考方案1】:

请在您的 conftest.py

中添加以下内容
  import pytest

  pytest_plugins = [
   "fixtures.conftest",
   "fixtures.fixture_cifs",
   "fixtures.fixture_ftp",
   "fixtures.fixture_service"
  ]

这确保fixtures/ 下声明的所有灯具都将被pytest 找到

请注意,在 fixtures.conftest" 需要有__init__.py 文件供pytest 加载插件

类似的案例可以看这里:https://***.com/a/54736237/6655459

【讨论】:

【参考方案2】:

尝试在project/conftest.py 中导入您的灯具 如果这就是“包装器返回实例”的意思

【讨论】:

【参考方案3】:

阅读 here 如何构建您的测试。

您的fixture 目录似乎不是包的一部分(项目没有__init__.py,因此不能导入为project.fixturesfixtures,因为它不在路径中。 您可以在 tests/conftest.pysys.path.append(os.path.join(os.path.dirname(__file__), os.pardir, "fixtures"))sys.path.append(os.path.join(os.path.dirname(__file__), os.pardir) 的路径中添加所需的目录,具体取决于您希望如何导入模块。

【讨论】:

【参考方案4】:

因为当我不可避免地回到这个问题时:您可以在不同的文件中导入固定装置(甚至是通常不会访问固定装置的文件)并且测试会适当地选择它!

【讨论】:

以上是关于pytest 固定装置在一个单独的目录中的主要内容,如果未能解决你的问题,请参考以下文章

pytest 如何以及在哪里找到固定装置

pytest 固定装置按啥顺序执行?

我可以将参数传递给 pytest 固定装置吗?

pytest 固定装置从外部范围重新定义名称 [pylint]

4.pytest中固定装置setup和teardown

如何在使用 argparse 的文件上使用指定的测试目录运行 pytest?