首页 > 解决方案 > C# 测试框架循环测试用例

问题描述

我希望使用 MS 测试框架来测试税收计算器,并且需要运行 100 多个测试用例。如下所示,我设置了一组测试用例并循环遍历每个测试用例,但是当我运行测试时,它只返回一个返回值。

问题:

  1. 有没有办法让每个测试显示结果?
  2. 如何返回每个测试结果?目前,系统仅在失败时返回值。
            [DataTestMethod]
            public void CalculateResult(int val)
            {

                // arrange
                int[] testCase = { 1000,2000, 35000, 400003, 59509 };

                foreach (int income in testCase)
                {

                    double expectOutput = TaxCalculator(income);

                    // act
                    
                    SUT.GeneralTaxRule generalTaxationRule = new SUT.GeneralTaxRule(income);
                    
                    double actualOutput = generalTaxationRule.getTax();

                    // assert
                    Assert.AreEqual(expectOutput, actualOutput);
                    Console.WriteLine(expectOutput, actualOutput);
                }

            }

标签: c#asp.net.netvisual-studiotesting

解决方案


当你使用DataTestMethod属性时,你应该有每个属性DataRow

[DataTestMethod]
[DataRow(1000)]
[DataRow(2000)]
// etc
public void CalculateResult(int income)
{
    double expectOutput = TaxCalculator(income);

    // act                        
    SUT.GeneralTaxRule generalTaxationRule = new SUT.GeneralTaxRule(income);                        
    double actualOutput = generalTaxationRule.getTax();

    // assert
    Assert.AreEqual(expectOutput, actualOutput);
    Console.WriteLine(expectOutput, actualOutput);
}

您可能实现的另一种方法是使用DynamicData属性

[DataTestMethod]
[DynamicData(nameof(TestData), DynamicDataSourceType.Method)]
public void CalculateResult(int income)
{
    double expectOutput = TaxCalculator(income);

    // act                        
    SUT.GeneralTaxRule generalTaxationRule = new SUT.GeneralTaxRule(income);                        
    double actualOutput = generalTaxationRule.getTax();

    // assert
    Assert.AreEqual(expectOutput, actualOutput);
    Console.WriteLine(expectOutput, actualOutput);
}

public static IEnumerable<object[]> TestData()
{
    yield return new object[] { 1000 };
    yield return new object[] { 2000 };
    /// etc.
}

您可以在上面按照您喜欢的方式对数据进行数据驱动TestData(例如文件、数据库或硬编码)。DynamicDataSourceType您还可以调查其他选项。


推荐阅读