Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当不同目录中的测试被称为同一目录时,测试发现失败_Python_Unit Testing_Pytest_Autodiscovery - Fatal编程技术网

Python 当不同目录中的测试被称为同一目录时,测试发现失败

Python 当不同目录中的测试被称为同一目录时,测试发现失败,python,unit-testing,pytest,autodiscovery,Python,Unit Testing,Pytest,Autodiscovery,使用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 =====================

使用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 ============================

\uuuu init\uuuuu.py
放入是解决冲突的一种方法。与nose不同,当前pytest不会为了导入具有相同导入名称的测试模块而尝试卸载测试模块。我曾经认为,这是一个有点魔术,这样做自动不重要,可能会打乱人们的期望从进口机制做什么;有时,人们依赖于测试模块的全局状态,而自动卸载会丢失它(从另一个测试模块导入的测试模块可能会执行意外操作)。但这可能不是一个实际问题,因此pytest可能会添加类似的hack…

这是py.test的一个实际功能。您可以在中找到此行为的原因:

  • 避免测试目录中的
    \uuuu init\uuuu.py
    文件。这样,您的测试就可以轻松地针对已安装版本的
    mypkg
    运行,而不受已安装软件包是否包含测试的影响
这是使用py.test的推荐工作流程:使用
pip install-e
安装正在开发的软件包,然后对其进行测试

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


如果您需要保留测试名称,而不关心上述功能,那么您应该可以将
\uuuu init\uuuu.py

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

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

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

py.test

我同意需要init.py是有道理的。如果测试不在包中,那么它本质上是一个顶级模块(在OP、test_代理中),并且应该只有一个。通过将测试模块放在相关包(ook和eek)中,它提供了测试的适当名称空间。我说现状是最好的。将错误消息链接到此问题或文档中解释解决此问题的推理和技术的内容,可能会减轻一些痛苦。请注意,py.test文档特别建议不要将
\uuu init\uuuuuuuuuuuuuuupy
放在测试目录中:“避免测试目录中的
\uuuu init\uuuuu.py
文件。通过这种方式,您的测试可以轻松地针对已安装的mypkg版本运行,而与已安装的软件包是否包含测试无关”。摘自。更新:上面@famousgarkin的评论和答案()中的建议似乎不再出现在文档中(至少搜索“避免”不会出现上面的引用):。事实上,该链接中的示例在测试目录中显示了
\uuu init\uuuuuuuuuuuupy
,因此似乎接受的答案是正确的。我从未完全理解pytest测试发现逻辑。当我遇到发现错误时,我只会寻找放置
\uuuuuu ini\uuuuuuuupy
s的位置_(ツ)_/“”.到目前为止对我有效。@famousgarkin在《我不明白》中删除了用例:“这样,您的测试可以轻松地针对已安装版本的mypkg运行”。我针对我的
mypkg
开发版本运行测试。这样,测试就存在了。我创建
\uuuu init\uuuuu.py
文件以避免这种“唯一的基名”"错误消息。我创建了一个功能请求来更改文档:@guettli此用例用于测试通过setup.py安装的软件包。这可用于确保在安装中包括所有必需的文件,如捆绑数据,并且正确处理所有依赖项。它还可用于在e目标系统没有编译器,您将使用二进制egg或wheel进行安装。链接中有一个输入错误。下面是正确的链接:我在docker容器中遇到了相同的问题,这个答案救了我的命。我认为应该将它添加到@hpk42接受的答案中。
py.test