73

使用 py.test,在不同目录中调用相同的两个测试会导致 py.test 失败。这是为什么?如何在不重命名所有测试的情况下更改它?

复制做:

; cd /var/tmp/my_test_module
; mkdir -p ook/test           
; mkdir -p eek/test
; touch ook/test/test_proxy.py
; touch eek/test/test_proxy.py
; py.test
============================= test session starts ==============================
platform linux2 -- Python 2.7.3 -- pytest-2.2.4
collected 0 items / 1 errors 

==================================== ERRORS ====================================
___________________ ERROR collecting ook/test/test_proxy.py ____________________
import file mismatch:
imported module 'test_proxy' has this __file__ attribute:
  /home/ygolanski/code/junk/python/mymodule/eek/test/test_proxy.py
which is not the same as the test file we want to collect:
  /home/ygolanski/code/junk/python/mymodule/ook/test/test_proxy.py
HINT: remove __pycache__ / .pyc files and/or use a unique basename for your test file modules
=========================== 1 error in 0.01 seconds ============================
4

3 回答 3

63

放一个__init__.py是解决冲突的一种方法。与鼻子不同,当前的 pytest 不会尝试卸载测试模块以导入具有相同导入名称的测试模块。我曾经认为这种自动取消导入有点神奇,并且可能会扰乱人们对导入机制所做的期望;有时人们依赖于测试模块的全局状态,并且自动卸载会丢失它(从另一个测试模块导入的测试模块可能会做意想不到的事情)。但也许这不是一个实际问题,因此 pytest 可以添加类似的 hack ...

于 2012-09-26T11:03:54.770 回答
26

这是 py.test 的一个实际功能。您可以在pytest.org - 良好集成实践 - 选择测试布局/导入规则中找到此行为的原因:

  • 避免__init__.py测试目录中的文件。这样,您的测试可以轻松地针对已安装的 . 版本运行mypkg,而与已安装的软件包是否包含测试无关。

因为这是使用 py.test 的推荐工作流程:使用 安装正在开发的包pip install -e,然后对其进行测试。

因此,我自己以约定优于配置的方式选择了唯一的测试名称。它还确保您不会在各种测试运行输出中得到模棱两可的测试名称。

如果您需要保留测试名称并且不关心上述功能,您应该可以将__init__.py.

于 2014-02-21T18:34:58.683 回答
11

我有同样的错误,但解决方案与初始化文件或测试文件上的名称无关。我的macbookDocker容器上有不同的 python 版本。我从项目根目录的 macbook 的 bash 中启动了一次测试,而不是容器的 bash。

解决方案是通过运行(从容器的 bash 中)删除错误创建的文件:

find -name '*.pyc' -delete
find -name __pycache__ -delete

然后再次启动测试(仍然来自容器的 bash),一切正常:

py.test
于 2018-09-17T16:23:17.970 回答