【问题标题】:How to programmatically tell NUnit to repeat a test?如何以编程方式告诉 NUnit 重复测试?
【发布时间】:2015-06-08 21:24:07
【问题描述】:

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

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

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

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

谢谢,

【问题讨论】:

  • 你能解释一下你为什么要这样做吗?
  • 嗨 Lloyd:看起来确实不错,但是,它似乎只适用于 Microsoft 单元测试工具而不适用于 NUnit?
  • 您好 Jeroen:原因是在 TestList 文件中我想调用相同的测试,但是使用不同的参数。例如,我有一个检查温度传感器的测试,但是,我可能有可变数量的温度传感器:readTemperature sensor0, min0, max0;读取温度传感器 1、min1、max1;读取温度传感器N, minN, maxN;
  • [TestCaseSource] 属性应该允许您以编程方式确定要执行测试的次数以及 wath 参数。

标签: c# nunit


【解决方案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 );
}

【讨论】:

  • 嗨 Vitaly:这很好,但是,测试在编译时得到修复的次数。此外,在您的回答中,测试数据也是固定的,可以使用 TestCaseSource() 来修复。但是,在我的应用程序中,我事先不知道测试会被调用多少次。我正在寻找的是告诉 NUnit 运行测试的次数与我的 TestList.csv 文件中包含的测试名称一样多。
【解决方案2】:

两次运行相同的测试应该有相同的结果。单个测试可以通过也可以失败。如果您的测试有时有效而另一个失败,那么感觉就像发生了错误的事情。这就是为什么 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,尽管我想这可能会在您合并多次运行的报告时给您带来其他问题.

【讨论】:

  • 谢谢你。这是一个很好的答案。你给出了一些非常好的建议来考虑。我将继续使用 TestCaseSource。
猜你喜欢
  • 2011-05-04
  • 2011-04-05
  • 1970-01-01
  • 1970-01-01
  • 2018-02-11
  • 1970-01-01
  • 2012-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多