使用 TestCaseSource 时的迭代次数

Iteration number when using TestCaseSource

是否可以在使用 TestCaseSource 属性时获取每个测试用例的迭代次数?

例如

public static object[][] MyTestCases =
{ 
    new object[] { 1 , 3},  //iteration 1
    new object[] { 7 , 9},  //iteration 2
    new object[] { 3 , 5},  //iteration 3
}
[Test, TestCaseSource(nameof(MyTestCases))]
public void MyTest(int valA, valB){


    Assert.That(result, Is.EqualTo(valB), $"Some reason"); // <---- include the iteration with the message
}

我希望能够在断言消息中包含迭代次数。

有两种可能的方法:

  1. 包括迭代次数作为方法的参数。

  2. 对每个参数集使用 TestCaseData 个实例而不是 object[]TestCaseData 允许您为测试指定一个名称,如果您愿意,可以包含您的交互编号。

A学院在尝试解决某个问题后不久就找到了解决方案。

它结合了 TestCaseData 和 C# 5.0 CallerLineNumber 属性。

public static MyTestCaseData[] MyTestCases =
{ 
    new MyTestCaseData(1 , 3),  //iteration 1
    new MyTestCaseData(7 , 9),  //iteration 2
    new MyTestCaseData(3 , 5),  //iteration 3
}
[Test, TestCaseSource(nameof(MyTestCases))]
public void MyTest(int valA, valB){


    Assert.That(result, Is.EqualTo(valB), $"Some reason"); // <---- include the iteration with the message
}


public class MyTestCaseData : TestCaseData
{
    public MyTestCaseData(int valA, int valB [CallerLineNumber] int lineNumber = -1) 
        : base(valA, valB)
        {
                SetName($"(#{lineNumber}) - My Test Name");
        }
}

只要您提供可选参数[CallerLineNumber] int lineNumber = -1,它将使用与迭代实例化相关的行号进行初始化。

不完全确定这是如何工作的,我希望这是执行测试的 NUnit 框架中的某行。