상세 컨텐츠

본문 제목

[Cucumber] Scenario Outline 기법을 활용하여 시나리오 중복 제거하기

IT/프로그래밍

by James Lee. 2015. 12. 6. 19:57

본문




시나리오 아웃라인이란 무엇일까?


중복되는 시나리오가 발생할때, 시나리오를 수정하려면 중복된 시나리오를 일일히 수정해줘야 하는 번거로움이 있다(코드나 이거나 비슷하다..)


그래서 시나리오가 중복되고, 데이터값만 바뀔때, 이 바뀌는 데이터값을 테이블 형태로 나타내고 이를 하나의 시나리오 형태(윤곽에 변수로 표현하는 것이다. 그래서 시나리오 아웃라인(OutLine : 형태, 윤곽)이라는 이름이 붙은 것 같다.


이해를 돕기위해 예시를 보자. 

아래 예시에는 4개의 시나리오가 있다.


Feature: Depositing money in to a User account


Scenario: 사용자 계좌에 예금하는것은 현재 사용자 잔금에 돈을 더해야됨
Given a User has 0 in their account
When 100 is deposited in to the account
Then the balance should be 100


Scenario: 200원 이상을 입금하면, 50% 이자
Given a User has 0 in their account
When 200 is deposited in to the account
Then the balance should be 300

Scenario: 300원 이상을 입금하면, 100% 이자
Given a User has 0 in their account
When 300 is deposited in to the account
Then the balance should be 600


Scenario: 잔고가 0이 아닌 경우에도 입금처리를 한다.
Given a User has 100 in their account
When 50 is deposited in to the account
Then the balance should be 150

하나의 보면 시나리오의 형태는 똑같은데 다루는 데이터(100..50..300 등 숫자들)이 다르다.

단지 데이터의 형태만 다를 뿐인데 똑같은 시나리오를 반복해서 쓰기엔 너무 번거롭지 않은가?

그래서 이것을 시나리오 아웃라인을 사용하여 표현해보았다.


Scenario Outline: scenarioOutLine


Given a User has <initialBalance> in their account
When <deposit> is deposited in to the account
Then the balance should be <balance>

 Examples:
 | initialBalance | deposit | balance |
 | 0 | 100 | 100 |
 | 0 | 200 | 300 |
 | 0 | 300 | 600 |
 | 100 | 50 | 150 |


어떤가? 훨씬 깔끔하고 간결하지 않은가.

중복되는 시나리오는 하나로 표현하고 데이터가 들어갔던 부분은 <변수>형태로 표현했다.

그리고 Example: 이라는 키워드를 쓰고 테이블 형태로 각 변수의 값을 표현한다.


두번째 예시를 보자.


아래와 같은 코드가 있다. 하지만 리팩토링이 조금 필요한 코드이다. (수정이라는 의미로 리팩토링을 썼는데, 이게 맞는 표현인지는 잘 모르겠다)


Feature: 특정 세션에 대한 세션 속성 비교연산 질의 

Scenario: 사이트에 방문자들이 Given 조건과 같이 페이지를 조회 했을 때 방문자별 세션에 대한 질의 테스트 시나리오

Given 방문자들의 페이지(상품) 조회 목록:

                         #(duration : 초)
    |visitor   |page    |product     |duration |
    |v1        |p1      |            |3        |
    |v1        |p2      |prdt1       |2        |
    |v1        |p1      |            |         |
    |v2        |p1      |            |2        |
    |v2        |p2      |prdt1       |         |

When 다음과 같은 질의에 대한 예상 결과:
    |visitor   |query   |result  |
    
    # pavevw 함수 테스트
    |v1        |pagevw('p1') == 2                       |true    |
    |v1        |pagevw('p1') > 1 && pagevw('p2') < 2    |true    |


무엇이 문제일까?

바로 Then이 없다는 것이다.


Cucumber는 기본적으로 게르킨(Gherkin) 문법을 따라서 Given, When, Then의 형식을 갖춰야 한다.


위의 When의 테이블에 result의 true, false는 Then에 들어가는게 적합하다. 

 

이 코드를 수정하기 위하여 역시 시나리오 아웃라인을 사용할 것이다.


수정된 코드는 아래와 같다.


Feature: 특정 세션에 대한 세션 속성 비교연산 질의 

Scenario Outline: 시나리오 아웃라인 테스트
 Given 방문자들의 페이지(상품) 조회 목록:
                         #(duration : 초)
    |visitor   |page    |product     |duration |
    |v1        |p1      |            |3        |
    |v1        |p2      |prdt1       |2        |
    |v1        |p1      |            |         |
    |v2        |p1      |            |2        |
    |v2        |p2      |prdt1       |         |
When 방문자 <visitor> 쿼리문의 내용 <query>            
Then 예상된 결과 <result>


 Examples:
 |visitor|query                               |result|
 |v1     |pagevw('p1') == 2                   |true  |
 |v1     |pagevw('p1') > 1 && pagevw('p2') < 2|true  | 



어떤가? When에 방문자와 쿼리문의 내용을 <>로 표시하고 Then에 result를 사용하여 Given, When, Then의 형태를 깔끔하게 갖췄다.

관련글 더보기

댓글 영역