2012-09-25 53 views
42

使用py.test,在不同目录中调用相同的两个测试会导致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 ============================ 

回答

30

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

+2

我同意需要__init__.py有道理。如果测试不在包中,那么它本质上是一个顶级模块(在OP中是test_proxy),应该只有一个。通过将测试模块放入相关的包(ook和eek)中,它提供了适当的测试命名空间。我说现状是最好的。它可能会减轻一些痛苦,让错误信息链接到这个问题或文档中解释推理和解决问题的技术。 –

+20

请注意,py.test文件特别建议不要在测试目录中放置'__init __。py':_“在您的测试目录中避免'__init __。py'文件。这样,您的测试可以轻松地对照已安装版本的mypkg运行,独立于安装的软件包是否包含测试“_”。采自[pytest.org - 良好集成实践](http://pytest.org/latest/goodpractises.html#choosing-a-test-layout-import-rules)。 – famousgarkin

+1

更新:上面的@ famousgarkin评论和回答(https://stackoverflow.com/a/21942491/260303)中的建议似乎不再存在于文档中(至少搜索“避免”不会显示引用以上):https://docs.pytest.org/en/latest/goodpractices.html#tests-as-part-of-application-code。实际上,该链接中的示例在测试目录中显示“__init __。py”,所以看起来接受的答案是正确的。 –

14

这是py.test的实际功能。你可以找到原因针对此行为在pytest.org - Good Integration Practices - Choosing a test layout/import rules指出:在您的测试目录

  • 避免__init__.py文件。这样,如果安装的软件包包含测试或不包含测试,则可以针对安装的版本mypkg轻松地运行测试。

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

正因为如此,我自己选择了独特的测试名称,在约定中配置方式。它还可以确保您在各种测试运行输出中不会出现含糊不清的测试名称。

如果你需要保持测试的名称和不关心的上述功能,你应该确定与把一个__init__.py

+0

我没有得到用例:“通过这种方式,您的测试可以轻松地对照已安装版本的mypkg运行”。我对我的'mypkg'开发版运行我的测试。这种方式存在测试。我创建'__init __。py'文件来避免这个“唯一的基本名称”错误信息。 – guettli

+1

我创建了一个功能请求来更改文档:https:// bitbucket。org/hpk42/pytest/issue/529/unique-basename-and -__ init__py-docs – guettli

+1

@guettli这个用例就是当你想通过setup.py安装测试你的软件包时。这可以用来确保您在安装中包含所有必需的文件,例如捆绑数据,并且所有依赖项都可以正确处理。它也可以用于在目标系统没有编译器的环境中安装,并且您将使用二进制蛋或轮进行安装。 –