시나리오 아웃라인이란 무엇일까?
중복되는 시나리오가 발생할때, 시나리오를 수정하려면 중복된 시나리오를 일일히 수정해줘야 하는 번거로움이 있다(코드나 이거나 비슷하다..)
그래서 시나리오가 중복되고, 데이터값만 바뀔때, 이 바뀌는 데이터값을 테이블 형태로 나타내고 이를 하나의 시나리오 형태(윤곽에 변수로 표현하는 것이다. 그래서 시나리오 아웃라인(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의 형태를 깔끔하게 갖췄다.
[Git] Git 기본 명령어 요약정리 (0) | 2015.12.06 |
---|---|
[Cucumber] 시나리오 Java 코드로 변환하기 (계좌 예금 및 계좌이체하기) (0) | 2015.12.06 |
[Cucumber] '|'문자를 사용한 테이블형 데이터 전달 (0) | 2015.12.06 |
[Cucumber] 최종 정리 (Mental Model) (0) | 2015.12.06 |
[Cucumber] 작동원리 분석 (0) | 2015.12.06 |
댓글 영역