python 单元测试失败ModuleImportFailure

在用unittest跑python的单元测试的时候,碰到下面奇怪的错误:

E
======================================================================
ERROR: __main__ (unittest2.loader.LoadTestsFailure)
----------------------------------------------------------------------
TypeError: 'ModuleImportFailure' object is not iterable

----------------------------------------------------------------------
Ran 1 test in 0.000s

FAILED (errors=1)

我的测试module里有重写load_tests方法,它会尝试import所以以Test结尾的测试模块,其中就包括我出现问题的那个module: XXXABCTest.

def load_tests(loader, tests, pattern):
    suite = unittest.TestSuite()
    for all_test_suite in unittest.defaultTestLoader.discover('.', pattern='*Test.py'):
        for test_suite in all_test_suite:
            suite.addTests(test_suite)
    return suite

之前都是可以跑过的,不知道最近为什么突然出现这种错误。在调查的时候,加入了一些log:

def load_tests(loader, tests, pattern):
    suite = unittest.TestSuite()
    for all_test_suite in unittest.defaultTestLoader.discover('.', pattern='*Test.py'):
        for test_suite in all_test_suite:
            print 'adding test...' + str(test_suite)
            suite.addTests(test_suite)
    return suite

再次跑的时候,看到下面的ModuleImportFailure的错误,这个才是真正的root cause:

adding tests...XXXABCTest (unittest2.loader.ModuleImportFailure) <class 'unittest2.loader.ModuleImportFailure'>

那为什么没有办法加载XXXABCTest这个module呢? 为了进一步调查,尝试直接加载XXXABCTest 这个模块:

python -m XXXABCTest
Traceback (most recent call last):
  File "/usr/lib64/python2.6/runpy.py", line 122, in _run_module_as_main
    "__main__", fname, loader, pkg_name)
  File "/usr/lib64/python2.6/runpy.py", line 34, in _run_code
    exec code in run_globals
  File "XXXABCTest.py", line 3, in <module>
    import YYY
ImportError: No module named Sites

ok, 到这里比较清楚了,XXXABCTest这个module依赖了YYY这个module, 但是现在没有办法找到YYY这个module, 因为它最近被我删除了。

解决办法:更新XXXABCTest,去掉import YYY。

总结:python 有时候报的错很奇怪,从最原始的错误往往很难判断真真的root cause是什么,就好像上面我碰到的这个case,往往需要借助一些日记或者工具来进一步调查。python的命令行参数对调查问题还挺有帮助的。


版权声明:本文为west_609原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。