【问题标题】:C# Testing Framework Loop Through Test CasesC# 测试框架循环测试用例
【发布时间】:2020-11-23 11:03:16
【问题描述】:

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

问题:

  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 .net visual-studio testing


【解决方案1】:

当您使用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 还有其他选项可供您调查。

【讨论】:

  • 是的,但问题是我会有一个包含 100 个不同值的数组,在 MS 框架中这样做很麻烦?有更好的方法吗?
【解决方案2】:

如果您使用[DataTestMethod],您可以通过一个或多个[DataRow(...)] 属性添加测试用例:

[DataTestMethod]
[DataRow(1000)]
[DataRow(2000)]
[DataRow(35000)]
[DataRow(400003)]
[DataRow(59509)]
public void CalculateResult(int val)
{
    double expectOutput = TaxCalculator(val);

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

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

这样您就可以在“测试资源管理器”窗口中检查每个val 的测试结果。

【讨论】:

    【解决方案3】:

    使用 Xunit,您可以这样做:

    private static int[] incomesArray = { 1000,2000, 35000, 400003, 59509 };
    
    public static IEnumerable<object[]> GetIncomeTestData =>
                    incomesArray
                    .Select(x => new object[] { x })
                    .ToArray();
    
    [Theory]
    [MemberData(nameof(GetIncomeTestData))]
    public void CalculateResult(int income)
    {
        // arrange
        var expectOutput = TaxCalculator(income);
        var generalTaxationRule = new SUT.GeneralTaxRule(income);
                    
        // act            
        var actualOutput = generalTaxationRule.getTax();
    
        // assert
        Assert.Equal(expectOutput, actualOutput);
    }
    

    您可以在incomesArray 中拥有任意数量的值,并且您将能够看到每个测试值的结果。

    【讨论】:

      猜你喜欢
      • 2018-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-16
      • 2016-03-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多