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

时间:2016-02-29 03:33:24

标签: python nose

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

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

如果我在包含run_unit_tests.py的目录中,一切正常。但是,如果我在文件系统上的任何其他位置,它将失败并出现AttributeError:' module'对象没有属性' tests'。

这与我的目录结构类似:

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')

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

1 个答案:

答案 0 :(得分:1)

实际上,你想在这里小心。因为,之所以发生这种情况,是因为您的测试中的导入是针对:/path/to/MyApp

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

这可能带来不同的意见,但我通常会确保我的源代码都是从同一项目根目录中引用的。如果我们在这里:

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

我会在MyApp

内运行所有内容

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

希望这会有所帮助。