Странно, что StoryQ не поддерживает пропущенные шаги; ваш сценарий на самом деле довольно типичен для других примеров, которые я использовал для запуска приложений, игр и т. д. вверх:
Given the chess program is running
Then the pieces should be in the starting positions
например. Таким образом, ваше желание использовать условие, за которым следует результат, совершенно оправдано.
Глядя на API StoryQ, не похоже, что он поддерживает эти пустые шаги. Вы всегда можете создать свой собственный метод и вызывать внутри него оба шага Given и When, возвращая операцию из When:
.GivenIStartedWith(InitLensShadingPlugin)
.Then(PluginIsCreated)
Если это кажется слишком неуклюжим, я бы сделал, как вы предложили, и переместил Given в When, вместо этого инициализировав Given пустым методом с более значимым именем:
Given(NothingIsInitializedYet)
.When(InitLensShadingPlugin)
.Then(PluginIsCreated)
Любой из них решит вашу проблему.
Однако, если все, что вы тестируете, — это класс, а не все приложение, использование StoryQ, вероятно, будет излишним. Среды BDD с естественным языком, такие как StoryQ, Cucumber, JBehave и т. д., предназначены для того, чтобы помочь бизнесу и командам разработчиков сотрудничать в изучении требований. Они несут значительные накладные расходы на настройку и обслуживание, поэтому, если аудитория ваших сценариев/примеров на уровне класса является технической, может быть более простой способ.
Для примеров поведения на уровне класса я бы просто использовал простой инструмент модульного тестирования, такой как NUnit или MSpec. Мне нравится использовать NUnit и оставлять в комментариях свое «Дано/Когда/Тогда»:
// Given I initialized the lens shading plugin on startup
_plugin = new LSCPlugin(_imagesDatabaseProvider, n_iExternalToolImageViewerControl);
// Then the plugin should have been created
Assert.NotNull(_plugin);
Шаги на уровне класса не используются повторно так же, как в полносистемных сценариях, потому что классы имеют гораздо меньшие, более инкапсулированные обязанности; и разработчикам выгодно читать код, а не скрывать его в определениях шагов.
Ваши комментарии Given/When/Then здесь могут по-прежнему повторять сценарии на более высоком уровне, если класс напрямую управляет функциональностью, которую видит пользователь.
Обычно для полносистемных сценариев мы выводим шаги из разговоров с «тремя амигос»:
- представитель бизнеса (PO, SME, тот, у кого есть проблема, которую нужно решить)
- тестер (который замечает сценарии, которые мы могли бы пропустить)
- разработчик (кто собирается решить проблему).
Там может быть пара разработчиков. Дизайнеры пользовательского интерфейса могут принять участие, если захотят. Мэтт Винн говорит, что это "3 amigos, где 3 - любое число от 3 до 7". Лучшее время для разговоров — прямо перед тем, как разработчики возьмутся за работу, чтобы начать кодировать ее.
Однако, если вы работаете самостоятельно, будь то игрушка или реальное приложение, вам могут быть полезны просто воображаемые разговоры. Я использую пикси по имени Чертополох.
person
Lunivore
schedule
18.01.2018