개발 공부 기록/07. TIL

스프링 부트 3로 백엔드 입문하기 TIL - 4장 : 스프링 부트 3와 테스트

박세류 2023. 10. 24. 03:54

✍학습 키워드

테스트 코드 개념 익히기

  • 테스트 코드는 작성한 코드가 의도대로 잘 동작하고 예상치 못한 문제가 없는지 확인할 목적으로 작성하는 코드이다.
    • test 디렉터리에서 작업한다
  • 다양한 패턴이 존재하는데, given-when-then 패턴을 주로 사용한다
    • given-when-then 패턴은 테스트 코드를 세 단계로 구분해 작성하는 방식을 말한다.
      • given은 테스트 실행을 준비하는 단계
      • when은 테스트를 진행하는 단계
      • then은 테스트 결과를 검증하는 단계
        • 준비하는 과정, 저장하는 과정(테스트), 검증하는 과정 이여서 세단계로 나뉘는 것이다.

@SpringBootTest

  • 메인 애플리케이션 클래스에 추가하는 애너테이션인 @SpirngBootApplication이 있는 클래스를 찾고 그 클래스에 포함되어 있는 빈을 찾은 다음 테스트용 애플리케이션 컨텍스트 라는 것을 만든다.

@AutoConfigureMockMvc

  • MockMvc는 애플리케이션을 서버에 배포하지 않고도 테스트용 MVC 환경을 만들어 요청 및 전송, 응답 기능을 제공하는 클래스, 컨트롤러를 테스트 할 때 사용하는 클래스이다.

📝새로 배운 개념

spring-boot-starter-test

  • 테스트를 위한 도구가 모여 있다.
    • JUnit : 자바 프로그래밍 언어용 단위 테스트 프레임워크
    • Spring Test & Spring Boot Test : 스프링 부트 애플리케이션을 위한 통합 테스트 지원
    • AssertJ : 검증문인 어설션을 작성하는 데 사용되는 라이브러리
    • Mockito: 테스트에 사용할 가짜 객체인 목 객체를 쉽게 만들고, 관리하고, 검증할 수 있게 지원하는 테스트 프레임워크
    • ⇒ JUnit과 AssertJ를 가장 많이 사용한다.

JUnit?

  • 자바 언어를 위한 단위 테스트 프레임워크.
    • 단위테스트 ⇒ 작성한 코드가 의도대로 작동하는지 작은 단위로 검증하는 것(보통 메소드)
    @DisplayName("1 + 2 는 3이다")
        @Test // 테스트 메서드
        public void junitTest(){
            int a = 1;
            int b = 2;
            int sum = 3;
    
            Assertions.assertEquals(sum, a+ b); // 값이 같은지 확인
    
        }
    
    • @DisplayName ⇒ 테스트 이름을 명시
    • @Test ⇒ 테스트를 수행하는 메서드 ( 테스트끼리 영향을 주지 않도록 각 테스트를 실행할 때마다 테스트를 위한 실행 객체를 만드로 테스트가 종료되면 실행 객체를 삭제한다. )
{
    @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 어노테이션
    • 전체 테스트를 시작하기 전에 처음으로 한 번만 실행된다.
      • DB 연결, 테스트 환경 초기화 등 / 한번만 호출되어야 하므로 static으로 선언해야 한다.
  • @BeforeEach 어노테이션
    • 테스트 케이스를 시작하기 전에 매번 실행한다.
      • 테스트 메서드에서 사용하는 객체를 초기화하거나 테스트에 필요한 값을 미리 넣을때 사용
      • 인스턴스마다 메소드 호출해야 하므로 static 아니어야 한다.
  • @AfterAll 어노테이션
    • 전체 테스트를 마치고 종료할때 한 번만 실행된다.
      • DB 종료, 공통적으로 사용하는 자원 반환 / 마찬가지로 static으로 선언해야 한다.
  • @AfterEach 어노테이션
    • 테스트 케이스를 종료하기 전 매번 실행
      • 테스트 종료 후 특정 데이터를 삭제해야 할때, 마찬가지로 static X
@BeforeAll
@BeforeEach
test1
@AfterEach
@BeforeEach
test2
@AfterEach
@BeforeEach
test3
@AfterEach
@AfterAll

결론은 이렇게 실행된다.

AssertJ

  • 검증문의 가독성을 높여주는 라이브러리.
Assertions.assertEquals(sum, a+b); // 이건 JUnit의 메소드

이거랑

assertThat(a + b).isEqualTo(sum);

얘는 명확성이 다르잖아요.


✨느낀 점&자기 선언

테스트코드를 잘 짜자!

728x90