Существует множество различных мнений о том, как структурировать файлы объектов и определения шагов, и многие из них сводятся к предпочтениям и потребностям проекта. Все мои мысли здесь касаются системного тестирования большого проекта через браузер, который может быть не уместен для всех.
Тем не менее, мне повезло с соотношением 1: 1 между функциями и этапами. Мне нравится иметь один шаг def для обслуживания одного файла объектов и избегать повторного использования шагов в качестве основной стратегии для хранения кода DRY (для этого предназначены объекты страницы!). Иногда имеет смысл повторно использовать шаг (например, учитывая, что я вошел в систему), но мой опыт показывает, что это приводит к созданию этих больших библиотек с очень маленькими атомарными шагами, которые трудно найти, трудно использовать повторно, и гони корнишон до крайности.
Очевидная жалоба при подходе 1: 1 (кроме нарушения этого антишаблона в документации по огурцам) состоит в том, что это приведет к дублированию кода, но я обнаружил, что все, что Вы хотите сделать более одного раза - это, вероятно, универсальное действие, которое можно перенести на объект страницы. Это оставляет очень мало в определении шага, за исключением кода, который специфичен для тестируемого бизнес-правила, и его не нужно дублировать.
Итак, короткий ответ, я бы оставил i_remove_one_potato()
в том же классе, что и другие шаги для этой функции. Но, как вы сказали, ваш пример прост, поэтому я угадываю, каковы будут потребности вашего проекта.
Например, наброски, вы должны быть в состоянии сделать что-то вроде
Scenario Outline: I add/remove potatoes from bag
Given the bag has <initial> potatoes
When I <add_remove> <delta> potatoes
Then I should be told <outcome> potatoes
Examples:
| add_remove | initial | delta | outcome |
| add | 10 | 1 | 11 |
| add | 10 | 10 | 20 |
| remove | 10 | 1 | 9 |
| remove | 10 | 10 | 0 |
Я стараюсь не переусердствовать с набросками сценария, хотя, вероятно, это заходит слишком далеко. Может быть заманчиво свести всю функцию в одну программную таблицу, управляемую общими этапами, но в какой-то момент становится трудно извлечь, что представляют собой отдельные бизнес-правила. Когда один пример начинает терпеть неудачу, вы должны дразнить все это в отдельности и выяснять, почему автор выбрал табличные значения, которые он сделал. Предполагается, что инструменты BDD освещают эту функцию, а большие таблицы обычно скрывают ее. В приведенном выше примере мне, вероятно, следовало бы разделить добавление и удаление на отдельные контуры, поэтому я не смешиваю примеры различных бизнес-правил.
Некоторые мысли! Удачи!