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 |
Tags
- 프롬프트
- await
- 다이내믹 임포트
- 프리코스
- 우테코 프리코스
- MAX_VALUE
- CommonJS
- 우테코
- 8기
- nodejs
- __filename
- Async
- 객체지향
- 파라메트릭 서치
- import.meta.url
- 객체지향의 사실과 오해
- 노드 내장 객체
- 백준
- 안드로이드 스튜디오
- Global
- 순환참조
- 프롬프트엔지니어링
- HttpCookieOAuth2AuthorizationRequestRepository
- Console
- JPA
- 이진탐색
- oAuth2
- __dirname
- exports
- 이분탐색
Archives
- Today
- Total
코딩하는 감쟈
스프링 핵심 개념원리2 본문
Java에서 자주 쓰는 테스트 도구
| 도구명 | 유형 | 주요 용도 및 설명 |
|---|---|---|
| JUnit 5 | 단위 테스트 | Java의 표준 테스트 프레임워크. @Test, @BeforeEach 등 사용 |
| Mockito | Mock 테스트 | 객체를 가짜로 만들어 외부 의존성 없이 단위 테스트 수행 |
| AssertJ | 단언(Assertion) | assertThat(x).isEqualTo(y) 같은 가독성 높은 검증 문법 |
| Spring Boot Test | 통합 테스트 | @SpringBootTest, @WebMvcTest 등으로 스프링 환경 테스트 |
| Testcontainers | 환경 격리 통합 테스트 | Docker 기반의 실제 DB, Redis 등을 띄워 테스트 (CI/CD 친화적) |
| Hamcrest | Matcher 라이브러리 | JUnit의 assertThat()을 더 풍부하게 만드는 조건식 매칭 도구 |
| RestAssured | API 테스트 | RESTful API 테스트를 코드로 수행 (JSON 응답 검사 등) |
| JMH | 성능 벤치마크 | 마이크로 벤치마크 테스트. 메서드 수준 성능 측정에 특화 |
| JaCoCo | 테스트 커버리지 | 테스트가 실제 코드의 몇 %를 실행했는지 리포트 제공 |
| Selenium | UI/브라우저 테스트 | 실제 브라우저를 띄워 웹 UI 테스트 수행 (e2e 테스트 용도) |
1. JUnit 5
- 목적: 단위 테스트
- 특징: 애노테이션 기반 테스트 (@Test, @BeforeEach, @AfterAll 등)
- 통합 테스트, 반복 테스트, 조건부 테스트, 동적 테스트 등 지원
@Test void addTest() { assertEquals(4, calculator.add(2, 2)); }2. Mockito
- 목적: 가짜(Mock) 객체 생성으로 외부 의존성 제거
- 실제 DB, 외부 API 없이도 테스트 가능
UserRepository repo = mock(UserRepository.class); when(repo.findById(1L)).thenReturn(Optional.of(new User("Alice")));3. AssertJ
- 목적: 가독성 높은 검증 문법
- 예:
assertThat(user.getName()).isEqualTo("Alice")4. Spring Boot Test
- 목적: Spring 환경 통합 테스트
- @SpringBootTest, @WebMvcTest, @DataJpaTest 등 사용
- 실제 ApplicationContext 로딩하여 전체 흐름 검증 가능
언제 어떤 도구를 써야 하나
| 테스트 목적 | 추천 도구 |
|---|---|
| 단위 테스트 | JUnit 5, Mockito, AssertJ |
| Spring 통합 테스트 | Spring Boot Test, Testcontainers |
| API 응답 검증 | RestAssured |
| 성능 측정 | JMH |
| 커버리지 분석 | JaCoCo |
| UI 테스트 | Selenium |
AssertJ
AssertJ는 assertEquals(a, b) 같은 JUnit의 기본 assertion보다 더 자연어처럼 읽히고, 체이닝(Chaining)을 통해 복합 조건을 간결하게 검증할 수 있게 해주는 라이브러리이다.
- org.assertj.core.api
- 자주 쓰는 메서드
| 메서드 | 설명 | 예시 |
|---|---|---|
isEqualTo(x) |
값이 x와 같은지 | assertThat(a).isEqualTo(5); |
isNotEqualTo(x) |
값이 x와 다른지 | |
isNull() / isNotNull() |
null 여부 확인 | |
isSameAs(x) |
같은 객체 참조인지 | |
isInstanceOf(Class) |
클래스 타입인지 | |
isIn(a, b, c) |
값이 이 중 하나인지 | isIn("A", "B", "C") |
isNotIn(...) |
포함되지 않는지 확인 |
- 예시
import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.*;
import java.util.List;
import java.util.Map;
import java.util.Optional;
public class AssertJExampleTest {
@Test
void assertjBasicExamples() {
// ✅ 공통 비교 메서드
String actual = "hotpack";
assertThat(actual).isEqualTo("hotpack"); // 값이 같은지
assertThat(actual).isNotEqualTo("other"); // 값이 다른지
assertThat(actual).isNotNull(); // null 아님
assertThat(actual).isInstanceOf(String.class); // 타입 확인
assertThat(actual).isIn("hotpack", "coolpack"); // 특정 값들 중 하나인지
assertThat(actual).isNotIn("warm", "cold");
// ✅ String 전용 메서드
assertThat(actual).startsWith("hot"); // 시작 문자열
assertThat(actual).endsWith("pack"); // 끝 문자열
assertThat(actual).contains("tp"); // 포함 여부
assertThat(actual).hasSize(7); // 문자열 길이
assertThat("").isEmpty(); // 빈 문자열
assertThat("hi").isNotEmpty(); // 비어있지 않음
// ✅ 숫자
int score = 95;
assertThat(score).isGreaterThan(90); // ~보다 큼
assertThat(score).isLessThan(100); // ~보다 작음
assertThat(score).isBetween(90, 100); // 범위 내
assertThat(score).isPositive(); // 양수
assertThat(-10).isNegative(); // 음수
// ✅ List / Collection
List<String> names = List.of("alice", "bob", "charlie");
assertThat(names).hasSize(3); // 리스트 크기
assertThat(names).contains("bob"); // 포함 여부
assertThat(names).doesNotContain("daniel"); // 미포함
assertThat(names).containsExactly("alice", "bob", "charlie"); // 정확히 이 순서로 포함
assertThat(List.of()).isEmpty(); // 빈 리스트
// ✅ Map
Map<String, Integer> scores = Map.of("math", 90, "eng", 85);
assertThat(scores).containsKey("math"); // 키 존재 여부
assertThat(scores).containsEntry("eng", 85); // 키-값 쌍
assertThat(scores).doesNotContainKey("science"); // 없는 키
assertThat(scores).isNotEmpty();
// ✅ Optional
Optional<String> opt = Optional.of("hotpack");
assertThat(opt).isPresent(); // 값 존재
assertThat(opt).contains("hotpack"); // 특정 값 포함
assertThat(Optional.empty()).isEmpty(); // 빈 Optional
// ✅ 예외 검증
assertThatThrownBy(() -> {
throw new IllegalArgumentException("잘못된 입력");
}).isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("잘못된"); // 예외 타입 및 메시지 검증
}}
- 모두 통과하는 과정이다.
'Back-End > spring' 카테고리의 다른 글
| 스프링 핵심 개념원리4 (1) | 2025.07.12 |
|---|---|
| 스프링 핵심 개념원리3 (1) | 2025.07.12 |
| 스프링 핵심 개념원리1 (1) | 2025.07.12 |
| JdbcTemplate, JPA (0) | 2025.02.27 |
| @SpringBootTest와 @Transactional (0) | 2025.02.26 |