我有一个带有几个子目录的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')
我可以在鼻子脚本中更改哪些内容,以便我可以从目录外部运行脚本?
答案 0 :(得分:1)
实际上,你想在这里小心。因为,之所以发生这种情况,是因为您的测试中的导入是针对:/path/to/MyApp
。
因此,当您从该工作目录运行测试时,您的单元测试文件将全部导入到该项目源的目录中。如果您更改目录并从另一个位置运行,那么现在它将成为您的根,并且您的导入肯定会失败。
这可能带来不同的意见,但我通常会确保我的源代码都是从同一项目根目录中引用的。如果我们在这里:
MyApp/
foo/
__init__.py
tests.py
bar/
__init__.py
tests.py
run_unit_tests.py
我会在MyApp
此外,我会考虑创建一个tests
目录并将所有测试放在该目录中,这样可以更轻松地管理导入并更好地隔离代码。但是,这只是一个意见,请不要觉得这是必要的。无论什么对你有用,一起去吧。
希望这会有所帮助。