在用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的命令行参数对调查问题还挺有帮助的。