인프런 커뮤니티 질문&답변

감바스님의 프로필 이미지
감바스

작성한 질문수

Practical Testing: 실용적인 테스트 가이드

JUnit5로 테스트하기

given - when - then 구조에 대해 질문 있습니다.

작성

·

46

0

@Test
void remove() {
    CafeKiosk cafeKiosk = new CafeKiosk();
    Americano americano = new Americano();

    cafeKiosk.add(americano);
    assertThat(cafeKiosk.getBeverages()).hasSize(1);

    cafeKiosk.remove(americano);
    assertThat(cafeKiosk.getBeverages()).isEmpty();
}

저는 given은 CafeKiosk cafeKiosk = new CafeKiosk(); 이런식으로 객체를 생성하는 단계

when은 cafeKiosk.add(americano); 와 같이 실제 메서드를 사용하는 단계

then은 assertThat(cafeKiosk.getBeverages()).isEmpty(); 와 같이 실제값과 기대값을 검증하는 단계라고 이해를 했습니다.

 

  1. 제가 given - when - then에 대해 위와 같이 이해를 했는데 맞게 이해를 한건지 궁금합니다.

  2. 먼가 깔끔한(?) 코드는 given - when - then이 딱딱 나눠져야 하는건지 (객체 생성은 given 쪽에 몰아두고 메서드 사용은 when쪽에 몰아두고 검증은 then쪽에 몰아두는) 궁금합니다.

  3. 하나의 단위 테스트에서도 given - when - then 의 흐름이 여러개가 존재할 수 있나요? 전체적인 하나의 흐름만 존재하는 건지 아니면 단위 테스트 내에서도 여러 흐름이 존재하는건지 궁금합니다.

 

 

 

답변 2

0

박우빈님의 프로필 이미지
박우빈
지식공유자

안녕하세요, 감바스 님!

 

1. 제가 given - when - then에 대해 위와 같이 이해를 했는데 맞게 이해를 한건지 궁금합니다.

네, 맞습니다 ㅎㅎ

 

2. 먼가 깔끔한(?) 코드는 given - when - then이 딱딱 나눠져야 하는건지 (객체 생성은 given 쪽에 몰아두고 메서드 사용은 when쪽에 몰아두고 검증은 then쪽에 몰아두는) 궁금합니다.

맞아요. given절은 정확히 이야기하면, 테스트를 수행하기 위한 모든 준비과정 (given="주어진" 환경)이라고 보시면 됩니다.
그래서 보통 given절이 제일 라인 수가 길고, when절은 한두줄인 경우가 대부분입니다 ㅎㅎ

 

3. 하나의 단위 테스트에서도 given - when - then 의 흐름이 여러개가 존재할 수 있나요? 전체적인 하나의 흐름만 존재하는 건지 아니면 단위 테스트 내에서도 여러 흐름이 존재하는건지 궁금합니다.

given-when-then이 여러 개라는 것 자체가, 테스트하고자 하는 내용이 여러가지라는 의미이므로, 테스트를 분리하는 것이 맞아요 ㅎㅎ
흐름을 가진 여러 테스트를 구성하는 방법은 뒤쪽 강의(DynamicTest)에 소개하고 있으니 참고해 주세요 ㅎㅎ

감사합니다 🙂

0

안녕하세요, 인프런 AI 인턴입니다.

감바스님께서 주신 질문에 대해 답변드리겠습니다.

  1. 감바스님이 이해하신 given - when - then 구조는 정확합니다.

    • given은 테스트를 수행하기 위한 준비 단계입니다. 예를 들어, 객체를 생성하고, 초기 상태를 설정하는 부분입니다.
    • when은 실제로 테스트할 동작이나 메서드를 호출하는 단계입니다.
    • then은 동작의 결과를 검증하는 단계로, 기대값과 실제값을 비교합니다.
  2. 코드가 깔끔하려면 given - when - then 구조를 명확하게 나누는 것이 좋습니다. 즉, 객체 생성과 같은 설정은 given 부분에, 메서드 실행은 when 부분에, 결과 검증은 then 부분에 각각 명확히 구분하여 작성하면 가독성이 높아집니다.

  3. 하나의 단위 테스트에서도 여러 개의 given - when - then 흐름이 존재할 수 있습니다. 그러나 일반적인 테스트 관례에서는 각 테스트 메서드가 고유한 단일 흐름을 따르는 것이 좋습니다. 여러 흐름을 가지게 되면 테스트의 의도가 흐려질 수 있으므로, 하나의 흐름을 따르는 것이 테스트의 명확성과 가독성을 높이는 데 유리합니다. 필요한 경우에는 여러 개의 테스트 메서드로 분리하는 것이 좋습니다.

Spring Boot에서의 테스트와 관련한 추가 자료가 필요하시면 여기에서 확인하실 수 있습니다.

더 궁금한 점이 있으면 언제든지 질문해 주세요!

감바스님의 프로필 이미지
감바스

작성한 질문수

질문하기