MS Test简单测试结果不一致:添加对象参数为何改变输出格式?
为何添加dummy对象参数会导致MS Test测试结果合并?
我有两个结构相似的MS Test测试方法,但在Visual Studio测试资源管理器中的展示和结果汇总逻辑完全不同:
[TestClass] public class UnitTest1 { [TestMethod("Test Method")] [DataRow("String#1", 1, DisplayName = "String#1-1 Display Name")] [DataRow("String#2", 2, DisplayName = "String#2-2 Display Name")] public void Test(string s, int i) { Console.WriteLine($"{s}-{i}"); } [TestMethod("Test Method with Dummy object")] [DataRow("String#1", 1, typeof(object), DisplayName = "String#1-1 Display Name")] [DataRow("String#2", 2, typeof(object), DisplayName = "String#2-2 Display Name")] public void TestWithDummy(string s, int i, object dummy) { Console.WriteLine($"{s}-{i}-{dummy}"); } }
两者的差异表现:
Test方法:每个DataRow对应一个独立的测试条目,点击详情能看到该条目的单独结果TestWithDummy方法:所有DataRow的结果都合并到同一个测试条目下,用设置的DisplayName展示,详情里会列出所有DataRow的执行结果
原因分析
这是MS Test框架对参数序列化能力的判断导致的:
- 当测试方法的参数都是简单可序列化类型(比如
string、int这类值类型/基础引用类型),框架可以为每个DataRow生成唯一的测试标识,所以会拆分成独立测试条目 - 当参数包含无法被框架简单序列化的类型(比如这里的
object实例、Type类型),框架无法区分不同DataRow的唯一性,只能将所有DataRow归为同一个测试条目,最终合并展示结果
调整建议
如果需要改变默认行为:
- 若想让带复杂参数的测试生成独立条目:改用
[DynamicData]特性提供测试数据,它对复杂类型的支持更好,能为每个测试用例生成唯一标识 - 若想让简单参数的测试合并结果:可以通过
[TestCategory]给测试分组,或者利用MS Test的自定义测试分组逻辑,但核心还是依赖参数序列化的判断逻辑
环境信息:VS2022 17.6.5、.NET 7、MS Test SDK 17.7.0、MS Test Adapter及TestFramework 3.1.1
内容的提问来源于stack exchange,提问作者making
相关产品推荐
相关产品推荐

