py.test - 在不同目录中2 conftest.py时收集错误

时间:2017-07-06 09:25:57

标签: python pytest

我们使用 py.test 。我们尝试将不同的conftest.py文件放在不同的文件夹中以拆分我们的灯具:

tests/api/
├── conftest.py
├── folder1
│   └── conftest.py
├── folder2
│   └── conftest.py

但是在运行测试时会发生此错误:

____ ERROR collecting api/folder1/conftest.py ____
import file mismatch:
imported module 'conftest' has this __file__ attribute:
  /tests/api/folder2/conftest.py
which is not the same as the test file we want to collect:
  /tests/api/folder1/conftest.py
HINT: remove __pycache__ / .pyc files and/or use a unique basename for your test file modules

为什么?如何解决?

PS。删除__pycache__.pyc没有帮助。

PPS。每个文件夹中已存在__init__.py个文件。

3 个答案:

答案 0 :(得分:0)

您的用例听起来像this example in the pytest documentation。因此,我认为可以在不同级别使用conftest.py来覆盖灯具。

您看到的错误可能与错误的导入有关。您的测试代码是直接从conftest文件导入的吗?你的conftest文件是从你的测试中导入的吗?您的任何进口商品relative instead of absolute?如果其中任何一个属实,那可能是您的问题。我建议仅使用绝对导入,并避免在conftest.py和测试文件之间导入。

答案 1 :(得分:0)

重命名Pytest抱怨的一个(或两个)测试文件。 Pytest会在错误消息中告诉您执行此操作(即更改基本名称,即不要将所有测试文件都命名为conftest.py)。例如,您可以通过以下方法解决此问题:

tests/api/
├── conftest.py
├── folder1
│   └── test_conf1.py
├── folder2
│   └── test_conf2.py

在您的情况下,模块名称冲突(您有三个conftest.py)。这是Pytest AFAIK的怪癖。 Pytest可以通过管理完整的包/模块路径来解决这个问题:但是它并不能做到这一点(可能是有充分的理由,但是我不维护/贡献于pytest,所以我无法阐明这个问题)。 Pytest是一个很棒的框架(它甚至告诉您确切地为什么它不能运行您的测试):我确信他们有充分的理由不支持这种行为。

您声称要:

  

通过不同的功能将测试和固定装置分开。

这样做。分开测试装置/功能与您命名文件无关。

在拆分单元/集成/验收测试时,我通常会遇到此错误。我将它们分开,这样我就可以运行(快速)单元测试,而不必运行(可能很慢)集成/验收测试。我可能有一些模块,称为Abc。我有类似的东西:

tests/
├── unit
│   └── test_abc.py
├── integration
│   └── test_abc.py

但是随后pytest barfs出现了与您所显示的错误相同的错误,因此我将integration/test_abc.py重命名为integration/test_abc_integration.py并继续前进。像这样:

tests/
├── unit
│   └── test_abc.py
├── integration
│   └── test_abc_integration.py

烦人吗?一点。修复需要多长时间? 5整秒。

P.S。在收到您发布的错误后,您可能必须删除__pycache__目录或.pyc文件以进行首次运行(如果不这样做,则即使您再次遇到相同的错误,即使您重命名)。

P.S.S。您可以通过调用__pycache__阻止Cpython解释器(和其他大多数工具)写出.pycpython -B -m pytest ...文件。 -B选项使解释器不将字节码保存到文件系统中。每当您运行测试套件时,这都会导致性能下降,但是这种下降通常很小(寿命可能会有所不同)。我通常使用此选项是因为我不喜欢存储库中的混乱情况,而且性能损失通常可以忽略不计。

答案 2 :(得分:0)

我有同样的问题。为了解决这个问题,您需要创建python软件包而不是目录。然后pytest将查看包中的conftest.py而不是根目录。希望对你有帮助。 tests/api/ ├── conftest.py ├── package1 # not folder │ └── conftest.py ├── package2 # not folder │ └── conftest.py