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

MS Test 1.3如何将DataRow定义在独立类中用于单元测试?

在MS Test 1.3中分离[DataRow]到独立类的解决方案

没问题,虽然MS Test 1.3不像xUnit那样有内置的Fixture参数化机制,但确实有几种靠谱的方法能把你的测试用例数据移到独立类中,让测试代码更整洁易维护。下面是两种最实用的方案:

方案1:使用ObjectDataSource分离测试数据(推荐)

这种方法能让每个测试用例在测试报告中单独显示,失败时便于精准定位,非常适合处理10-20个测试用例的场景。

步骤1:定义测试数据模型

先创建一个类来封装单条测试用例的参数和预期结果:

public class CalculationTestCase
{
    public int Input1 { get; set; }
    public int Input2 { get; set; }
    public int ExpectedResult { get; set; }

    public CalculationTestCase(int input1, int input2, int expectedResult)
    {
        Input1 = input1;
        Input2 = input2;
        ExpectedResult = expectedResult;
    }
}

步骤2:创建独立的测试数据提供类

把所有测试用例集中放在这个类里,方便统一维护:

using System.Collections;
using System.Collections.Generic;

namespace YourTestNamespace
{
    public static class CalculationTestData
    {
        public static IEnumerable GetTestCases()
        {
            return new List<CalculationTestCase>
            {
                new CalculationTestCase(1, 2, 3),
                new CalculationTestCase(5, 5, 10),
                new CalculationTestCase(0, 0, 0),
                new CalculationTestCase(-1, 3, 2),
                // 这里可以继续添加更多测试用例
            };
        }
    }
}

步骤3:在测试方法中使用数据源

通过[DataSource]特性绑定到上面的数据提供类,同时利用TestContext获取当前测试用例:

using Microsoft.VisualStudio.TestTools.UnitTesting;

[TestClass]
public class CalculatorTests
{
    [TestMethod]
    [DataSource(
        "Microsoft.VisualStudio.TestTools.DataSource.ObjectDataSource", 
        "YourTestNamespace.CalculationTestData, YourTestAssemblyName", 
        "GetTestCases", 
        DataAccessMethod.Sequential)]
    public void Add_WhenGivenTwoNumbers_ReturnsSum()
    {
        // 从数据源获取当前测试用例
        var testCase = (CalculationTestCase)TestContext.DataRow["Item"];

        // 执行测试逻辑
        var calculator = new Calculator();
        var result = calculator.Add(testCase.Input1, testCase.Input2);

        // 断言验证
        Assert.AreEqual(testCase.ExpectedResult, result);
    }

    // 必须声明TestContext属性,MS Test会自动注入
    public TestContext TestContext { get; set; }
}

注意:替换YourTestNamespace和YourTestAssemblyName为你实际的命名空间和程序集名称(比如测试项目的名称)。

方案2:静态数据集合+测试方法内循环(简单快速)

如果觉得DataSource配置有点繁琐,这种方法更直接,但缺点是所有用例会作为一个测试执行,单个用例失败会导致整个测试标记为失败。

步骤1:定义静态测试数据集合

using System.Collections.Generic;

namespace YourTestNamespace
{
    public static class CalculationTestData
    {
        public static readonly List<(int Input1, int Input2, int ExpectedResult)> TestCases = new List<(int, int, int)>
        {
            (1, 2, 3),
            (5, 5, 10),
            (0, 0, 0),
            (-1, 3, 2),
            // 更多测试用例
        };
    }
}

步骤2:在测试方法中遍历执行

using Microsoft.VisualStudio.TestTools.UnitTesting;

[TestClass]
public class CalculatorTests
{
    [TestMethod]
    public void Add_WhenGivenTwoNumbers_ReturnsSum()
    {
        foreach (var testCase in CalculationTestData.TestCases)
        {
            var calculator = new Calculator();
            var result = calculator.Add(testCase.Input1, testCase.Input2);

            // 添加自定义错误信息,方便定位失败用例
            Assert.AreEqual(
                testCase.ExpectedResult, 
                result, 
                $"Failed for inputs: {testCase.Input1} + {testCase.Input2}");
        }
    }
}

总结

  • 推荐使用方案1,因为它能在测试报告中独立显示每个测试用例的结果,排查问题更高效,尤其适合大量测试用例的场景。
  • 方案2适合快速验证或用例数量较少的场景,优点是实现简单,无需额外配置。

内容的提问来源于stack exchange,提问作者Kacper Stachowski

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 12:17:41