如何以编程方式告诉 NUnit 重复测试?

How to programmatically tell NUnit to repeat a test?

如何以编程方式告诉 NUnit 重复测试?

背景: 我在我的 C# 代码中使用 SimpleNameFilter 和 RemoteTestRunner 运行ning NUnit。我的应用程序读取一个 csv 文件,TestList.csv,它指定要 运行 的测试。到那时一切正常。

问题: 问题是当我在 TestList 文件中两次输入相同的测试名称时。在那种情况下,我的应用程序正确地读取并加载了带有两个测试名称实例的 SimpleNameFilter。然后将此过滤器传递给 RemoteTestRunner。然后,Nunit 只执行一次测试。似乎当 Nunit 看到它已经 运行 的第二个测试实例时,它会忽略它。

我怎样才能覆盖这种行为?我想让 NUnit 运行 与我的 TestList.csv 文件中指定的相同测试名称重复两次或更多次。

谢谢,

http://www.nunit.org/index.php?p=testCase&r=2.5

TestCaseAttribute serves the dual purpose of marking a method with parameters as a test method and providing inline data to be used when invoking that method. Here is an example of a test being run three times, with three different sets of data:

[TestCase(12,3, Result=4)]
[TestCase(12,2, Result=6)]
[TestCase(12,4, Result=3)]
public int DivideTest(int n, int d)
{
  return( n / d );
}

运行 两次相同的测试应该有相同的结果。单个测试可以通过也可以失败。如果您的测试有时有效而另一个失败,那么感觉就像发生了错误的事情。这就是为什么 NUnit 不支持开箱即用的原因。我想这也会导致报告测试结果的问题 运行,它是说测试 X 有效,还是如果两者都发生则失败?

您将在 Nunit 中获得的最接近的东西类似于 TestCaseSource 属性(您似乎已经知道)。您可以使用 TestCaseSource 指定一个方法,该方法可以依次从文件中读取。因此,例如,您可以有一个如下所示的文件 "cases.txt":

Test1,1,2,3
Test2,wibble,wobble,wet
Test1,2,3,4

然后像这样在你的测试中使用它:

[Test]
[TestCaseSource("Test1Source")]
public void Test1(string a, string b, string c) {
}

[Test]
[TestCaseSource("Test2Source")]
public void Test2(string a, string b, string c) {
}

public IEnumerable Test1Source() {
    return GetCases("Test1");
}

public IEnumerable Test2Source() {
    return GetCases("Test2");
}

public IEnumerable GetCases(string testName) {
    var cases = new List<IEnumerable>();

    var lines = File.ReadAllLines(@"cases.txt").Where(x => x.StartsWith(testName));
    foreach (var line in lines) {
        var args = line.Split(',');
        var currentcase = new List<object>();
        for (var i = 1; i < args.Count(); i++) {
            currentcase.Add(args[i]);
        }
        cases.Add(currentcase.ToArray());
    }
    return cases;
}

这显然是一个非常基本的示例,它导致 Test1 被调用两次,Test2 被调用一次,参数来自文本文件。然而,这再次只有在传递给测试的参数不同时才有效,因为 nunit 使用参数创建一个唯一的测试名称,尽管您可以通过让测试源为每个方法调用生成一个唯一的数字来解决这个问题并将其作为测试忽略的额外参数传递给测试。

另一种方法是 运行 来自脚本的 nunit,该脚本为文件的每一行一遍又一遍地调用 nunit,尽管我认为这可能会在您合并时导致其他问题来自多个 运行 的报告。