2016-08-22 2 views
2

Как я структура тесты для следующей программы:Используйте те же примеры множественного сценария огурца очерчивают

Я пишу модульное тестирование рамку для моделируемых комбинационных схем. Эта структура будет поддерживать несколько цифровых логических симуляторов (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

Возможно, я не понимаю, но насколько я понимаю, у вас будет только каждый новый симулятор дважды, по каждому из описанных выше сценариев, который мне кажется прекрасным. –

+0

Мне не нравятся ссылки на внешние файлы. Это скрывает правило принятия решения. –

+0

Я привел только два примера выше. Я ожидаю от 10 до 20 сценариев, когда закончу. – Zack

ответ

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 должно быть ясно.

+0

В этом случае использование RSpec - это путь. Тесты не читаются так же хорошо, как с огурцом; но, в целом, RSpec намного проще.Мне нужно было написать пару пользовательских шаблонов, чтобы получить спецификации, чтобы они хорошо читались; но это была небольшая цена для оплаты всех других преимуществ. – Zack

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 | 
+0

Неплохая идея; но (как вы предположили), это может быть скорее «боковое движение», чем улучшение. Моя основная проблема заключается в том, что имя сценария больше не указывает на то, что тестируется. Я перечислил два примера тестов выше; но я добавлю еще много тестов, чтобы проверить, что различные типы отказов правильно распознаются и сообщаются. – Zack

+0

Как вы уже упоминали, у вас может быть от 10 до 20 сценариев для каждого симулятора, вам нужно решить, будете ли вы использовать все тесты для симулятора или один тип теста для всех симуляторов. Затем разделите сценарии. Подход, о котором я говорил, будет слишком громоздким, поскольку раздел примеров будет взрываться. – Grasshopper

Смежные вопросы