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

时间:2015-06-08 21:24:08

标签: c# nunit

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

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

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

如何覆盖此类行为?我希望让NUnit在我的TestList.csv文件中指定两次或更多次运行相同的测试名称。

谢谢,

2 个答案:

答案 0 :(得分:1)

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

  

TestCaseAttribute用于标记方法的双重目的   参数作为测试方法并提供在何时使用的内联数据   调用该方法。以下是运行三个测试的示例   时间,有三组不同的数据:

[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 );
}

答案 1 :(得分:0)

两次运行相同的测试应该具有相同的结果。单个测试可以通过,也可以失败。如果你的测试有时会工作并且失败,那么感觉就像错误的事情一样。这就是为什么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,尽管我想这可能会在你整理报告时引起其他问题。多次运行。