본문 바로가기
3.1SpringBoot/3.1.2 묘공단 SpirngBoot3

[묘공단/spring] 4장 스프링 부트 3와 테스트

by Dohi._. 2023. 10. 1.

포스팅 목차  (책의 목차와 다릅니다 개인적으로 공부한 내용입니다)

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

  4-1. What is 테스트 코드?

  4-2. What is JUnit?

  4-3 JUnit 사용해보기

  4-4. What is AssertJ?
  4-5. 실습

 

 

 

4-1.   테스트 코드란?

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

테스트 코드는 test 디렉터리에서 작업을 진행합니다 

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

그중 소개할 코드는 given-when-then 패턴입니다. 해당 패턴은 테스트 코드를 세 단계로 구분하여 작성하는 방식인데

① given은 테스트 실행을 준비하는 단계, ② when은 테스트를 진행을 하는 단계, ③ then은 테스트 결과를 검증하는 단계입니다. 예를 들어 세로운 메뉴를 저장하는 코드를 테스트를 할경우 테스트 코드는 다음과 같이 given,when,then을 적용해 구현합니다.

@DisplayName("새로운 테스트") // test 실행결과에 새로운테스트라고 뜸
@Test
public void saveMenuTest(){
	//given : 메뉴를 저장하기 위한 준비 과정
    fianl String name = "아메리카노";
    fianl int price = 2000;
    
    fianl Menu americano = new Menu(name,price);
    
    // When : 실제로 메뉴를 저장 
    fianl long savedId = menuService.save(americano);
    
    // then : 메뉴가 잘 추가되었는지 검증
    fianl Menu = menuService.findById(saveId).get();
    asserThat(savedMenu.getName()).isEqualTo(name);
    asserThat(savedMenu.getPrice()).isEqualTo(price);
}

준비과정은 given  실제진행은 When 결과검증은 then 으로 간단하게 이해하시면 될 것 같습니다

 

이 테스트하기 위해 Spring boot에서 도구와 애너테이션을 제공합니다

Spring-voot-starter-test 스타터에 테스트를 위한 도구들이 모여있습니다

목록

  • JUnit
  • Spring Test & Spring Boot Test
  • AsserTJ
  • Hamcrest
  • JSONassert 
  • JsonPath

이중에서 JUnit과 AsserTJ를 가장 많이 사용하기에 이 두 도구를 자세하게 알아보겠습니다.

 

4-2.  What is JUnit?

JUnit은 자바 언어용 *단위 테스트 프레임워크입니다.

*단위테스트 : 작성한 코드가 의도대로 작동하는지 작은 단위로 검증 이때 단위는 보통 메서드.

JUnuit을 사용하면 단위 테스트를 작성하고 테스트를 하는데 도움을 줍니다.

사용법도 간단하고 테스트 결과도 직관적이라 좋습니다

 

JUnit의 특징은 아래와 같습니다

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

 

4-3. JUnit 사용해보기  

이제 JUnit을 실제로 사용을 해보면 

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;


public class JUintTest{
	@DisplayName("1+2=3") //테스트이름설정
    @Test //테스트 메서드
    public void junitTest(){
    	int a= 1, b=2;
   		int sum = 3;
    
    	Assertions.assertEquals(a+b,sum); //값이 같은지 확인
    }
    
	@DisplayName("1+3=4 ") //테스트이름설정
    @Test //테스트 메서드
    public void junitFailedTest(){
    	int a= 1, b=3;
    	int sum = 3;
 	
    	Assertions.assertEquals(a+b,sum); //값이 같은지 확인
    }
}

위의 코드를 분석을 해보면

@DisplayName 테스트 이름을 명시

@Test 는  붙인 메서드는 테스트를 수행하는 메서드가 됩니다

여기서 중요한점은 JUint은 테스트끼리 영향을 주지 않도록 각 테스트를 실행할 때마다 테스트를 위한 실행 객체를 만들고 테스트가 종료되면 실행 객체를 삭제를 합니다

 

또한 테스트를 하는 도중 한개라도 실패하면

테스트가 실패했다는 표시와 함께 전체 테스트를 실패한 것으로 보여줍니다

 

실행 결과

더 깊게 들어가면 Test를 위한 여러 애너테이션이 있습니다

  • @BeforeAll
    • 전체 테스트를 시작하기 전에 처음으로 한 번만 실행합니다
    • 예를들어 DB연결 or test 환경을 초기화 할때 사용합니다
    • 해당 애너테이션은 전체 테스트 실행 주기에서 한 번만 호출되어야 하기에 메서드를 static으로 선언해야합니다
  • @BeforeEach
    • 테스트 케이스를 시작하기 전에 매번 실행합니다
    • 예를 들어 테스트 메서드에서 사용하는 객체를 초기화 혹은 미리 삽입할때 사용됩니다.
    • 각 인스턴스에 대해 메서드를 호출해야 하므로 static이 아니어도 됩니다(public)
  • @AfterAll
    • 전체 테스트를 마치고 종료하기 전에 한 번만 실행 합니다.
    • 예를 들어 DB연결 종료 or 공동적으로 사용하는 자원 해제에 사용합니다
    • 해당 애너테이션은 전체 테스트 실행 주기에서 한 번만 호출되어야 하기에 메서드를 static으로 선언해야합니다
  • @AfterEach
    • 각 테스트 케이스를 종료하기 전 매번 실행합니다.
    • 예를 들어 테스트이후에 특정데이터를 삭제해야할 경우에 사용됩니다.
    • 각 인스턴스에 대해 메서드를 호출해야 하므로 static이 아니어도 됩니다(public)

JUnit의 흐름은 아래처럼 

@BeforeAll로 설정한 메서드가 실행이되고

테스트 케이스 개수 만큼 @BeforeEach → @Test→  @AfterEach의 생명주기로 테스트가 진행합니다

모든 테스트 케이스가 끝나면 @AfterAll로 설정한 메서드를 실행하고 종료합니다.

 

4-4.  What is AssertJ?

이제 JUnit와 많이 같이 사용되는 AssertJ에 대해서 알아 보겠습니다

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

앞에서 작성한 테스트 코드의 Assertion은 기댓값과 실제 비교값을 명시 하지 않으므로 비교 대상이 파악하기 힘듭니다

하지만 가독성이 좋은 AssertJ를 사용한다면

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

이경우에 a+b가 sum과 같아야한다는 의미로 명확하게 읽히기 떄문에 코드를 읽는 사람은 파악하기 편합니다

다양한 메서드를 제공하는 AssertJ에 대한 메서드는 표에 정리하도록 하겠습니다.

 

메서드 이름 설명
isEqualTo(A) A값과 같은지 검증
isNotEqualTo(A) A값과 다른지 검증
contains(A) A값을 포함하는지 검증
doesNotContain(A) A값을 포함하지 않는지 검증
startsWith(A) 접두사가 A인지 검증
endsWith(A) 접미사가 A인지 검증
isEmpty() 비어있는 값인지 검증
isNotEmpty() 비어있지 않은 값인지 검증
isPostive() 양수인지 검증
isNegative() 음수인지 검증
isGreaterThan(1) 1보다 큰 값인지 검증
isLessThan(1) 1보다 작은 값인지 검증



4-5.  실습

위에서도 설명 했지만 Test는 Src/Test 파일에 있습니다.

직접 테스트를위한 test class를 만들어도 class를 직접추출하여 테스트하는 것이 더 좋다 

 

테스트 하고자 하는 클래스 이름을 클릭하고 Alt+Enter를 누르면 Show context Actions 창을 볼수 있는데

해당 창에서는 Create Test로 해당 클래스의 Test를 위한 class가 금방 생성된다.

 

 

 

 


이 글은 골든래빗 《스프링 부트 3 백엔드 개발자 되기 - 자바 편》의 4장 써머리입니다.

 

 

728x90

댓글