【问题标题】:Use the same examples in multiple Cucumber scenario outlines在多个 Cucumber 场景大纲中使用相同的示例
【发布时间】:2016-08-22 20:05:59
【问题描述】:

我如何为以下程序构建测试:

我正在为模拟组合电路编写一个单元测试框架。该框架将支持多个数字逻辑模拟器(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 提供更简单的内置解决方案,我想避免这种复杂性。

【问题讨论】:

  • 也许我不明白,但据我了解,对于上述每个场景,您只会拥有两次新模拟器,这对我来说似乎很好。
  • 我不喜欢引用外部文件。它隐藏了决策规则。
  • 上面我只列举了两个例子。我预计完成后会有 10 到 20 个场景。
  • @DaveMcNulla,您具体指的是哪些外部文件?输入数据文件(brokenCircuit.[jls,circuit,v]testFile)?
  • @zach 这就是我所说的,文件正在运行

标签: cucumber acceptance-testing scenarios


【解决方案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输出应该是清晰的。

【讨论】:

  • 在这种情况下,使用 RSpec 是要走的路。测试不像 Cucumber 那样好读。但是,总的来说,RSpec 要简单得多。我确实必须编写几个自定义匹配器才能很好地阅读规范;但是,对于所有其他好处来说,这是一个很小的代价。
【解决方案2】:

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

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  |

【讨论】:

  • 不错的主意;但是(正如您所建议的),它可能更像是“横向移动”而不是改进。我主要担心的是场景名称不再清楚地表明正在测试的内容。我在上面列出了两个示例测试;但是,我将添加更多测试来验证是否正确识别和报告了不同类型的故障。
  • 正如您所提到的,每个模拟器可以有 10 到 20 个场景,您必须决定是更喜欢一起运行模拟器的所有测试还是对所有模拟器运行一种测试。然后拆分场景。我提到的方法太麻烦了,因为示例部分会爆炸。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-12
  • 1970-01-01
相关资源
最近更新 更多