为何DateTime.UtcNow在MsTest多次测试中值不变,仅重编译后更新?
MsTest v2中DateTime.UtcNow值的缓存机制解析
测试场景复现
测试代码
[TestMethod] [DynamicData("TestInput")] public void Test(DateTime datetime) { Console.WriteLine(datetime); } public static IEnumerable<object[]> TestInput { get => new List<object[]> { new object[] { DateTime.UtcNow } }; }
异常现象
多次运行测试时,DateTime.UtcNow的输出值完全一致,只有重新编译项目(或重启Visual Studio)后,输出值才会更新。示例输出:
/* 编译测试项目后 */ Test output -> 11/16/2022 17:55:37 Test output -> 11/16/2022 17:55:37 Test output -> 11/16/2022 17:55:37 /* 重新编译后 */ Test output -> 11/16/2022 17:58:24 Test output -> 11/16/2022 17:58:24 Test output -> 11/16/2022 17:58:24
问题解答:缓存位置与原因
缓存逻辑
这个值是被MsTest的测试发现机制缓存的。
MsTest默认会在测试发现阶段(即测试运行器扫描项目识别测试用例的阶段)执行DynamicData绑定的数据源属性(也就是这里的TestInput的get方法),此时获取的DateTime.UtcNow值会被存入测试运行器的缓存中。后续每次运行测试,都会直接复用这个缓存值,不会重新执行TestInput的get方法,直到重新编译项目(或重启Visual Studio,触发新一轮测试发现流程)。
解决方案
通过设置程序集级别的特性,修改数据源的发现时机为测试执行阶段:
[assembly: TestDataSourceDiscovery(TestDataSourceDiscoveryOption.DuringExecution)]
设置后,MsTest会在每次运行测试时重新解析DynamicData数据源,DateTime.UtcNow就会每次返回最新的时间值,不会再被缓存。
内容的提问来源于stack exchange,提问作者Zephyr
相关产品推荐
相关产品推荐

