Cucumber 在多个场景大纲中使用相同的示例

Cucumber 在多个场景大纲中使用相同的示例,cucumber,acceptance-testing,scenarios,Cucumber,Acceptance Testing,Scenarios,如何为以下程序构造测试: 我正在为模拟组合电路编写一个单元测试框架。该框架将支持多个数字逻辑模拟器(JLS、Logisim、TKGate等),因此,每个受支持的模拟器的每个测试应运行一次 我的第一个想法是这样做: Scenario Outline: Test of valid circuit when I run DLUnit with "testCircuit1.<type> testFile" Then I should see "All tests (4) passe

如何为以下程序构造测试:

我正在为模拟组合电路编写一个单元测试框架。该框架将支持多个数字逻辑模拟器(JLS、Logisim、TKGate等),因此,每个受支持的模拟器的每个测试应运行一次

我的第一个想法是这样做:

Scenario Outline:  Test of valid circuit
  when I run DLUnit with "testCircuit1.<type> testFile"
  Then I should see "All tests (4) passed." on stdout
  Examples:
      | type |
      | jls  |  # extension for JLS files
      | circ |  # extension for Logisim files
      | v    |  # extension for tkgate files

Scenario Outline:  Test of invalid circuit
  when I run DLUnit with "brokenCircuit1.<type> testFile"
  Then I should see "There were failures" on stdout
  Examples:
      | type |
      | jls  |
      | circ |
      | v    |

 # Many more tests to follow
场景大纲:有效电路测试
当我使用“testCircuit1.testFile”运行DLUnit时
然后我会在stdout上看到“所有测试(4)都通过”
示例:
|类型|
|jls文件的jls |#扩展名
|Logisim文件的circ |#扩展名
|tkgate文件的v |#扩展名
场景概述:测试无效电路
当我使用“brokenCircuit1.testFile”运行DLUnit时
然后我会在stdout上看到“有失败”
示例:
|类型|
|jls|
|保监会|
|五|
#还有很多测试要做
虽然这在技术上是可行的,但它会产生可能难以维护的功能代码:每个功能后面都有一个受支持模拟器的列表。添加对附加模拟器的支持需要在每个测试中添加相同的行


我还可以创建
jls.feature
,然后使用
sed
自动创建
logisim.feature
tkgate.feature
;但是,如果Cucumber提供了一个更简单的内置解决方案,我想避免这种复杂性。

不是对现有解决方案的升级,而是合并到一个场景大纲中。 添加新的模拟器,您需要在一个示例表中进行两个更改。此外,您还可以根据两个模拟器的不同有效测试文件中的更改或不同的结果消息使其更具可配置性。但是,对于您现有的解决方案,也可以这样做。不管怎样,您都必须更改步骤和示例

Scenario Outline:  Testing circuit
  when I run <kind> DLUnit with "<circuit>.<type> testFile"
  Then I should see <result> on stdout

      Examples: 
      | type | kind    | circuit         | result               |
      | jls  | valid   | testCircuit1    | All tests (4) passed |
      | jls  | invalid | brokenCircuit1  | There were failures  |
      | circ | valid   | testCircuit1    | All tests (4) passed |
      | circ | invalid | brokenCircuit1  | There were failures  |
      | v    | valid   | testCircuit1    | All tests (4) passed |
      | v    | invalid | brokenCircuit1  | There were failures  |
场景大纲:测试电路
当我用“.testFile”运行DLUnit时
那我就去看电影了
示例:
|类型|种类|电路|结果|
|jls |有效|测试电路1 |所有测试(4)均通过|
|jls |无效|断路1 |出现故障|
|circ |有效|测试电路1 |所有测试(4)均通过|
|中国保监会|无效|中断电路1 |出现故障|
|v |有效|测试电路1 |所有测试(4)均通过|
|v |无效|断路1 |出现故障|

也许您可以在RSpec中执行类似的操作:

describe DLUnit do
  [
    'jls', 'testCircuit1', true,
    'jls', 'brokenCircuit1', false,
    # ...
  ].each do |simulator, circuit, expected_validity|
    it "with the #{simulator} simulator finds the #{circuit} circuit #{expected_validity ? 'valid' : 'invalid' }" do
      actual_output = DLUnit.run "#{circuit.simulator}" # obviously I'm making this part up
      expect(actual_output).to include(expected_validity ? 'passed' : 'failures')
    end
  end
end

测试代码本身有点复杂,但您只需编写一次,RSpec输出应该是清晰的。

也许我不明白,但据我所知,每个新的模拟器只需要两次,上面的每一个场景对我来说都很好。我不喜欢引用外部文件。它隐藏了决策规则。我只列出了上面的两个例子。我预计完成后会出现10到20种情况。@DaveMcNulla,您具体指的是哪些外部文件?输入数据文件(
brokenCircuit.[jls,circuit,v]
testFile
)?@zach这就是我要说的,文件运行不是个坏主意;但是(正如你所建议的),这可能更多的是一种“横向移动”,而不是一种改进。我主要担心的是,场景名称不再清楚地指示正在测试的内容。我在上面列出了两个示例测试;但是,我将添加更多的测试来验证不同类型的故障是否被正确识别和报告。正如您所提到的,每个模拟器可能有10到20个场景,您必须决定是希望同时运行一个模拟器的所有测试,还是为所有模拟器运行一种测试。然后将场景分割。我提到的方法将过于繁琐,因为示例部分将爆炸式地出现。在这种情况下,使用RSpec是一种可行的方法。测试结果不如黄瓜测试结果好;但是,总的来说,RSpec要简单得多。我确实需要编写一些定制的匹配程序,以使规范能够很好地阅读;但是,这对于支付所有其他福利来说是一个很小的代价。