如何让Python unittest发现并执行子包内所有测试用例
问题描述
我有一个包含数百个测试用例的Python项目,测试用例按模块组织。为便于维护,正将部分测试移至独立子包中,当前目录结构如下:
/my_project/[...] /test/__init__.py /test/test_missiles.py /test/test_launch_procedure.py /test/fallback/__init__.py /test/fallback/test_sticks.py /test/fallback/test_stones.py
可以通过以下命令单独执行fallback子包内的单个测试:
python3 -m unittest test.fallback.test_sticks
但执行python3 -m unittest test.fallback时,unittest并未发现子包内的测试模块,不会执行任何测试。使用文件名路径仅能执行单个文件,无法匹配test/fallback/test_s*.py这类通配符模式。想知道是否需要对fallback测试子包进行特殊配置,让python3 -m unittest test.fallback能加载并执行该包内所有测试?
解决方案
要实现这个需求,有两种简单可行的方法:
方法一:修改子包的__init__.py
在test/fallback/__init__.py中导入所有测试模块,这样unittest在加载test.fallback包时会自动识别这些模块里的测试用例:
from . import test_sticks from . import test_stones
之后再执行python3 -m unittest test.fallback,就能运行该子包下的所有测试了。
方法二:使用unittest的发现功能
不需要修改任何代码,直接用discover参数指定扫描目录和测试文件的匹配规则:
python3 -m unittest discover -s test/fallback -p "test_*.py"
-s:指定要扫描的根目录(这里是test/fallback)-p:指定测试文件的匹配模式(这里匹配所有以test_开头的.py文件)
为什么原命令不生效?
默认情况下,unittest只会检查目标包的__init__.py中定义的测试用例,不会自动递归扫描子包内的其他模块。所以要么通过导入让模块被识别,要么用discover命令主动扫描。
内容的提问来源于stack exchange,提问作者user2722968
相关产品推荐
相关产品推荐

