1

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

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

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

真实场景:

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

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

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

我想使用规范流程来测试这种情况。

出于日志记录的原因,我想将每次迭代拆分为不同的场景。所以不是编写包含许多子场景的特征文件,有没有办法告诉 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 调用并断言)
  2. 使用 param1 和 param2 调用场景(使用 param1 调用并断言,然后使用 param2 和断言调用)
  3. 使用 param1 和 param2 和 param3 调用场景(使用 param1 调用并断言,然后使用 param2 调用并断言,然后使用 param3 和断言调用)
  4. ...

我知道那个场景是原子测试单元,但是,如果我想执行这个任务 - 它怎么做?

4

1 回答 1

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 点用一个测试来代替它。

希望这可以帮助。

于 2013-10-01T22:52:41.767 回答