有个单元测试项目,目标测试类有ABCD四个测试方法。希望按照一定顺序执行,也就是A必须先执行,BCD依赖A的执行结果。启用PriorityOrderer优先级排序后,再跑测试,通过日志线程号发现,整个测试分成了两组,A独立一组,BCD作为另一组,两组之间并行执行,而组内按优先级排序。

注:PriorityOrderer由开源项目'NewLife.UnitTest'提供,在测试类头部加上特性:

[TestCaseOrderer("NewLife.UnitTest.PriorityOrderer", "NewLife.UnitTest")]

测试方法头部加上特性指定优先级顺序:

[TestOrder(1)]

问题阐述

以下日志说明被分为两组执行:

15:56:58.530 19 N LongTask 使用[PriorityOrderer/优先级顺序]测试: Route.Test.PlanStrategies.BaseRouteDsDicTests, 用例:1
15:56:58.539 17 N LongTask NewLife.Core v10.6.2023.1218-beta1120 Build 2023-12-18 19:20:00 .NET 8.0
15:56:58.540 17 N LongTask NewLife组件核心库 ©2002-2023 NewLife
15:56:58.546 17 N LongTask testhost v17.8.0 Build 2000-01-01 .NET Core 3.1
15:56:58.546 17 N LongTask testhost © Microsoft Corporation. All rights reserved.
15:56:58.546 17 N LongTask 使用[PriorityOrderer/优先级顺序]测试: Route.Test.PlanStrategies.BaseRouteDsDicTests, 用例:3
15:56:58.555 19 N LongTask 1-Route.Test.PlanStrategies.BaseRouteDsDicTests-CreateRouteDic
15:56:58.555 17 N LongTask 2-Route.Test.PlanStrategies.BaseRouteDsDicTests-FindAllForLastById
15:56:58.555 17 N LongTask 3-Route.Test.PlanStrategies.BaseRouteDsDicTests-FindAllForFirstById
15:56:58.555 17 N LongTask 4-Route.Test.PlanStrategies.BaseRouteDsDicTests-FindAll
15:57:04.077 17 N LongTask Bootstrap.Init

分析经过

NewLife.UnitTest早两年用起来都没有问题,最近半年出现多次这种同一个测试类多方法并行执行的情况,但也不是每次都这样。这个问题一直没能解决。

今天正好有测试环境,给该类某个测试方法下断点,在vs资源管理器中,测试类文件上执行调试测试。此时vs在断点出断下来,查看调用堆栈,可以看到上层xunit调用方法。

打开vs源码调试,打开系统级代理,双击上层调用方法,等一会源码下载完成以后,即可看到整个调用栈,以及其中的大部分变量数据。

多次下断点重复调试,发现一个问题:最上层的一批断点,永远不会执行!

由此可以判断,那些代码早就执行过了,我们每次操作vs运行测试,只不过是vs某个独立进程中间某个函数反射执行了目标测试程序集。

既然这样,重启vs,成功解决了问题!

总结

单元测试项目的某些设置,可能需要重启vs才能生效!

(在此,强烈推荐我们的 NewLife.UnitTest ,Nuget引入开箱即用!)