단위 테스트(Unit Test)란?
*단위 테스트: * 작고 격리된 애플리케이션 코드 블록(일반적으로 함수 또는 메서드)의 정확성을 확인하는 코드 블록 [출처]
즉, 코드의 최소 기능 단위(보통은 메소드 단위)로 테스트를 진행하는 코드
최근에 TDD(Test-Driven Development, 테스트 주도 개발) 을 많이 사용함에 따라, 테스트의 중요성이 증가함
단위 테스트 이외의 테스트 방식에는 통합 테스트(Integration Test), 기능 테스트(Functional Test) 등이 있다.
단위 테스트 장점
새로운 기능 추가시 빠르게 테스트 할 수 있다.
수시로, 반복적으로, 빠르게 테스트 할 수 있다.
프로그램에 문제 발생시, 문제가 발생한 부분을 빠르게 알 수 있다.
테스트 코드가 문서가 될 수 있다.
- 테스트 코드만으로, 해당 메소드의 기능을 파악할 수 있다.
코드 리펙토링이 용이해진다.
- 코드를 수정해도, 단위 테스트를 통해 수정된 코드를 신뢰할 수 있다.
단위 테스트 작성법
하나의 Test Method에 최소한의 기능만 검증하기
외부 라이브러리 등의 사용을 최소화 하기
FIRST 규칙 따르기
- *Fast: * 테스트는 빠르게 돌릴 수 있으며, 자주 실행될 수 있어야 한다.
- *Independent: *각각의 테스트는 독립적 이어야하고, 서로 의존해서는 안된다.
- *Repeatable: * 테스트는 어떤 환경에서도 반복 가능해야 한다.
- *Self-Validating: * 테스트는 true/false 등의 형태로, 테스트 자체적으로 검증 할 수 있어야 한다.
- *Timely: * 테스트는 실제 코드 구현 전에 구현되어야 한다.
JUnit 이란?
- 자바의 단위 테스트를 지원해주는 Framework
- 현재는 JUnit5를 가장 많이 사용한다.
- Spring Boot사용시, 자동으로 라이브러리에 포함되어있다.
JUnit 사용법
Assertions
JUnit에서는 Assert구문을 사용하여 코드 수행 결과를 판단한다. 아래는 자주 사용하는 메소드 구문이다.
Assertions.assertEquals(expect, actual)
actual의 값이 expect와 같은지 판별Assertions.assertSame(expect, actual)
actual의 객체가 expect와 동일한 객체인지 판별Assertions.assertNotNull(Object obj)
obj의 값이 null이 아닌지 판별Assertions.assertTrue(boolean)
bool의 값이 true인지 판별이 외의 다양한 구문은 공식문서를 참고
Anotation
- JUnit에서는 다양한 Anotation을 지원하여, 간단하게 사용 가능하다. 아래는 자주 쓰는 Anotation이다.
@Test
작성하려는 테스트 코드에 붙이면, JUnit Unit Test로 인식한다.@BeforeEach
,@AfterEach
해당 아노테이션을 붙인 테스트 메소드는, 모든 각각의 메소드들의 실행 전 또는 실행 후에 매번 실행된다. 주로 각 단위 테스트 후, 상태를 초기화 하는데 사용한다.@BeforeAll
,@AfterAll
해당 아노테이션을 붙인 테스트 메소드는, 모든 메소드들이 실행 되거나 실행 되기 전에 한번만 실행된다- 그 외에 다양한 아노테이션은 공식문서를 참고
JUnit 사용 예제
package cohttp://m.watch_collector.hajun.repository;
import cohttp://m.watch_collector.hajun.domain.User;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import java.util.List;
public class UserRepositoryTest {
// MemoryUserRepository
UserRepository repository = new MemoryUserRepository();
@AfterEach
public void 레포초기화(){
repository.removeAllUser();
}
@Test
public void 회원추가(){
// Given
User user = new User("new_id", "1234");
// When
repository.addUser(user);
// Then
Assertions.assertEquals(user, repository.findById("new_id").get());
}
@Test
public void 회원삭제_id(){
// Given
String id = "new_id";
User user = new User(id, "1234");
repository.addUser(user);
// When
User deleted = repository.deleteById(id).get();
// Then
Assertions.assertEquals(user, deleted);
Assertions.assertS
}
@Test
public void 회원검색_id(){
// Given
String id = "new_id";
User user = new User(id, "1234");
repository.addUser(user);
// When
User searched = repository.findById(id).get();
// Then
Assertions.assertEquals(user, searched);
}
@Test
public void 회원목록조회(){
// Given
User user1 = new User("user1", "123");
User user2 = new User("user2", "456");
User user3 = new User("user3", "789");
repository.addUser(user1);
repository.addUser(user2);
repository.addUser(user3);
// When
List<User> list = repository.findAll();
// Then
Assertions.assertEquals(3, list.size());
}
}
'이것저것 > Java' 카테고리의 다른 글
[인텔리제이] Maven Archetype 과 Java FX의 차이점 (1) | 2024.10.22 |
---|---|
[Java] 빠른 입출력, BufferedReader, BufferedWriter (1) | 2024.10.03 |
[Java] URL 이미지를 로컬 파일로 저장 (0) | 2024.06.15 |
자바 Optional 자주 쓰는 문법 정리 (0) | 2024.06.15 |
[IntelliJ] 기존 프로젝트 Maven 프로젝트로 변경하기 (Add Framework Support 안보일 때) (0) | 2024.06.06 |