如何构建以下程序的测试:
我正在为模拟组合电路编写单元测试框架。该框架将支持多个数字逻辑模拟器(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.feature
和tkgate.feature
;但是,如果Cucumber提供更简单的内置解决方案,我想避免这种复杂性。
答案 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 |