Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

채채

4. 스프링 부트 3와 테스트 본문

spring boot

4. 스프링 부트 3와 테스트

HChaeEun 2023. 7. 12. 23:11

1. 테스트 코드 개념 익히기

테스트 코드는 test 디렉터리에서 작업한다. 

테스트 코드 패턴 중 given-when-then 패턴이란?

given: 테스트 실행을 준비하는 단계 / when: 테스트를 진행하는 단계 / then: 테스트 결과를 검증하는 단계

// 새로운 메뉴를 저장하는 코드 테스트
@DisplayName("새로운 메뉴를 저장한다.")
@Test
public void saveMenuTest() {

    // given : 메뉴를 저장하기 위한 준비 과정
    final String name = "아메리카노";
    final int price = 2000;

    final Menu americano = new Menu(name, price);

    // when : 실제로 메뉴를 저장
    final long savedId = menuService.save(americano);

    // then : 메뉴가 잘 추가되었는지 검증
    final Menu savedMenu = menuService.findById(savedId).get();
    assertThat(savedMenu.getName()).isEqualTo(name);
    assertThat(savedMenu.getPrice()).isEqualTo(price);
}

2. 스프링 부트3와 테스트

JUnit: 자바 프로그래밍 언어용 단위 테스트 프레임워크. 단위는 보통 메서드

public class JUnitTest {
// 테스트 성공 코드
    @DisplayName("1 + 2는 3이다") // 테스트 이름
    @Test // 테스트 메서드
    public void junitTest() {
        int a = 1;
        int b = 2;
        int sum = 3;

        Assertions.assertEquals(sum, a + b); // 값이 같은지 확인
    }

// 테스트 실패 코드
    @DisplayName("1 + 3는 4이다.")
    @Test
    public void junitFailedTest() {
        int a = 1;
        int b = 3;
        int sum = 3;

    Assertions.assertEquals(sum, a + b);
    }
}

실패용 테스트 케이스를 실행하면 테스트가 실패했다는 표시와 함께 기댓값과 실제로 받은 값을 비교해서 알려준다. 이렇게 JUnit은 테스트 케이스가 하나라도 실패하면 전체 테스트를 실패한 것으로 보여준다.

 

JUnit은 각 테스트에 대해 객체를 만들어 독립적으로 실행한다고 했는데, 다음 실습을 통해 알아보자. 추가적으로 테스트는 애너테이션에 따라 실행 순서가 정해지는 것을 확인본다.

import org.junit.jupiter.api.*; 

public class JUnitCycleTest {
    @BeforeAll // 전체 테스트를 시작하기 전에 1회 실행하므로 메서드는 static으로 선언
    static void beforeAll() {
    System.out.println("@BeforeAll");
    }

    @BeforeEach // 테스트 케이스를 시작하기 전마다 실행
    public void beforeEach() {
        System.out.println("@BeforeEach");
    }

    @Test
    public void test1() {
        System.out.println("test1");
    }

    @Test
    public void test2() {
        System.out.println("test2");
    }

    @Test
    public void test3() {
        System.out.println("test3");
    }

    @AfterAll // 전체 테스트를 마치고 종료하기 전에 1회 실행하므로 메서드는 static으로 선언
    static void afterAll() {
        System.out.println("@AfterAll");
    }

    @AfterEach // 테스트 케이스를 종료하기 전마다 실행
    public void afterEach() {
        System.out.println("@AfterEach");
    }
}

@BeforeAll

전체 테스트를 시작하기 전에 처음으로 한 번만 실행. 데이터베이스를 연결해야 하거나 테스트 환경을 초기화할 때 사용된다.

*이 애너테이션은 전체 테스트 실행 주기에서 한 번 만 호출되어야 하기 때문에 메서드를 static으로 선언해야 함

 

@BeforeEach

테스트 케이스를 시작하기 전에 매번 실행. 테스트 메서드에서 사용하는 객체를 초기화하거나 테스트에 필요한 값을 미리 넣을 때 사용.

*각 인스턴스에 대해 메서드를 호출해야 하므로 메서드는 static이 아니어야 함

 

@AfterAll

전체 테스트를 마치고 종료하기 전에 한 번만 실행. 데이터베이스 연결을 종료할 때나 공통적으로 사용하는 자원을 해제할 때 사용.

*전체 테스트 실행 주기에서 한 번만 호출되어야 하므로 메서드를 static으로 선언해야 함

 

@AfterEach

각 테스트 케이스를 종료하기 전 매번 실행. 테스트 이후에 특정 데이터를 삭제해 야 하는 경우 사용합니다.

*메서드는 static이 아니어야 함.

 

JUnit의 실행 흐름

AssertJ로 검증문 가독성 높이기

AssertJ는 JUnit과 함께 사용해 검증문의 가독성을 높여주는 라이브러리다. 

// 기댓값과 비교값이 잘 구분되지 않는 Assertion 예
Assertions.assertEquals(sum, a + b);
// 가독성이 좋은 AssertJ 예
assertThat(a + b).isEqualTo(sum);

이 경우 a와 b를 더한 값이 sum과 같아야 한다는 의미로 명확하게 읽히기 때문에 코드를 읽는 사람이 헷갈리지 않는다.

자주 사용하는 AssertJ 메서드