PyCharm Unittest实现包间串行、包内并行测试方案问询
问题场景
我正在为已发布的Web应用编写单元测试,应用存在一个全局持久化变量,该变量会改变应用功能且在用户所有会话中生效。我想利用多测试并行的效率,但依赖不同变量值的测试不能同时运行。目前已根据变量预期值将测试拆分为SingleHome、Apartment等独立包,需要实现:
- 测试包之间串行执行(避免变量值冲突)
- 单个包内的测试并行执行(利用多进程提升效率)
当前使用PyCharm Unittest,通过「Run Configuration -> Additional Arguments」添加-n 6实现并行。
现有文件夹结构
Tests SingleHome __init__.py test_Entity_CRUD.py test_Entity_UI.py Apartment __init__.py test_Entity_CRUD.py test_Entity_UI.py
解决方案
1. 给测试包添加全局初始化/清理逻辑
在每个测试包的__init__.py中,使用Unittest的setUpModule和tearDownModule函数,实现包级别的前置初始化和后置清理,确保包内所有测试运行前设置好对应的全局变量,运行后恢复初始状态。
示例:SingleHome/__init__.py
def setUpModule(): # 设置当前包测试所需的全局变量值 # 示例:调用应用API修改持久化变量为SingleHome模式 pass def tearDownModule(): # 清理全局变量,恢复到默认状态,避免影响下一个测试包 # 示例:重置应用的持久化变量 pass
Apartment/__init__.py同理,替换为对应变量的设置逻辑。
2. 实现包级串行、包内并行的执行方式
方案A:自定义执行脚本(推荐)
编写Python脚本,逐个调用每个测试包的并行执行命令,确保包之间串行,包内并行:
import subprocess import sys # 按需要的顺序定义测试包列表 test_packages = [ "Tests.SingleHome", "Tests.Apartment" ] # 并行参数,和之前使用的-n 6一致 parallel_args = ["-n", "6"] for package in test_packages: print(f"启动测试包:{package}") # 构造Unittest执行命令 cmd = [sys.executable, "-m", "unittest"] + parallel_args + [package] # 执行命令,等待当前包完成后再执行下一个 subprocess.run(cmd, check=True) print(f"测试包{package}执行完成")
在PyCharm中创建Python运行配置,运行该脚本即可。
方案B:PyCharm多配置分组
如果不想写脚本,可手动创建多个Unittest运行配置,再组合成顺序执行的组:
- 创建第一个Unittest配置:目标选择
SingleHome包,在「Additional Arguments」中添加-n 6 - 创建第二个Unittest配置:目标选择
Apartment包,同样添加-n 6 - 创建运行配置组,将上述两个配置加入组内,设置组内配置按顺序执行
注意事项
- 确保
setUpModule和tearDownModule的逻辑能被所有并行进程读取到(比如修改的是应用全局配置而非本地进程变量) - 包内并行测试需注意会话隔离,避免测试用例间的会话干扰
- 可根据测试耗时或业务逻辑调整测试包的执行顺序
内容的提问来源于stack exchange,提问作者Mandelbrotter
相关产品推荐
相关产品推荐

