什么是在nosetest ImportError上识别有问题文件的好策略?

时间:2017-02-03 03:13:37

标签: python nose

假设我有一个包含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总是要显示我的问题测试文件后的下一行是什么?

0 个答案:

没有答案