[DEV] J-Jay

스프링 부트 테스트 코드 (1) - JUnit 본문

Back-end/Spring

스프링 부트 테스트 코드 (1) - JUnit

J-Jay 2023. 9. 2. 22:20
728x90

테스트 코드

테스트 코드는 작성한 코드가 의도대로 잘 동작하고 예상치 못한 문제가 없는지 확인할 목적으로 작성하는 코드이다.

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

test 디렉터리

테스트 코드에도 다양한 패턴이 있다. 

그중 많이들 사용하는 패턴은 given - when - then 패턴으로 테스트 코드를 세 단계로 구분해 작성하는 방식을 추천한다.

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

스프링 부트 스타터 테스트 목록

  • JUnit : 자바 프로그래밍 언어용 단위 테스트 프레임워크
  • Spring Test & Spring Boot Test : 스프링 부트 애플리케이션을 위한 통합 테스트 지원
  • AssertJ : 검증문인 어설션을 작성하는 데 사용되는 라이브러리
  • Hamcrest : 포현식을 보다 이해하기 쉽게 만드는 데 사용되는 Matcher 라이브러리
  • Mockito : 테스트에 사용할 가짜 객체인 목 객체를 쉽게 만들고, 관리하고, 검증할 수 있게 지원하는 테스트 프레임워크
  • JSONassert : JSON용 어설션 라이브러리
  • JsonPath : JSON 데이터에서 특정 데이터를 선택하고 검색하기 위한 라이브러리

이 중에서 JUnit과 AssertJ를 가장 많이 사용한다.


JUnit

JUnit은 자바 언어를 위한 단위 테스트 프레임워크이다. 

단위 테스트란, 작성한 코드가 의도대로 작동하는지 작은 단위로 검증하는 것을 의미한다. 이때 단위는 보통 메서드이다.

JUnit을 사용하면 단위 테스트를 작성하고 테스트하는데 도움을 준다. 사용법도 간단해 쉽게 익힐 수 있으며, 

무엇보다 테스트 결과가 직관적이다.

  • 테스트 방식을 구분할 수 있는 어노테이션 제공
  • @Test 어노테이션으로 메서드를 호출할 때마다 새 인스턴스를 생성, 독립 테스트 가능
  • 예상 결과를 검증하는 어설션 메서드 제공
  • 사용 방법이 단순, 테스트 코드 작성 시간이 적음
  • 자동 실행, 자체 결과를 확인하고 즉각적인 피드백 제공

JUnit 단위 테스트 코드

    //성공 테스트 케이스
    @DisplayName("1 + 1 = 2")
    @Test //Test Method
    public void junitTest() {
        int a = 1;
        int b = 1;
        int sum = 2;
        Assertions.assertEquals(a + b, sum); // 값이 동일한지 확인
    }
    //실패 테스트 케이스    
    @DisplayName("1 + 2 = 3")
    @Test //Test Method
    public void junitFailedTest() {
        int a = 1;
        int b = 2;
        int sum = 1;
        Assertions.assertEquals(a + b, sum); // 값이 동일한지 확인
    }

@DisplayName 어노테이션은 테스트 이름을 명시한다. 

@Test 어노테이션을 붙인 메서드는 테스트를 수행하는 메서드이다.

JUnit은 테스트끼리 영향을 주지 않도록 각 테스트를 실행할 때마다 테스트를 위한 실행 객체를 만들고 테스트가 종료되면 실행 객체를 삭제한다.

 

위의 테스트 코드는 JUnit에서 제공하는 검증 메서드인 assertEquals()로 a + b 와 sum의 값이 같은지 확인한다.

junitTest() 메소드는 성공사례, junitFailedTest는 실패 사례에 대한 테스트 케이스 이다.

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 JUnitTest1(){
        System.out.println("@Test - JUnitTest1");
    }
    @Test
    public void JUnitTest2(){
        System.out.println("@Test - JUnitTest2");
    }
    @Test
    public void JUnitTest3(){
        System.out.println("@Test - JUnitTest3");
    }
    @AfterAll //전체 테스트 종료전 1회 실행함 따라서 메서드는 static 으로 선언
    static void afterAll() {
        System.out.println("@AfterAll 어노테이션");
    }
    @AfterEach
    public void afterEach() {
        System.out.println("@AfterEach 어노테이션");
    }
}

위의 코드는 많은 어노테이션을 사용하였다.

결과를 살펴보기전 각 어노테이션에 대해 알아보자

 

@BeforeAll 어노테이션

전체 테스를 시작하기 전에 처음으로 한 번만 실행되는 어노테이션이다.

예를 들어 데이터베이스를 연결해야 하거나 테스트 환경을 초기화 할 때 사용한다.

이 어노테이션은 전체 테스트 실행 주기에서 한 번만 호출되어야 하기 떄문에 메서드를 static으로 선언해야 한다.

 

@BeforeEach 어노테이션

 테스트 케이스를 시작하기 전에 매번 실행 되는 어노테이션이다.

예를 들어 메서드에서 사용하는 객체를 초기화 하거나, 테스트에 필요한 값을 미리 넣을 때 사용 가능하다.

각 인스턴스에 대한 메서드를 호출해야 하므로 메서드는 static으로 선언되어서는 안된다.

 

@AfterAll 어노테이션

전체 테스를 마치고 종료하기 전에 한 번만 실행 되는 어노테이션이다.

예를 들어 데이터베이스 연결을 종료할때나 공통적으로 사용하는 자원을 해제할 때 사용할 수 있다.

@BeforeAll 어노테이션과 마찬가지로 전체 테스트 실행 주기에서 한 번만 호출되어야 하므로

메서드는 static으로 선언해야 한다.

 

@AfterEach 어노테이션

 테스트 케이스를 종료하기 전에 매번 실행 되는 어노테이션이다.

예를 들어 테스트 이후에 특정 데이터를 삭제해야 하는 경우 사용한다. @BeforeEach 어노테이션과 마찬가지로

각 인스턴스에 대한 메서드를 호출해야 하므로 메서드는 static으로 선언되어서는 안된다.

 

JUnit 실행 흐름
JUnit 실행 결과

 

'Back-end > Spring' 카테고리의 다른 글

스프링 부트 테스트 코드 (3)  (0) 2023.09.02
스프링 부트 테스트 코드 (2) - AssertJ  (0) 2023.09.02
스프링 부트 계층 파악하기  (0) 2023.09.02
스프링 부트 구조  (1) 2023.09.02
스프링 부트 코드 이해 (2)  (0) 2023.08.31