python 单元测试失败ModuleImportFailure

在使用unittest进行Python单元测试时遇到ModuleImportFailure错误。错误源于测试模块尝试import包含已删除依赖的XXXABCTest模块。通过日志和直接导入模块定位问题,发现XXXABCTest依赖的YYY模块被删除,解决方案是更新XXXABCTest,移除对YYY的导入。此案例说明Python错误有时难以直接定位根因,需要借助额外手段调查。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值