使用SpecFlow迭代场景步骤

时间:2013-09-30 08:49:18

标签: unit-testing bdd specflow

我正在使用SpecFlow来BDD我的应用程序。 我想迭代测试,而每次迭代都会重复之前指定的参数。

由于此步骤应执行约120次,我不想用不同的参数重写相同的测试。

是否可以仅迭代场景部分?

真实场景:

我有应用程序功能打开文件并关闭它。

我想打开和关闭文件,直到应用程序失败。

我制作的最后一个测试套件(使用纯C#代码)发现被测应用程序中的内存泄漏导致第10次迭代失败,仍然在调试测试的应用程序后,它在50次迭代时失败(同样由于内存泄漏)。

我想使用spec flow来测试这种情况。

出于记录原因,我想将每次迭代拆分为不同的场景。 因此,有没有办法让SpecFlow以递增的重复序列进行迭代,而不是编写包含许多子场景的特征文件?

情景:

Scenario Outline: Open and close fileTestScenario1
Given Ready for input
When Open file <file_name>
Then File content is visible

Examples:
    | file_name | 
    | param1   | 
    | param2   | 
    | param3   | 

所以我希望SpecFlow生成以下测试:

  1. 使用param1调用方案(使用param1和assert调用)
  2. 使用param1和param2调用方案(使用param1调用并断言然后使用param2调用并断言)
  3. 使用param1和param2以及param3调用方案(使用param1调用并断言然后使用param2调用并断言然后使用param3调用并断言)
  4. ...
  5. 我知道那个场景是原子测试单元,但是,如果我想执行这个任务 - 它怎么能完成?

1 个答案:

答案 0 :(得分:0)

如果您只是将测试标记为

,该怎么办?
Scenario Outline: Open and close fileTestScenario1
Given Ready for input
When Open file <file_name>
Then File content is visible

Examples:
| file_name | 
| param1    | 
| param1,param2   | 
| param1,param2,param3   | 

使用绑定

[When("Open file (\w+)"]
public void WhenOpenFiles(string names)
{
  foreach(var name in string.Split(',', names)
  {
       OpenFile(name);
  }
}

然而,这种方法(称为穷尽测试)并不是接近测试的最佳方法。在这种情况下你所做的一切都是为了遇到问题而进行了大量的测试。至少减少测试,以便不是运行1个文件,而是2个文件,然后3个等,而是直接跳转到50个文件,因为这也处理更简单的情况。您还应该使用这种方法来简单地诊断真正的问题是什么,然后编写一个能够直接解决问题的目标测试。

例如,我今天遇到了一个失败的现有测试,它只是因为它是星期一而失败,即它有一些日期逻辑,只会在发生的某些TimeSpan重叠期间失败在每个星期一。然而,我通过详尽的测试证明了这一点,

Foreach(var day in new[] { DayOfWeek.Monday, DayOfWeek.Tuesday, ....}
   Foreach(var hour in Enumerable.Range(0, 24)
     Console.Writeline(test(day, hour));

然后我删除了详尽的方法测试,因为我可以仅在周一上午10点用一次测试替换它。

希望这有帮助。