Spring

[Practical Testing: 실용적인 테스트 가이드] 테스트는 [ ]다.

se-mumu 2023. 6. 18. 20:50

테스트는 [문서] 다

문서일까?

  • 테스트 코드 문서는 프로덕션의 기능을 부연 설명한다
  • 다양한 테스트 케이스를 통해 프로덕션 코드를 이해하는 시각과 관점을 보완한다
  • 어느 한 사람이 과거에 경험했던 고민의 결과물을 팀 차원으로 승격시켜서, 모두의 자산으로 공유할 수 있다

우리는 항상 팀으로 일한다는 것을 기억하자

 

DisplayName을 섬세하게

@DisplayName 어노테이션 사용
테스트 환경을 gradle에서 intellij로 변경

 

음료 1개 추가 테스트 ➡️ 음료를 1개 추가할 수 있다. ➡️ 음료를 1개 추가하면 주문 목록에 담긴다.
  • 명사의 나열보다 문장으로 짓기
  • ~테스트로 짓는 것을 지양하기
  • 테스트 행위에 대한 결과까지 기술하기

 

특정 시간 이전에 주문을 생성하면 실패한다. ➡️ 영업 시작 시간 이전에는 주문을 생성할 수 없다.

 

  • 도메인 용어를 사용하여 한층 추상화된 내용을 담기
    • 메서드 자체의 관점보다 도메인 정책 관점에 집중
  • 테스트의 현상을 중점으로 기술하지 말 것
    • 성공한다, 실패한다 (X)

 

BDD 스타일로 작성하기

BDD (Behavior Driven Development)

  • TDD에서 파생된 개발 방법
  • 함수 단위의 테스트에 집중하기보다, 시나리오에 기반한 테스트케이스(TC) 자체에 집중하여 테스트함
  • 개발자가 아닌 사람이 봐도 이해할 수 있을 정도의 추상화 수준을 권장

 

Given/When/Then 

  • Given: 시나리오 진행에 필요한 모든 준비 과정 (객체, 값, 상태 등)
  • When: 시나리오 행동 진행
  • Then: 시나리오 진행에 대한 결과 명시, 검증

어떤 환경에서(Given)

어떤 행동을 진행했을 때(When)

어떤 상태 변화가 일어난다(Then)

➡️ DisplayName에 명확하게 작성할 수 있음

 

@DisplayName("주문 목록에 담긴 상품들의 총 금액을 계산할 수 있다.")
@Test
void calculateTotalPrice() {
    // Given
    CafeKiosk cafeKiosk = new CafeKiosk();
    Americano americano = new Americano();
    Latte latte = new Latte();

    cafeKiosk.add(americano, 1);
    cafeKiosk.add(latte, 1);

    // When
    int totalPrice = cafeKiosk.calculateTotalPrice();

    // Then
    assertThat(totalPrice).isEqualTo(8500);
}

intellij에서 제공하는 live template 기능으로 DisplayName과 Given/When/Then 주석을 test 키워드로 자동으로 생성되게 할 수 있음 (나중에 설정해봐야지) 

 

키워드 정리

  • @DisplayName - 도메인 정책, 용어를 사용한 명확한 문장
  • Given/When/Then - 주어진 환경, 행동, 상태 변화
  • TDD vs BDD
  • JUnit vs Spock

 

Reference

https://www.inflearn.com/course/practical-testing-%EC%8B%A4%EC%9A%A9%EC%A0%81%EC%9D%B8-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EA%B0%80%EC%9D%B4%EB%93%9C/dashboard

 

Practical Testing: 실용적인 테스트 가이드 - 인프런 | 강의

이 강의를 통해 실무에서 개발하는 방식 그대로, 깔끔하고 명료한 테스트 코드를 작성할 수 있게 됩니다. 테스트 코드가 왜 필요한지, 좋은 테스트 코드란 무엇인지 궁금하신 모든 분을 위한 강

www.inflearn.com