Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 파이썬
- JavaScript
- 저장소
- 메소드
- Docker Desktop
- Dict
- AssertJ
- 스프링부트
- 프로그래머스스쿨
- StringBuilder
- class
- 배열
- 클래스
- array
- join()
- thread
- JS
- 자바
- GIT
- Java
- docker
- SSL
- c#
- Swing
- 자바스크립트
- SpringBoot
- event
- 객체
- Python
- synchronized
Archives
- Today
- Total
정리노트
[스프링부트] 테스트 / JUnit, AsserJ, Mockito 본문
스프링 부트 스타터 테스트 목록
JUnit | 자바 프로그래밍 언어용 단위 테스트 프레임워크 |
Spring Test & Spring Boot Test |
스프링 부트 애플리케이션을 위한 통합 테스트 지원 |
AssertJ | 검증문인 어설션을 작성하는 데 사용되는 라이브러리 |
Hamcrest | 표현식을 이해하기 쉽게 만드는 데 사용되는 Matcher 라이브러리 |
Mockito | 테스트에 사용할 가짜 객체인 목 객체를 쉽게 만들고, 관리, 검증할 수 있게 지원하는 테스트 프레임워크 |
JSONassert | JSON용 어설션 라이브러리 |
JsonPath | JSON 데이터에서 특정 데이터를 선택하고 검색하기 위한 라이브러리 |
JUnit
- 테스트 방식을 구분할 수 있는 어노테이션 제공
- @Test 어노테이션으로 메서드를 호출할 때마다 새 인스턴스를 생성, 독립 테스트 가능
- 예상 결과를 검증하는 어설션 메서드 제공
- 사용 방법이 단순, 테스트 코드 작성 시간이 적음
- 자동 실행, 자체 결과를 확인하고 즉각적인 피드백을 제공
- 테스트 성공 -
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
public class JUnitTest {
@DisplayName("1 + 2 는 3") // 테스트 이름
@Test // 테스트 수행 메서드
public void junitTest() {
int a = 1;
int b = 2;
int sum = 3;
Assertions.assertEquals(sum, a + b); // 값이 같은지 확인 (기대값, 검증할 값)
}
}
- 테스트 실패 -
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
public class JUnitTest {
@DisplayName("1 + 2 는 4") // 테스트 이름
@Test // 테스트 수행 메서드
public void junitFailedTest() {
int a = 1;
int b = 3;
int sum = 3;
Assertions.assertEquals(sum, a + b); // 실패하는 케이스 (기대값, 검증할 값)
}
}
테스트 객체 / 테스트 어노테이션
import org.aspectj.lang.annotation.After;
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 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");
}
}
- 테스트 결과 -
AssertJ
JUnit과 함께 사용해 검증문의 가독성을 높여주는 라이브러리
// 예시
// 기본 Assertion
Assertions.assertEquals(sum, a + b); // 기댓값과 비교값 구분 힘듦
// AssertJ
assertThat(a + b).isEqualTo(sum);
// a와 b를 더한 값이 sum과 같아야 함 으로 명확하게 읽힘
AssertJ 대표적인 메서드
MockMvc
given / when / then
- given : 테스트 실행을 준비하는 단계 / 멤버 저장 준비
- when : 테스트를 진행하는 단계 / 멤버 저장
- then : 테스트 결과를 검증하는 단계 / 멤버 검증
package me.rolen24.springbootdeveloper;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.ResultActions;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
import java.awt.*;
import static org.junit.jupiter.api.Assertions.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@SpringBootTest // 테스트용 애플리케이션 컨텍스트 생성
@AutoConfigureMockMvc // MockMvc 생성 및 자동 구성
class TestControllerTest {
@Autowired
protected MockMvc mockMvc;
@Autowired
private WebApplicationContext context;
@Autowired
private MemberRepository memberRepository;
@BeforeEach
public void mockMvcSetUp() {
this.mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
}
@AfterEach
public void cleanUp() {
// 테스트 종료 마다 member 테이블의 모든 데이터 삭제
memberRepository.deleteAll();
}
// TestController의 로직 테스트 코드
@DisplayName("getAllMembers: 아티클 조회 성공")
@Test
public void getAllMembers() throws Exception {
// given
final String url = "/test";
Member savedMember = memberRepository.save(new Member(1L, "손흥민"));
// when
final ResultActions result = mockMvc.perform(get(url)
.accept(MediaType.APPLICATION_JSON));
// then
result
.andExpect(status().isOk())
.andExpect(jsonPath("$[0].id").value(savedMember.getId()))
.andExpect(jsonPath("$[0].name").value(savedMember.getName()));
}
}
@SpringBootTest // 테스트용 애플리케이션 컨텍스트 생성
// 메인 애플리케이션 클래스에 추가하는 @SpringBootApplication이 있는 클래스를 찾고
// 그 클래스에 포함되어 있는 빈을 찾은 다음 테스트용 애플리케이션 컨텍스트 만듦
@AutoConfigureMockMvc // MockMvc 생성 및 자동 구성
// 애플리케이션을 서버에 배포하지 않고도 테스트용 MVC 환경을 만들어
// 요청 및 전송, 응답 기능을 제공 >> 컨트롤러 테스트
//.perform() : 메서드 요청을 전송하는 역할 메서드
//.accept() : 메서드 요청을 보낼 때 응답 받을 타입 정하는 메서드 >> 코드에서는 JSON 명시
// andExpect() : 반환값 검증, 확인 메서드 / ResultActions가 제공
//.isOk() : TestController에서 200을 받음 / HTTP 응답 코드 매핑 확인하기
// jsonPath() : JSON 응답값의 값을 가져오는 메서드
HTTP 주요 응답 코드
4.3 제대로 테스트 코드 작성해보기 - [되기] 스프링 부트 3 백엔드 개발자 되기(2판)
4.3 제대로 테스트 코드 작성해보기
이제 지금까지 배운 내용을 바탕으로 제대로 테스트 코드를 작성해보겠습니다. **01단계** `To do` TestController.java 파일을 열고 클래스 이름 위에 마우…
wikidocs.net
더보기
연습
package me.rolen24.springbootdeveloper;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
@RestController
public class QuizController {
@GetMapping("/quiz") // GET "quiz" >> 실행
// 파라미터의 키가 code 이면 int 자료형의 code 변수와 매핑
public ResponseEntity<String> quiz(@RequestParam("code") int code) {
switch (code) {
case 1:
return ResponseEntity.created(null).body("Created!");
case 2:
return ResponseEntity.badRequest().body("Bad Request!");
default:
return ResponseEntity.ok().body("OK!");
}
}
@PostMapping("/quiz") // POST "quiz" >> 실행
// 요청 값을 Code 객체로 매핑 후 value 값에 따른 반응 보냄
public ResponseEntity<String> quiz2(@RequestBody Code code) {
switch (code.value()) {
case 1:
return ResponseEntity.status(403).body("Forbidden!");
default:
return ResponseEntity.ok().body("OK!");
}
}
}
// POST에서 객체로 사용하기 위한 레코드
// 필드, 생성자, 게터, equals() ... 등 자동 생성
record Code(int value) {}
728x90