为什么TeamCity中不同测试类运行时会出现10秒左右的间隔停顿?
TeamCity 测试类间延迟问题排查方案
可能的诱因
- 测试类初始化开销:每个新测试类启动时会触发类加载、静态资源初始化、依赖注入容器初始化、外部资源(数据库、缓存、消息队列)预连接等操作,同一测试类内的测试会复用已经初始化完成的上下文,因此不会产生额外间隔。
- TeamCity 2019.1.5 测试 runner 上报缺陷:该版本的官方测试 runner 默认采用单测试类执行完成后同步上报结果到服务端的机制,若agent与服务端之间存在网络抖动、服务端测试结果处理队列排队,就会出现类切换时的空白等待时间。
- 测试框架的隔离策略配置:如JUnit、NUnit、xUnit等测试框架如果开启了每个测试类独立重置上下文、销毁并重建所有依赖对象的配置,也会在类切换阶段产生额外的资源开销。
重构为大类的可行性评估
不建议采用合并测试为大类的方案,该方案属于牺牲可维护性换临时性能的错误优化,会导致测试职责边界模糊、单测试失败排查成本上升、无法灵活配置单类前置/后置逻辑等长期问题。如果要优化类初始化开销,优先选择上下文复用、资源懒加载、全局前置初始化等方案,不要调整测试类的拆分逻辑。
TeamCity 对应优化配置
- 开启测试结果批量上报:进入对应构建步骤的配置页,找到测试报告设置板块,开启
批量上报测试结果选项,将单类同步上报调整为每累计N个测试/每隔固定时间批量上报,大幅降低网络请求频次。 - 升级对应测试 runner 插件:TeamCity 2019.1.5 自带的各语言测试 runner 存在已知的类间执行效率缺陷,可在服务端插件管理页更新对应语言的测试 runner 到最新兼容版本,无需升级整个TeamCity服务端即可解决部分上报延迟问题。
- 配置并行测试执行:若你的单元测试无全局状态依赖、支持并行执行,可在构建配置的测试运行参数中开启
并行测试执行,设置按测试类并行的粒度,重叠不同类的初始化等待时间,降低整体延迟对总构建时长的影响。 - 调整测试运行日志级别:如果测试步骤开启了debug级别的运行日志,每个测试类执行完成后的日志写入、同步操作也会产生额外开销,将日志级别调整为INFO即可消除这部分延迟。
内容的提问来源于stack exchange,提问作者John Doe
相关产品推荐
相关产品推荐

