본문 바로가기
카테고리 없음

Cucumber

by Younji! 2020. 5. 11.

Junit으로만 단위테스트, 통합 테스트로 검증하다, Cucumber를 도입하게 되었는데 접하게 된 BDD의 개념과 어떤 식으로 사용되고 있는 지 풀어본다.
BDD(동적 주도 개발)는 TDD의 확장으로 도메인을 알고 있는 사람이라면 쉽게 이해할 수 있다. 비즈니스 관점으로 어떠한 feature를 작성해 개발하는 것으로 아래의 예시를 보면 누구나 쉽게 이해할 수 있는 언어로 작성되어 있다.  여기서는 Cucumber라는 BDD 프레임워크 기준으로 적어본다.

 

Cucumber는 Ghrekin[https://cucumber.io/docs/gherkin/reference/#keywords] 이라는 DSL 를 사용하여 테스트 케이스로 변환하여 검증한다. 시나리오를 작성하기 위한 Ghrekin의 몇 가지 키워드가 있다.

 

일단 매우 간단하게 시나리오를 작성해보자.

Feature: 포인트 추가/차감 기능을 확인한다. 
 Background: 
    Given 미리 A 유저를 설정한다. 
    And 포인트 5000원을 부여한다. 

  Scenario: 포인트가 추가되는지 확인한다. 
    Then A 유저가 사용할 수 있는 포인트 금액은 5000원이다. 

  Scenario: 차감하는 포인트가 사용할 수 있는 포인트보다 클 경우 남은 금액에 대해 확인한다.
    When 포인트 -5500원 차감한다. 
    Then 포인트가 0원 남게된다.

  Scenario: 포인트가 차감이 되는지 확인한다.
    When 포인트 -500원 차감한다.
    Then 포인트가 4500원 남게된다.

- Feature : 시나리오 그룹 단위로, 시나리오를 대표할 수 있는 상세 설명으로 비즈니스에 대해 기술

- Background : 모든 시나리오에 공통적으로 적용

- Given : 시나리오 시작 전, 필요한 데이터의 설정

- When : 행동에 대한 설명

- Then : 결과에 대한 설명

 

기존 junit 테스트에 given-when-then 패턴으로 표현하면 아래와 같이 작성했을 것이다.

@Test
public void 포인트가_추가되는지_확인한다() throws Exception {
    // given
    givenAddUser(A);
    givenAssignPoint(A, 5000);

    // when
    mockMvc.perform(post("/point")
        .content(mockRequest()))
        .andExpect(status().isOk());

    // then
    mockMvc.perform(get("/point")
        .content(mockRequest()))
        .andExpect(status().isOk())
        .andExpect(jsonPath("$.data.point").is("5000"));
}

 

Cucumber로 TC를 작성하다가 3rd party 모듈을 모킹이 쉽지 않았다. 사실 큐컴버 자체가 모든 플로우를 확인하기 위해 고안되었다고 하니 오브젝트를 모킹하는 건 썩 좋지 않다. 방법이 없는 건 아니지만, test profile 기준으로 Service 자체를 나눠 작성하였다. 관련 포스팅을 보고 싶으면 위 링크를 참조하면 좋겠다.

@Profile({"test"})
public class MockService implements AService {

 BDD 를 처음 접해보면서 느낀 것은(얼마 안됐지만), 피쳐/시나리오 단위로 커다란 시스템의 플로우를 보기에 적합할 수준으로 시나리오를 작성한다면, 현업과 개발자 입장에서 소통하기 좋겠다는 생각이다.

 사용한지 얼마 안돼 메모처럼 적어둔 느낌의 포스팅이니 BDD를 알아보고 싶다면 아래에 참고 URL을 확인하면 좋겠다. 더 제대로 사용해보고 포스팅에 내용을 추가할 예정이다.

 

참고 URL 

https://zsoltfabok.com/blog/2012/03/cucumber-jvm-mocking/

https://blog.aliencube.org/ko/2014/04/02/differences-between-bdd-and-tdd/

https://www.popit.kr/bdd-behaviour-driven-development%EC%97%90-%EB%8C%80%ED%95%9C-%EA%B0%84%EB%9E%B5%ED%95%9C-%EC%A0%95%EB%A6%AC/

댓글