테스트 코드 작성하기
1. 테스트 코드 기본 틀 만들기
@SpringBootTest // 해당 클래스를 스프링 부트와 연동하여 테스트
class ArticleServiceTest {
@Autowired
ArticleService articleService; // articleService 객체 주입
@Test
void index() {
2. index() 테스트하기
@Test
void index() {
// 1. 예상 데이터
Article a = new Article(1L, "가가가가", "1111");
Article b = new Article(2L, "나나나나", "2222");
Article c = new Article(3L, "다다다다", "3333"); // 예상 데이터 객체로 저장
List<Article> expected = new ArrayList<Article>(Arrays.asList(a, b, c)); // a, b, c 합치기
// 2. 실제 데이터
List<Article> articles = articleService.index();
// 3. 비교 및 검증
assertEquals(expected.toString(), articles.toString());
}
3. show() 테스트하기
@Test
void show_성공_존재하는_id_입력() { // 메서드 이름 수정
// 1. 예상 데이터
Long id = 1L;
Article expected = new Article(id, "가가가가", "1111"); // 예상 데이터 저장
// 2. 실제 데이터
Article article = articleService.show(id); // 실제 데이터 저장
// 3. 비교 및 검증
assertEquals(expected.toString(), article.toString()); // 비교
}
@Test
void show_실패_존재하지_않는_id_입력() { // 메서드 이름 수정
// 1. 예상 데이터
Long id = -1L;
Article expected = null; // 예상 데이터 저장
// 2. 실제 데이터
Article article = articleService.show(id); // 실제 데이터 저장
// 3. 비교 및 검증
assertEquals(expected, article); // 비교
}
4. create() 테스트하기
@Test
void create_성공_title과_content만_있는_dto_입력() { // // 메서드 이름 수정
// 1. 예상 데이터
String title = "라라라라"; // title과 content 값 임의 배정
String content = "4444"; // title과 content 값 임의 배정
ArticleForm dto = new ArticleForm(null, title, content); // dto 생성
Article expected = new Article(4L, title, content); // 예상 데이터 저장
// 2. 실제 데이터
Article article = articleService.create(dto); // 실제 데이터 저장
// 3. 비교 및 검증
assertEquals(expected.toString(), article.toString()); // 비교
}
@Test
void create_실패_id가_포함된_dto_입력() { // 메서드 이름 수정
// 1. 예상 데이터
Long id = 4L; // title과 content 값 임의 배정
String title = "라라라라"; // title과 content 값 임의 배정
String content = "4444"; // title과 content 값 임의 배정
ArticleForm dto = new ArticleForm(id, title, content); // dto 생성
Article expected = null; // 예상 데이터 저장
// 2. 실제 데이터
Article article = articleService.create(dto); // 실제 생성 결과 저장
// 3. 비교 및 검증
assertEquals(expected, article); // 비교
}
5. 여러 테스트 케이스 한 번에 실행하기
// 트랜적션 패키지 임포트
import org.springframework.transaction.annotation.Transactional;
(중략)
@Test
@Transactional // 어노테이션 추가
void create_성공_title과_content만_있는_dto_입력() {
(중략)
}
@Transactional // 어노테이션 추가
void create_실패_id가_포함된_dto_입력() {
(중략)
}
마무리
- 테스트
- 프로그램의 품질을 검증하는 것
- 의도대로 프로그램이 잘 동작하는지 확인
- 테스트 코드 작성법
- 예상 데이터 작성하기
- 실제 데이터 확득하기
- 예상 데이터와 실제 데이터 비교하여 검증하기
- 프로그램 코드가 테스트를 통과: 지속적인 리팩터링으로 코드 개선
- 통과X: 잘못된 부분을 찾아 고치는 디버깅을 함
- 테스트 케이스
- 테스트는 다양한 경우를 대비해 작성하는데, 이를 테스트 케이스라고 함
- 성공할 경우와 실패할 경우로 모두 고려
- test 디렉터리 위치
- test 디렉터리는 main 디렉터리 아래에 만들어지는데, test > java 디렉터리로 생성
- @SpringBootTest
- 스프링 부트와 해당 클래스를 연동해 테스트할 때 사용하는 어노테이션
- 테스트 케이스에서 스프링 부트가 관리하는 다양한 객체를 주입받을 수 있음