JaPark Bug World

[SpringBoot] 스프링부트3와 테스트 본문

개발새발/스프링부트3 백엔드 개발자 되기

[SpringBoot] 스프링부트3와 테스트

JAstory 2024. 4. 8. 18:49

4.1 테스트 코드 개념 익히기

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

안드로이드 개발을 하면서도 유닛 테스트가 있었지만 사용을 하지 않았다. 확인이 필요한 액티비티 또는 프래그먼트 화면단을 바로 start intent 시켜서 확인하거나 그랬는데, 이것도 앞에 진행해야 할 로직이 있다면 더미데이터로 세팅을 다 해놓거나 하는 번거로움이 크긴 했다. 이번기회에 배워보겠다............

 

테스트 코드란?

테스트 코드에도 다양한 패턴이 존재하지만 given-when-then 패턴에 대해 알아본다.

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

 

4.2 스프링부트3와 테스트

스프링부트는 애플리케이션을 테스트하기 위한 도구와 애너테이션을 제공한다. spring-boot-starter-test 스타터에 있다. 이중에서 JUnit과 AssertJ를 가장 많이 사용한다. 

 

JUnit이란?

자바 언어를 위한 단위 테스트 프레임워크이다. 단위 테스트란 작성한 코드가 의도대로 작동하는지 작은 단위로 검증하는 것을 의미한다. 단위는 보통 메서드가 된다.

 

src > test > java > JUnitTest.java 

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

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

 

JUnit은 각 테스트에 대해 객체를 만들어 독립적으로 실행한다.

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 애너테이션

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

 

@AfterAll 애너테이션

전체 테스트를 마치고 종료하기 전에 한번만 실행된다. 예를 들어 데이터베이스 연결을 종료할때나 공통적으로 사용하는 자원을 해제할 때, 전체 테스트 실행 주기에서 한번만 호출되어야 하므로 메서드를 static으로 선언.

 

@AfterEach 애너테이션

각 테스트 케이스를 종료하기 전에 매번 실행한다. 예를 들어 테스트 이후에 특정 데이터를 삭제해야 하는 경우

 

실행 결과

 

AssertJ로 검증문 가독성 높이기

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

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

 

자주 사용 메서드 표

메서드 이름 설명
isEqualTo(A) A 값과 같은지 검증
isNotEqualTo(A) A 값과 다른지 검증
contains(A) A 값을 포함하는지 검증
doesNotContain(A) A 값을 포함하지않는지 검증
startWith(A) 접두사가 A인지 검증
endsWith(A) 접미사가 A인지 검증
isEmpty() 비어있는 값인지 검증
isNotEmpty() 비어있징 않은 값인지 검증
isPositive() 양수인지 검증

스프링부트3 백엔드 개발자 되기: 자바 편 책(저자 신선영)을 참고하여 정리한 내용입니다.