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

时间:2016-08-22 20:06:00

标签: 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) 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

虽然这在技术上可行,但会导致难以维护的功能代码:每个功能后面都会显示支持的模拟器列表。添加对其他模拟器的支持需要在每个测试中添加相同的行。

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

2 个答案:

答案 0 :(得分: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输出应该清晰。

答案 1 :(得分:0)

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

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  |