如何从main_folder根目录递归运行所有子目录下的Python unittest测试
问题原因及解决方案
问题原因
unittest discover默认递归扫描目录时,会将不含__init__.py的目录判定为非Python包目录,跳过后续的子目录扫描。你的目录结构中proj1、proj2两个目录下没有添加空的__init__.py文件,所以从main_folder启动扫描时,进入proj1/proj2目录后就会停止向下扫描,自然识别不到内层的测试用例。
单独指定proj1/proj2为扫描起始目录时,扫描逻辑直接从这两个目录向下查找test子目录,不需要判定上级目录的包属性,所以可以正常识别测试。
解决方案
- 方案1:修改目录结构(最简单)
在proj1、proj2目录下各添加一个空的__init__.py文件,调整后的目录结构如下:
main_folder | -- proj1 |------ __init__.py # 新增空文件 |------ code |-------- __init__.py |-------- my_file_proj1.py |-------test |-------- __init__.py |-------- test_my_file_proj1.py -- proj2 |------ __init__.py # 新增空文件 |------ code |-------- __init__.py |-------- my_file_proj2.py |-------test |-------- __init__.py |-------- test_my_file_proj2.py
之后直接在main_folder下执行原命令即可:python -m unittest discover .
方案2:命令行直接指定测试文件路径(无需修改目录结构)
如果不想修改目录结构,可以直接通过通配符匹配所有测试文件传入unittest:- Unix/Linux/macOS(bash环境):
先执行shopt -s globstar开启递归通配,再运行:python -m unittest **/test_*.py - Windows PowerShell环境:
python -m unittest (Get-ChildItem -Recurse -Filter test_*.py).FullName
- Unix/Linux/macOS(bash环境):
方案3:编写统一测试入口脚本(无需修改目录结构,跨平台通用)
在main_folder下新建run_all_tests.py,内容如下:
import unittest import os def load_tests(loader, standard_tests, pattern): root_dir = os.path.dirname(__file__) all_tests = loader.discover(start_dir=root_dir, pattern="test_*.py") standard_tests.addTests(all_tests) return standard_tests if __name__ == "__main__": unittest.main(defaultTest="load_tests")
之后直接执行python run_all_tests.py即可递归运行所有测试用例。
内容的提问来源于stack exchange,提问作者tomiyos654
相关产品推荐
相关产品推荐

