You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 19:30:41