상세 컨텐츠

본문 제목

[Cucumber] '|'문자를 사용한 테이블형 데이터 전달

IT/프로그래밍

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

본문

백문이 불여일견이라고 역시 말보다는 코드로 보는것이 이해가 빠르다.


변환할 Feature파일은 아래와 같은 내용을 가지고 있다.

Feature: Top N개를 (카테고리별로) 조회
 
Scenario: 방문자들이 Given 조건과 같이 상품을 조회 했을때, 카테고리별로 상품을 보여주는 시나리오

 
Given 방문자들의 페이지(상품) 및 카테고리 조회 목록

|Visitor|eType  |Category|ProductID|
|v1     |pagevw |        |      |
|v1     |prdtvw |cA      |p1    |
|v1     |basket |cA      |p1    |
|v1     |prdtvw |cA      |p2    |
|v1     |basket |cA      |p2    |
|v1     |buy    |cA      |p1,p2 |
|v2     |prdtvw |cA      |p2    |
|v2     |buy    |cA      |p2    |
|v3     |prdtvw |cA      |p1    |
|v3     |prdtvw |cA      |p2    |
|v3     |prdtvw |cB      |p3    |
|v3     |pagevw |cB      |p4    |
|v3     |prdtvw |cB      |p4    |
|v3     |basket |cC      |p5    |
|v2     |prdtvw |cC      |p5    |
|v2     |basket |cC      |p4,p5 |
|v1     |buy    |cC      |p5    |
|v1     |prdtvw |cC      |p5    |
|v1     |buy    |cC      |p4    |
|v1     |prdtvw |cC      |p5    |
|v1     |prdtvw |cC      |p6    |

When 다음과 같은 질의에 대한 예상 결과
|eType  |Limit  |Filter      |
|prdtvw |6      |category-cA    |
|basket |6      |category-cC    |

|buy    |6      |category-cA    |

Then  카테고리 - 상품 순으로 보여줌                    
|eType  |Top1   |Top2   |Top3   |Top4   |Top5 |Top6 |
|prdtvw |cA-p2  |cA-p1  |       |       |     |     |
|basket |cC-p5  |cC-p4  |       |       |     |     |
|buy    |cA-p2  |cA-p1  |       |       |     |     |


Cucumber를 이용해서 여기의 내용을 읽어서 BDD에 알맞은 Java코드를 생성할 것이다!


StepsEventTopN이라는 이름의 Java클래스를 생성하고, StepsResource를 상속받는다  (여기서 StepResource는 굳이 신경 안써도 된다.)

아무것도 없는 클래스를 가지고 아래와 같이 테스트 코드를 작동시킨다.

package com.nethru.seetoc.client;

import org.junit.runner.RunWith;

import cucumber.api.CucumberOptions;
import cucumber.api.junit.Cucumber;

@RunWith(Cucumber.class)
@CucumberOptions( plugin={ "pretty"}, features = {"src/actest/com/nethru/seetoc/client/eventstats"})
public class SessionQueryIT {
 
}
public class StepsEventTopN extends StepsResource {
}
그럼 콘솔에 아래와 같은 화면이 출력되는 것을 볼 수 있다.
You can implement missing steps with the snippets below:
@Given("^방문자들의 페이지\\(상품\\) 및 카테고리 조회 목록$")
public void 방문자들의_페이지_상품_및_카테고리_조회_목록(DataTable arg1) throws Throwable {
    throw new PendingException();
}
@When("^다음과 같은 질의에 대한 예상 결과$")
public void 다음과_같은_질의에_대한_예상_결과(DataTable arg1) throws Throwable {
    throw new PendingException();
}

@Then("^카테고리 - 상품 순으로 보여줌$")
public void 카테고리_상품_순으로_보여줌(DataTable arg1) throws Throwable {
    throw new PendingException(); 
}


어떻게 된 일일까?, 아래 Mental Model에서서도 설명했듯이, Cucumber는 각 시나리오별로 @Given, @When, @Then이 있는지 체크하고 없다면 자동으로 메소드 템플릿을 추천해준다고 했다.
우리는 클래스를 만든 초기 상태이기때문에 Given, When, Then이 없었고, 따라서 Cucumber가 메소드 템플릿을 추천해준 것이다.
(굉장히 편리하다..)
다음으로 아래와 같은 코드를 작성한다.
 @Given("^방문자들의 페이지\\(상품\\) 및 카테고리 조회 목록$")
 public void 방문자들의_페이지_상품_및_카테고리_조회_목록(List<Map<String, String>> actions)
   throws IOException, InterruptedException {
  for (Map<String, String> action : actions) {
   System.out.println(action);
  }
 }

 @When("^다음과 같은 질의에 대한 예상 결과$")
 public void 다음과_같은_질의에_대한_예상_결과(List<Map<String, String>> actions)
   throws Throwable {
  for (Map<String, String> action : actions) {
   String eType = action.get("eType");
   int limit = Integer.parseInt(action.get("Limit"));
   String[] filterStr = action.get("Filter").split("-");
   KeyValue filter = new KeyValue(filterStr[0], filterStr[1]);
   System.out.println(eType + " " + limit + " " + filter.getKey()
     + " " + filter.getValue());
  }
 }

 @Then("^카테고리 - 상품 순으로 보여줌$")
 public void 카테고리_상품_순으로_보여줌(List<Map<String, String>> actions)
   throws Throwable {
  for (Map<String, String> action : actions) {
   String eType = action.get("eType");
   String[] filterStr = action.get("Top1").split("-");
   KeyValue filter = new KeyValue(filterStr[0], filterStr[1]);
   
   String[] filterStr2 = action.get("Top2").split("-");
   KeyValue filter2 = new KeyValue(filterStr[0], filterStr[1]);
   
   System.out.println(action);
  }
 }
왜 Map을 List에 넣는 형태로 자료구조를 사용한 것일까?
Map은 Key값을 넣으면 거기에 맞는 Value를 리턴해준다.
BBD에서 '|'문자는 테이블 구조로 문자열을 변환한다.
그래서 아래와 같은 구조에서
When : 다음과 같은 질의에 대한 예상 결과
|eType  |Limit  |Filter
|prdtvw |6      |category-cA
|basket |6      |category-cC
|buy    |6      |category-cA</pre>
키는 eType, Limit, Filter가 되고 
각 Value는 List형태이기 때문에 3개의 행으로 구성된다.

 


관련글 더보기

댓글 영역