Можно ли в тестах BDD в стиле «Дано-Когда-Тогда» иметь несколько «Когда» вместе с «И»?

Я читал блестящую статью Боба Мартина о том, как «Дано-когда-то» можно сравнить с конечным автоматом. Это заставило меня задуматься. Можно ли для теста BDD иметь несколько «Когда»?

Например.

GIVEN my system is in a defined state
WHEN an event A occurs
 AND an event B occurs
 AND an event C occurs
THEN my system should behave in this manner

Я лично считаю, что это должны быть 3 разных теста для хорошего разделения намерений. Но кроме этого, есть ли веские причины за или против такого подхода?


person Krishter    schedule 16.06.2015    source источник


Ответы (3)


Когда требуется несколько шагов (КОГДА), прежде чем вы сделаете фактическое утверждение (ТО), я предпочитаю сгруппировать их в части начального условия (ДАНО) и оставить только один в разделе КОГДА. Это показывает, что событие, которое действительно запускает «действие» моей ТУС, — это событие, а предыдущее — это дополнительные шаги, чтобы добраться туда.

Ваш тест станет:

GIVEN my system is in a defined state
 AND an event A occurs
 AND an event B occurs
WHEN an event C occurs
THEN my system should behave in this manner

но это скорее личное предпочтение, я думаю.

person Laurent Bristiel    schedule 17.06.2015

Если вам действительно нужно проверить, что система ведет себя определенным образом в этих конкретных условиях, это вполне приемлемый способ написания теста.

person Bryan Oakley    schedule 16.06.2015

Я обнаружил, что другим ограничивающим фактором может быть сценарий E2E-тестирования, когда вы хотели бы повторно использовать оператор несколько раз. В моем случае структура BDD по моему выбору (pytest_bdd) реализована таким образом, что данный оператор может иметь единственное возвращаемое значение, и он автоматически отображает тогда входные параметры по имени функции, которая была сопоставлена ​​с данным шагом. Теперь этот дизайн предотвращает повторное использование, тогда как в моем случае я этого хотел. Короче говоря, мне нужно было создать объекты и добавить их в объект последовательности, предоставленный другим данным оператором. Способ, которым я обошел это ограничение, заключается в использовании тестового приспособления (которое я назвал test_context), которое было словарем Python (хэш-картой) и использовалось, когда операторы, которые не имеют одного и того же единственного требования, поэтому «(когда) добавить объект в последовательность» искала последовательность в контексте и добавляла к ней рассматриваемый объект. Так что теперь я мог повторно использовать объект добавления для последовательности действий несколько раз.

Это требование было сложным, потому что BDD стремится быть описательным. Таким образом, я мог бы использовать один заданный оператор с маринованной картой памяти объекта последовательности, над которым я хотел выполнить тестовое действие. НО было бы это полезно? Думаю, нет. Мне нужно было сначала построить последовательность, а для этого требовались многократно используемые операторы. И хотя этого нет в библии BDD, я думаю, в конце концов, это практичное и прагматичное решение очень реальной проблемы описательного тестирования E2E.

person Zoltán Kozma    schedule 09.11.2016