如何让带数组参数的DataTestMethod执行所有DataRow测试用例?
解决MSTest中数组参数DataRow仅执行一次的问题
问题根源
MSTest的[DataRow]属性要求传入的参数必须是编译时常量,而new int[] { ... }是运行时创建的引用类型实例,不属于编译时常量范畴。这种写法本质上不符合属性参数的语法规范,导致编译器仅能识别第一个DataRow,后续的DataRow会被忽略。
解决方案:用[DynamicData]替代[DataRow]
[DynamicData]支持从静态方法或属性中获取测试数据,完美适配数组、自定义对象等引用类型的测试场景。修改后的代码如下:
[DataTestMethod] [DynamicData(nameof(GetAddTest2Data), DynamicDataSourceType.Method)] public void AddTest2(int[] input, int[] expectedOutput) { Assert.AreEqual(input[0], expectedOutput[0]); } // 提供测试数据的静态方法 public static IEnumerable<object[]> GetAddTest2Data() { yield return new object[] { new int[] { 1, 2, 3, 4 }, new int[] { 1, 3, 6, 10 } }; yield return new object[] { new int[] { 1, 1, 1, 1, 1 }, new int[] { 1, 2, 3, 4, 5 } }; yield return new object[] { new int[] { 3, 1, 2, 10, 1 }, new int[] { 3, 4, 6, 16, 17 } }; }
补充说明
[DynamicData]的参数nameof(GetAddTest2Data)指定了提供测试数据的静态方法名,DynamicDataSourceType.Method说明数据来源是方法(也可以用属性)。- 静态方法返回
IEnumerable<object[]>,每个object[]对应一组测试参数,顺序要和测试方法的参数列表完全匹配。 - 修改后测试框架会遍历所有返回的测试数据组,逐个执行测试方法。
内容的提问来源于stack exchange,提问作者AdrianM1996
相关产品推荐
相关产品推荐

