从脚本目录外部使用 nose.run(...) 运行 python 脚本会导致 AttributeError:"module"对象没有属性"tests"



我有一个带有几个子目录的python应用程序。每个子目录都有自己的tests.py文件。

我使用 nose 通过创建一个调用 nose.run(...) 的脚本run_unit_tests.py,一次性运行所有这些文件的所有单元测试。

如果我在包含run_unit_tests.py的目录中,一切正常。但是,如果我在文件系统上的其他任何地方,它会失败并显示属性错误:"模块"对象没有属性"测试"。

这是类似于我的目录结构的内容:

MyApp/
    foo/
        __init__.py
        tests.py
        bar/
            __init__.py
            tests.py
    run_unit_tests.py

在我的run_unit_tests.py

class MyPlugin(Plugin):
    ...
if __name__ == '__main__':
    nose.run(argv=['', 'foo.tests', '--with-my-plugin'])
    nose.run(argv=['', 'foo.bar.tests', '--with-my-plugin'])

如果我在顶部目录中运行run_unit_tests.py MyApp,一切正常。

但是,如果我在文件系统上的其他文件夹中运行脚本,它会失败并显示:

======================================================================
ERROR: Failure: AttributeError ('module' object has no attribute 'tests')
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/apps/Python/lib/python2.7/site-packages/nose/loader.py", line 407, in loadTestsFromName
    module = resolve_name(addr.module)
  File "/apps/Python/lib/python2.7/site-packages/nose/util.py", line 322, in resolve_name
    obj = getattr(obj, part)
AttributeError: 'module' object has no attribute 'tests'

实际上,如果我将以下内容添加到run_unit_tests.py,则可以正常工作:

import os
os.chdir('/path/to/MyApp')

我可以在鼻子脚本内部更改哪些内容,以便可以从目录外部运行脚本?

实际上,你要小心。因为,发生这种情况的原因是您在测试中的导入是关于:/path/to/MyApp .

因此,当您从该工作目录运行测试时,您的单元测试文件都将相对于作为项目源的该目录进行导入。如果您更改目录并从另一个位置运行,它现在将成为您的根目录,并且您的导入肯定会失败。

这可能会带来不同的意见,但我通常会确保我的源代码都来自同一个项目根目录。因此,如果我们在这里:

MyApp/
    foo/
        __init__.py
        tests.py
        bar/
            __init__.py
            tests.py
    run_unit_tests.py

我会从内部运行所有内容MyApp

此外,我会考虑创建一个tests目录并将所有测试放在该目录中,从而使导入更易于管理并更好地隔离代码。但是,这只是一种意见,请不要觉得这是必要的。无论什么对你有用,就去吧。

希望这有帮助。

最新更新