py.test - 当调用不同目录中的测试时,测试发现失败

时间:2012-09-25 11:58:43

标签: python unit-testing pytest autodiscovery

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

复制do:

; 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 个答案:

答案 0 :(得分:45)

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

答案 1 :(得分:23)

这是py.test的实际特征。您可以在pytest.org - Good Integration Practices - Choosing a test layout / import rules中找到此行为的原因:

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

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

正因为如此,我自己选择了在约定优于配置方式的唯一测试名称。它还确保您不会在各种测试运行输出中获得不明确的测试名称。

如果您需要保留测试名称而不关心上述功能,那么放置__init__.py就可以了。

答案 2 :(得分:6)

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

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

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

然后再次启动测试(仍从容器的重击中进行),一切正常:

py.test

答案 3 :(得分:-1)

您可以将以下环境变量添加到bash初始化文件或开发堆栈中的其他位置,以避免首先生成这些文件夹/文件

export PYTHONDONTWRITEBYTECODE=1