본문 바로가기
Java

자바 테스트 코드, JUnit 개념/작성법/예시

by yapdol 2023. 8. 24.

 

 

 

 

 

 

✅ 테스트 코드

: 작성한 코드가 의도대로 작 동작하는지 확인하는 목적으로 작성하는 코드.

 

📌 테스트 코드의 장점

- 유지보수에 좋음.

- 코드 수정 시, 기존 코드가 잘 동작하지 않을까바 걱정하지 않아도 됨.

 

📌 given - when - then' 패턴

: 테스트 코드의 패턴 중 하나로, given-when-then 패턴은 테스트 코드를 3단계로 구분해 작성하는 방식.

- given : 테스트 ' 준비' 단계

- when : 테스트 '진행 ' 단계

- then : 테스트 결과 ' 검증' 단계

 

 

 

✅ 스프링 부트와 테스

스프링 부트는 테스트를 위한 도구/애너테이션을 제공함.

그중 'spring-boot-stater-test' 에 테스트를 위한 도구가 모여있음.

스프링 부트 스타터 테스트 목록
JUnit : 자바용 단위 테스트 프레임워크.
AssertJ : JUnit과 함께 어설션(검증문) 가독성을 높이는데 사용되는 라이브러리.
Mockito : 목 객체(테스트용 가짜 객체) 생성/관리/검증을 지원하는 테스트 프레임워크.
Spring Test & Spring Boot Test : 스프링부트 애플리케이션을 위한 통합 테스트 지원.
JsonPath : JSON 데이터에서 특정 데이터를 선택/검색하기위한 라이브러리.

 

 

 

✅ JUnit

  : 자바용 단위(보통 메서드) 테스트 프레임워크.

JUnit 특징
사용법간단함.
테스트 결과직관적. (즉각적인 피드백)
테스트 방식을 구분할 수 있는 애너테이션 제공
예상 결과검증하는 어설션 메서드 제공
@Test 로 메서드를 호출할 때마다 새 인스턴스 생성, 독립 테스트 가능. 

 

 

 

✅ 테스트에 사용되는 애너테이션 목록

스프링 부트는 테스트를 위한 도구/애너테이션을 제공함.

그중 'spring-boot-stater-test' 에 테스트를 위한 도구가 모여있음.

 

테스트에 사용되는 애너테이션 목록
@SpringBootTest @SpringBootApplication 이 추가된 클래스(메인)을 찾고,
클래스에 포함된 빈을 찾아 테스트용 어플리케이션 컨텍스트를 만듦.

* WebApplicactionContext
: 웹 어플리케이션에 필요한 몇가지 기능이 추가된 인터페이스
@AutoConfigureMockMvc MockMvc를 생성/자동구성하는 애너테이션.
(즉, 컨트롤러 테스트 시, 사용)

* MockMvc
: 어플을 서버에 배포하지않고, 테스트용 MVC 환경을 만들어 요청/전송/응답 기능을 지원.
@DisplayName 테스트 이름 명시.
@BeforeAll - 실행 : 전체 테스트 시작 전 1번 실행.
- 용도 : DB연결 / 테스트 환경 초기화.
- static : O (전체테스트 이므로)
@AfterAll - 실행 : 전체 테스트 종료 전 1번 실행.
- 용도 : DB연결 종료 / 공통적 자원 해제.
- static : O (전체테스트 이므로)
@BeforeEach - 실행 : 각 테스트 케이스 시작 전 실행.
- 용도 : 객체 초기화 / 테스트에 필요한 값 미리 넣을때
- static : X (각 인스턴스에 대해 메서드를 호출해야하므로 public)
@AfterEach - 실행 : 각 테스트 케이스 종료 전 실행.
- 용도 : 특정 데이터 삭제.
- static : X (각 인스턴스에 대해 메서드를 호출해야하므로 public)

 

 

📌 애너테이션 실행 순서

 

📌 애너테이션 적용 예시

import org.junit.jupiter.api.*;

public class JUnitTest {

@BeforeAll
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
static void AfterAll() {
 System.out.println("@AfterAll");
}

@AfterEach
public void afterAll() {
 System.out.println("@BeforeEach");
}

}

 

 

 

 

✅ 테스트 코드 작성 예시

given (준비) : 멤버 저장

when (실행) : 멤버리스트 조회 API 호출

then (검증) :  응답코드 200OK / 0번째 요소의 id, name 값이 저장된 값과 같은지 확인

 

@SpringBootTeset // 테스트용 어플리케이션 컨텍스트 생성
@AutoConfigureMockMvc // MockMvc 생성
class ControllerTest {

 @Autowired
 protected MockMvc mockMvc;
 
 @Autowired
 private WebApplicationContext context;
 
 @Autowired
 protecte MemberRepository memberRepository;

 @BeforeEach // 각 테스트 케이스 실행 전, 실행하는 메서드
 public void mockMvcSetUp() {
   this.mockMvc = MockMvcBuilders.webAppContextSetup(context)
          .build();
  }
  
  @AfterEach // 각 테스트 케이스 종료 전, 실행하는 메서드
  public void cleanUp() {
   memberRepository.deleteAll();
  }
  
  @DisplayName("getAllMembers : 아티클 조회에 성공한다.")
  @Test
  public void getAllMembers() throws Exception {
  
  // given
  final Stirng url = "/test";
  Member savedMember = memberRepository.save(new Member(1L, "홍길동"));
  
  // when
 final ResultActions =  mockMvc.perform(get(url)   // perform() : 메서드 요청 전송
             .accept(MediaType.APPLICATION_JSON)); // accept() : 응답 형태 결정
  
  // then
  result. andExpect(status().isOK())                                // andExpect() : 응답 검증
        . andExpect(jsonPath("$[0].id").value(savedMember.getId())) // jsonPath() : 응답값 가져오기
        . andExpect(jsonPath("$[0].id").value(savedMember.getId()));
 }
 
}

 

 

 

 

 

 

 

참고자료 : 스프링 부트 3 백엔드 개발자 되기: 자바 편

https://product.kyobobook.co.kr/detail/S000201766024

 

스프링 부트 3 백엔드 개발자 되기: 자바 편 | 신선영 - 교보문고

스프링 부트 3 백엔드 개발자 되기: 자바 편 | ★ 자바 백엔드 개발자가 되고 싶다면 ★ 자바 언어 입문 그다음에 꼭 보세요실력을 갖춘 개발자로 성장하려면 시작이 중요합니다. 그래서 이 책은

product.kyobobook.co.kr