카테고리 없음

Gherkin 문법에 대해서 알아보자

Taemy 2021. 9. 29. 23:38

 Gherkin은 BDD based test tool인 Cucumber에서 제안한 테스트 문법으로, 사전적으로는 pickled cucumber의 영국식 단어다.

 

 Given When Then 등의 간단한 문장으로 테스트를 구성하도록 되어 있고, 실제로 작성된 코드는 굉장히 가독성이 높아서 구성된 Gherkin 문장만 봐도 어떤 테스트를 하려고 하는지 알 수 있다.

 

이번 포스팅에서는 Gherkin 문법에 대해서 간단히 알아본다.

 

Keyword

 Gherkin은 실행가능한 스펙을 포함하고 있는 문장으로 구성되고, 문장 하나는 특수한 keyword set을 통해서 구성할 수 있다. 이 Keyword들은 기본적으로는 영어로 구성되어 있지만 한글 단어로도 구성할 수는 있다(물론 자연스러운지는 잘 모르겠다). 이번 포스팅에서는 영어로 사용되는 경우를 확인해본다. 

 

주석 처리

 Gherkin은 # 를 통해 주석을 제공하고 있고, 블록 형태의 주석을 할 수는 없다.

 

Feature

 구현하고자 하는 테스트를 기능 단위로 묶을 수 있도록 제공하는 가장 큰 단위다. 하위에 여러 Rule, Example(Scenario)를 포함할 수 있다.

Feature: Guess the word

  The word guess game is a turn-based game for two players.
  The Maker makes a word for the Breaker to guess. The game
  is over when the Breaker guesses the Maker's word.

  Example: Maker starts a game

 

Feature: 옆에 기능의 이름을 적고, 그 아래에 Description을 작성할 수 있다. Description은 다음 Keyword가 나타날때 까지를 인식한다. 위의 경우에는 Example 전까지의 모든 문구가 Description 이다.

 

Rule

Feature아래에서 구현되어야할 Business Rule 단위를 명세한다. 

# -- FILE: features/gherkin.rule_example.feature
Feature: Highlander

  Rule: There can be only One

    Example: Only One -- More than one alive
      Given there are 3 ninjas
      And there are more than one ninja alive
      When 2 ninjas meet, they will fight
      Then one ninja dies (but not me)
      And there is one ninja less alive

    Example: Only One -- One alive
      Given there is only 1 ninja alive
      Then he (or she) will live forever ;-)

  Rule: There can be Two (in some cases)

    Example: Two -- Dead and Reborn as Phoenix

 

 위와 같이 여러 개의 Example(혹은 Scenario)가 Rule 아래에 포함될 수 있고, 여러 개의 Rule이 Feature아래에 작성되는 것이 가능하다. Feature 아래에 상황이 달라지는 경우 여러 Scenario를 나눠 구성할 수 있도록 제공하는 단위다.

 

Example

BDD 관점에서 구성되는 하나의 Scenario로, 마찬가지로 Scenario로 작성해도 완전히 동일하게 동작한다. Feature아래에서 테스트하고자 하는 시나리오를 표현한 것이다. Example 아래에는 몇 가지 키워드로 상황을 정의하는데, 이는 BDD 관점에서의 시나리오를 표현하기 위한 것이다.

Given there is money in my account
Then there is money in my account

 

기본적으로 Given, When, Then 3가지와 And, But, *가 추가로 존재한다.

사실 실제 구현은 따로 해야하기 때문에 어느걸 대충 가져다 붙여도 문제는 없지만, 이 테스트 구성 문법 자체가 Readable하게 다른 사람이 테스트 내용을 알 수 있도록 표현해야 하기 때문에 적절하게 실행하고자 하는 동작 선택해서 작성해야 한다.

 

Given: BDD 테스트에서 수행하고자 하는 테스트의 환경을 정의하는 부분이다. 변수값이나 환경 설정들을 수행한다.

When: 테스트에서 원하는 동작을 수행하는 부분이다. 테스트가 원하는 결과를 얻을 수 있도록 표현하는 부분으로, 이벤트 트리거에 해당하는 부분이다.

Then: BDD 테스트에서 얻고자 하는 결과를 표현하는 부분이다. 예를 들어 위의 Then there is money in my account 부분의 경우 account에서 money가 확인이 되어야 한다. 테스트를 실제로 구현할 때도 해당 부분에서 확인이 되는 경우 정상 return 값을 반환하는 형식으로 구성해야 한다.

 

위의 Given, When, Then이 각각 하나씩 있을 수도, 아예 없을 수도 있지만, 여러 개가 존재하는 상황도 있을 수 있다. And, But. *는 그러한 상황에서 여러개가 반복되는 경우 가독성이 떨어지기 때문에 반복되는 Keyword에 대해서 가독성을 높이고자 사용하는 Keyword들이다. 실제로 When을 여러개 적든, 혹은 When 뒤에 And를 적든 실제 동작 자체는 전혀 차이가 없으나 원하는 이벤트 트리거가 여러 개라는 부분을 좀더 가독성 좋게 표현할 수 있다.

Example: Multiple Givens
  Given one thing
  And another thing
  And yet another thing
  When I open my eyes
  Then I should see something
  But I shouldn't see something else

 

Background

Background는 여러 Scenario에 걸쳐서 동일한 Step이 필요한 경우 이것이 반복되는 것을 막고 한데 묶어 표현하는 것을 도와주는 Keyword다. 아래 Background에서 표현되는 것과 같이 Given, And Step 여러개를 포함하고 있는 것을 확인할 수 있다. 

 

 실제 동작 시 이 Background는 각 Scenario가 시작하기 전에 먼저 수행된 후 Scenario가 수행되는 것을 알 수 있다.

Feature 및 Rule단위 모두로  Background를 하나씩 가질 수 있기 때문에, 동작을 한데 묶어 표현하거나 Rule별로 다른 Background를 가져가도록 해서 여러 Business Rule를 표현할 수 있도록 도와준다.

Feature: Multiple site support
  Only blog owners can post to a blog, except administrators,
  who can post to all blogs.

  Background:
    Given a global administrator named "Greg"
    And a blog named "Greg's anti-tax rants"
    And a customer named "Dr. Bill"
    And a blog named "Expensive Therapy" owned by "Dr. Bill"

  Scenario: Dr. Bill posts to his own blog
    Given I am logged in as Dr. Bill
    When I try to post to "Expensive Therapy"
    Then I should see "Your article was published."

  Scenario: Dr. Bill tries to post to somebody else's blog, and fails
    Given I am logged in as Dr. Bill
    When I try to post to "Greg's anti-tax rants"
    Then I should see "Hey! That's not your blog!"

  Scenario: Greg posts to a client's blog
    Given I am logged in as Greg
    When I try to post to "Expensive Therapy"
    Then I should see "Your article was published."