Python nosetests多进程并行运行时自定义插件add类钩子未被调用
Nose多进程并行模式下自定义插件add类钩子不触发的核心原因
底层进程模型差异
Nose的并行测试能力由内置的multiprocess插件提供,其运行逻辑和单进程模式存在本质区别:
- 单进程模式下,所有测试用例在主进程内执行,测试运行器会直接调用挂载在主进程上的插件实例的
addSuccess/addError/addFailure等回调钩子,收集每个用例的执行状态。 - 开启
--processes=16参数后,多进程插件会将待执行的测试用例拆分,分发到独立的子进程中运行。子进程负责执行分配到的用例,仅将最终的执行结果序列化后通过管道回传给主进程。主进程上挂载的自定义插件实例,完全不参与子进程内部的测试执行流程,自然无法接收到子进程内触发的add类回调。
为什么report方法能正常触发
report钩子是主进程在所有子进程执行结束、测试流程整体收尾阶段调用的,这个流程和子进程内部的测试执行链路完全解耦,不受多进程隔离机制影响,因此可以正常执行。
同样可以适配多进程的内置插件(比如代码里用到的xunitmp)能正常输出报告,是因为它本身就适配了多进程的回传链路:既会在子进程侧收集单测试的执行状态,又会在主进程侧接收到回传数据后统一聚合输出,没有依赖主进程上的插件实例去接收单个测试的add类钩子。
适配并行模式的实现方向
如果要在并行场景下收集测试执行数据,不需要强行让主进程的插件实例触发add类钩子,可以按照两个方向调整:
- 参考
xunitmp插件的实现逻辑,在子进程初始化阶段将插件的收集逻辑挂载到子进程的测试运行器上,让子进程执行用例时正常触发add类钩子,将收集到的状态数据随子进程的结果回传链路一并发给主进程 - 直接复用多进程插件已经回传到主进程的结构化测试结果,在主进程的
report方法中直接提取对应状态做聚合,不需要单独对接add类钩子
内容的提问来源于stack exchange,提问作者fo1n
相关产品推荐
相关产品推荐

