Статьи

Учитывая-Когда-Then


Given-When-Then — это стиль представления тестов — или, как сказали бы его сторонники — определения поведения системы с использованием
SpecificationByExample . Это подход, разработанный
Дэном Нортом и Крисом Мэттсом в рамках развития,
управляемого поведением (BDD).
[1] Это выглядит как структурирующий подход для многих сред тестирования, таких как Cucumber. Вы также можете посмотреть на это как на переформулировку
шаблона
четырехфазного теста .

Основная идея состоит в том, чтобы разбить написание сценария (или теста) на три раздела:

  • Даются часть описывает состояние мира , прежде чем начать поведение которой нужно указать в этом сценарии. Вы можете думать об этом как о предварительных условиях теста.
  • Раздел когда это то поведение, которое вы указываете.
  • Наконец, раздел then описывает изменения, которые вы ожидаете из-за указанного поведения.

Поскольку мы говорим об использовании примеров в качестве спецификаций, имеет смысл показать это на примере [2]

Feature: User trades stocks
  Scenario: User requests a sell before close of trading
    Given I have 100 shares of MSFT stock
       And I have 150 shares of APPL stock
       And the time is before close of trading

    When I ask to sell 20 shares of MSFT stock
     
     Then I should have 80 shares of MSFT stock
      And I should have 150 shares of APPL stock
      And a sell order for 20 shares of MSFT stock should have been executed

В приведенном выше примере используется Cucumber [3] , который является популярным способом написания BusinessFacingTests, но вы можете использовать стиль Given-When-Then с любым видом тестов. Некоторые люди любят помещать Given-When-Then в качестве комментариев, чтобы отметить неформальные блоки внутри модульных тестов [4] . Я также видел это соглашение, чтобы структурировать неформальную прозу.

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

Я охарактеризовал данное как описание состояния предусловия, потому что я так думаю об этом. Однако инфраструктура тестирования интерпретирует данные как набор команд, чтобы привести тестируемую систему в правильное состояние перед выполнением команды when. (Именно поэтому другие соглашения об именах часто называют эту «настройку».) Среды тестирования предоставляют различные методы запросов для команд then — они не должны иметь побочных эффектов.

Хотя стиль Given-When-Then является симптоматичным для BDD, основная идея довольно распространена при написании тестов или спецификации на примере. Месарош описывает модель как четырехфазный тест . Его четыре фазы — «Настройка» («Дано»), «Упражнение» («Когда»), «Проверка» («Затем») и «Срыв» [5] . Билл Уэйк придумал формулировку « Аранжировать, действовать, утверждать» .

Заметки

1: В комментариях к обзору Дэн благодарит Ивана Мура за значительный объем вдохновения в разработке этого.

3: Или, чтобы быть строгим, он использует Огурец, который является названием DSL Огурца.

4: Тестовые среды имеют тенденцию следовать стилю именования xunit или BDD, последние имеют тенденцию называть методы в стиле Given-When-Then.

5: Срыв не всегда необходим при реализации тестов (особенно, если вы используете Automated Teardown ) и не добавляет особого аспекта спецификации связи на примере. Поэтому разумно видеть, что это отсутствует в стиле BDD.