假设我有一个包含3个测试* .py文件的目录。
__init__.py
lib1.py
lib2.py
test_01.py
test_02_badimport.py
test_03.py
nosetest
本身只运行所有测试。
现在,让我们说其中一个测试 test_02_badimport.py 存在导入问题。这是它的代码,虽然它不是非常重要的:
import unittest
#this module is missing, so it will trigger an ImportError
import missing_module
class TestStringMethods(unittest.TestCase):
def test_upper(self):
self.assertEqual('foo'.upper(), 'FOO')
if __name__ == '__main__':
unittest.main()
这是我从nosetests
获得的结果:
(env) me@test_nose$ nosetests
nose.config: INFO: Ignoring files matching ['^\\.', '^_', '^setup\\.py$']
test_basic (test_nose.test_01.MyTest) ... ok
test_something (test_nose.test_01.MyTest) ... ok
Failure: ImportError (No module named missing_module) ... ERROR
test_basic (test_nose.test_03.MyTest) ... ok
test_something (test_nose.test_03.MyTest) ... ok
======================================================================
ERROR: Failure: ImportError (No module named missing_module)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/me/env/lib/python2.7/site-packages/nose/loader.py", line 418, in loadTestsFromName
addr.filename, addr.module)
File "/Users/me/env/lib/python2.7/site-packages/nose/importer.py", line 47, in importFromPath
return self.importFromDir(dir_path, fqname)
File "/Users/me/env/lib/python2.7/site-packages/nose/importer.py", line 94, in importFromDir
mod = load_module(part_fqname, fh, filename, desc)
File "/Users/me/wk/explore/test_nose/test_02_badimport.py", line 3, in <module>
import missing_module
ImportError: No module named missing_module
----------------------------------------------------------------------
Ran 5 tests in 0.007s
FAILED (errors=1)
看看Failure: ImportError (No module named missing_module) ... ERROR
。现在,我知道它是由 import missing_module 引起的。
但它需要进行一些跟踪来确定问题在于test_02_badimport.py,因为该信息未传递给测试运行输出,它只是堆栈跟踪转储的一部分。
我的实际案例更复杂,这是由于django.setup()调用上下文中的循环导入问题,因此我自己的代码与nose和unittest代码以及Django文件交错显示在一个巨大的堆栈轨迹中间,而不是在这个例子中的底部。
有没有办法实现类似的目标:
输出中 (test_nose.test_02_badimport) Failure: ImportError (No module named missing_module) ... ERROR
?
或者我是否只需要关注堆栈跟踪中的head load_module调用之后的下一行?
File "/Users/me/env/lib/python2.7/site-packages/nose/importer.py", line 94, in importFromDir
mod = load_module(part_fqname, fh, filename, desc)
根据上述内容, test_02_badimport.py 是有罪文件:
File "/Users/me/wk/explore/test_nose/test_02_badimport.py", line 3, in <module>
import missing_module
我的工作流程:
Nosetest,尤其是-x
(第一次出错时停止)标志,可以让我快速运行所有测试。并且,一旦我知道哪个test_xxx.py文件有问题,我可以直接从命令行python test_02_badimport.py
运行它并修复它。在大多数情况下,这非常有效,但ImportError在某种程度上隐藏了文件名。
是否有命令行开关? (我试过--collect-only
,但没有帮助)?也没有nosetests --debug=nose,nose.importer --debug-log=nose_debug
。
或插件?
如果失败,mod = load_module
总是要显示我的问题测试文件后的下一行是什么?