python - 使用nosetests 特别命名的目录

标签 python unit-testing import nose nosetests

nosetests 是否会以不同方式对待具有某些名称的目录? src 目录特殊吗?

如果我有一个源目录名为 src 的项目,则 nosetests 似乎工作正常。但是,如果该目录被命名为其他名称,nosetests 会报告一堆导入错误。

这就是我所做的:

  1. 运行测试

    ~/src$ nosetests
    ..
    ----------------------------------------------------------------------
    Ran 2 tests in 0.001s
    
    OK
    
  2. 重命名目录

    ~/src$ cd ..
    ~/$ mv src/ src2
    
  3. 重新运行测试

    ~/$ cd src2
    ~/src2$ nosetests
    E
    ======================================================================
    ERROR: Failure: ImportError (No module named **whatever**)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
    ... etc. ...
        import **whatever**
    ImportError: No module named **whatever**
    
    ----------------------------------------------------------------------
    Ran 1 test in 0.001s
    
    FAILED (errors=1) 
    

我在文档中找不到与此相关的任何内容。


示例:具有以下目录结构:

.
|-- a
|   |-- b.py
|   `-- __init__.py
|-- __init__.py
`-- test
    |-- a
    |   |-- __init__.py
    |   `-- testb.py
    `-- __init__.py

所有__init__.py文件都是空的,a/b.py的内容是:

y = 3

test/a/testb.py:

import a.b
import unittest as u


class TestB(u.TestCase):

    def test1(self):
        self.assertTrue(True)

    def test2(self):
        self.assertTrue(False)

我可以可靠地重现这个问题。运行nosetests -V给出:

nosetests version 1.2.1

最佳答案

快速解决方案是删除 __init__.py从顶级目录。另一种选择是使用相对导入,例如:替换 import a.bfrom ...a import b .

造成这种困惑和诡计的罪魁祸首是 nose importer .

如果您正在运行的目录nosetests中,是一个包, Nose 不会将其添加到 sys.path ,否则,它将添加它( source )。然后,它向上抛出目录树并递归地应用相同的逻辑。对于所有受影响的文件也是如此。这解释了为什么它不能与 __init__.py 一起使用- 根目录( src2 在你的情况下)不在 sys.path 中 - 这就是包 a 的原因没有找到。

但是,这里的悬而未决的问题是:为什么它第一次起作用,src文件夹? src在本例中,文件夹位于 sys.path 上。可能会有其他答案或编辑。

查看相关问题:

关于python - 使用nosetests 特别命名的目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16174649/

相关文章:

python - "import"语句如何确定在 Python 中导入了哪个文件?

python - 如何在 xonsh 的 for 循环中运行 shell 命令?

Python 脚本在 pythonw 下失败

c - windows shell中jenkins中linux命令的使用

python - Python 中的 importlib.reload() 和 exec()

mysql - 计划将 .MDB 文件从 ftp 服务器导入 MySQL

python - 如何让 python 加载混合模式 .dll 引用的 .NET .dll?

python - pandas 数据框中的 Excel 工作表名称

c# - 如何对嵌套的 foreach 循环进行单元测试?

java - Power Mockito 无法模拟构造函数