使用TestCase属性的Nunit执行顺序

时间:2014-11-27 22:21:30

标签: c# .net nunit testcase order-of-execution

我正在尝试使用NUnit框架运行一些性能测试,例如:

[TestCase(1)]
[TestCase(10)]
[TestCase(100)]
[TestCase(1000)]
public void SaveBookingTest(int numberOfItems)
{
    var stopwatch = new Stopwatch();

    var items = DataFactory.CreateItems(numberOfItems);

    stopwatch.Start();
    service.SaveItems(items);
    stopwatch.Stop();

    SaveResults(stopwatch.ElapsedMilliseconds);
}

...结果是:

  
      
  1. 22:56:01:在数据库中保存1000项:48353ms - 平均值:20,6812400321项/秒。
  2.   
  3. 22:56:02:在数据库中保存1项:40ms - 平均:25项/秒。
  4.   
  5. 22:56:06:在数据库中保存100项:3813ms - 平均值:26,2260687323项/秒。
  6.   
  7. 22:56:07:在数据库中保存10项:413ms - 平均:24,2130750605项/秒。
  8.   

所以我期望首先运行[TestCase(1)],然后运行[TestCase(10)],依此类推。但是从结果中可以看出,这种情况并没有发生。反正有控制吗?看起来有点随机的测试用例首先完成。

根据NUnit documentation,我想答案是你不能。

  

因此,当TestCaseAttribute在方法上多次出现或者其他数据提供属性与TestCaseAttribute结合使用时,测试用例的顺序是未定义的。

你们有什么好主意如何控制执行?小黑客? 这样做的另一种方式?什么?

1 个答案:

答案 0 :(得分:1)

您是否考虑过使用TestCaseSourceAttribute?或者它不适用于您的特定情况?文档中有趣的部分是:

  

但是,当单独使用单个TestCaseSourceAttribute时,测试的顺序完全遵循从源返回测试用例的顺序。

修改后的代码如下所示:

[Test, TestCaseSource("GetTestCaseSource")]
public void SaveBookingTest(int numberOfItems)
{
    var stopwatch = new Stopwatch();

    var items = DataFactory.CreateItems(numberOfItems);

    stopwatch.Start();
    service.SaveItems(items);
    stopwatch.Stop();

    SaveResults(stopwatch.ElapsedMilliseconds);
}

public IEnumerable<int> GetTestCaseSource()
{
    return new[] { 1, 10, 100, 1000 };
}