당니의 개발자 스토리
JUnit과 Assertion으로 테스트 코드 작성하기 본문
Spring으로 개발을 하다 보면 자연스럽게 테스트 코드를 작성하게 된다.
처음에는 그냥 실행해서 확인하면 되지 않나 싶지만,
프로젝트가 커질수록 코드가 제대로 동작하는지 자동으로 검증하는 과정이 필요해진다.
이때 사용하는 것이 JUnit이다.
JUnit이란?
JUnit은 자바에서 테스트 코드를 작성하고 실행하기 위한 라이브러리다.
쉽게 말하면 '코드가 제대로 동작하는지 자동으로 확인해주는 도구' 라고 보면 된다.
예를 들어 어떤 메서드가 있다고 해보자.
public int add(int a, int b) {
return a + b;
}
이 메서드가 제대로 동작하는지 확인하려면 직접 실행해보면 된다.
하지만 사람이 확인하면 매번 확인해야 해서 귀찮고, 또 실수할 수도 있다.
그래서 테스트 코드를 따로 작성한다.
@Test
void addTest() {
int result = add(2, 3);
Assertions.assertEquals(5, result);
}
이렇게 작성하면 add(2, 3)의 결과가 5인지 자동으로 검증해준다.
다르면 테스트가 실패한다.
@Test는 무엇일까?
@Test는 이 메서드가 테스트 코드라는 것을 알려주는 어노테이션이다.
JUnit은 @Test가 붙은 메서드를 찾아서 자동으로 실행한다.
테스트 실행 순서
테스트를 작성하다 보면 테스트 실행 전이나 후에 공통 작업이 필요한 경우가 있다.
이럴 때 사용하는 것이 아래 어노테이션이다.
@BeforeEach
void setUp() {
}
각 테스트가 실행되기 전에 매번 실행된다.
@AfterEach
void tearDown() {
}
각 테스트가 끝난 후에 실행된다.
@BeforeAll
static void init() {
}
전체 테스트 시작 전에 한 번만 실행된다.
@AfterAll
static void close() {
}
전체 테스트가 끝난 후 한 번만 실행된다.
@DisplayName
테스트 이름을 더 보기 좋게 바꾸고 싶을 때 사용한다.
@DisplayName("덧셈 테스트")
@Test
void addTest() {
}
Assertion이란?
Assertion은 결과가 기대한 값과 같은지 확인하는 코드다.
가장 많이 사용하는 것이 assertEquals다.
Assertions.assertEquals(기대값, 실제값);
여기서 중요한 점이 있다.
항상 (기대값, 실제값) 순서로 작성해야 한다.
Assertions.assertEquals(5, result);
이렇게 써야 한다.
반대로 쓰면 테스트는 통과할 수 있지만,
에러 메시지가 이상하게 나올 수 있다.
자주 사용하는 Assertion
Assertions.assertNotEquals(1, result);
값이 다를 때 통과한다.
Assertions.assertNull(value);
값이 null이면 통과한다.
Assertions.assertNotNull(value);
값이 null이 아니면 통과한다.
Assertions.assertTrue(condition);
조건이 true면 통과한다.
Assertions.assertFalse(condition);
조건이 false면 통과한다.
Assertions.assertThrows(Exception.class, () -> {
method();
});
예외가 발생하면 통과한다.
Assertions.assertAll(
() -> Assertions.assertEquals(1, a),
() -> Assertions.assertEquals(2, b)
);
assertAll을 쓰면 여러 검증을 한 번에 수행한다.
equals와 same 차이
assertEquals는 값이 같은지를 비교한다.
assertSame은 객체가 같은지를 비교한다.
Assertions.assertSame(obj1, obj2);
같은 객체를 참조해야 통과한다.
Given - When - Then
테스트 코드를 작성할 때 자주 사용하는 구조가 있다.
Given - When - Then 구조다.
Given
테스트를 위한 준비
When
테스트할 동작 수행
Then
결과 검증
@Test
void addTest() {
// Given
int a = 2;
int b = 3;
// When
int result = add(a, b);
// Then
Assertions.assertEquals(5, result);
}
이 구조를 사용하면 테스트 코드가 읽기 쉬워진다.
F.I.R.S.T 원칙
좋은 테스트 코드를 작성하기 위한 기준이다.
Fast
빠르게 실행되어야 한다.
Independent
테스트끼리 서로 영향을 주면 안 된다.
Repeatable
언제 실행해도 같은 결과가 나와야 한다.
Self-Validating
결과를 자동으로 검증해야 한다.
Timely
코드 작성과 함께 테스트를 작성하는 것이 좋다.
'Java, Spring' 카테고리의 다른 글
| DI는 왜 필요할까? 객체 생성 책임과 Spring Container (0) | 2026.05.06 |
|---|---|
| Maven, 빌드 자동화 도구에 대해서 (0) | 2026.05.06 |
| Spring Bean과 Spring Container, 객체를 Spring이 관리하는 이유 (0) | 2026.05.06 |
| Spring의 DI, AOP, PSA, POJO 이해하기 (1) | 2026.05.06 |
| Spring이 JDBC와 트랜잭션 작업을 줄여주는 방식 (1) | 2026.05.06 |