(코딩 자율학습 스프링 부트3) 13장
코딩에서의 테스트란
테스트
란 프로그램의 품질을 검증하는 절차로 코딩한대로 프로그램이 잘 동작하는지를 확인하는 과정이다
테스트 도구를 활용해 코드를 검증한다는 것은 테스트 코드를 작성해 실행한다는것으로 테스트 코드는 아래와 같다
작성한 코드가 테스트를 통과하면 지속적인 리팩터링
으로 코드를 개선한다 그러나 테스트를 통과하지 못하면 잘못된 부분을 찾아 고치는 디버깅(debugging)
을 해야 한다
‘테스트 주도 개발(TDD, Test Driven Development)’이란 일단 테스트 코드를 만든 후 이를 통과하는 최소한의 코드부터 시작해 점진적으로 코드를 개선 및 확장해 나가는 개발 방식
테스트코드 작성
[검증하고자 하는 메서드(함수) 마우스 우클릭 -> Generate -> Test 클릭]
[Testing library는 JUnit5선택 후 아래에서 테스트하고자 하는 메서드 한번 더 체크후 OK 클릭]
위와 같이 테스트 코드를 생성하면 ‘test > java > com.example.[프로젝트명]]> service > ArticleServiceTest’로 그 이름과 경로가 자바 코드와 동일하게 생성된다
[테스트코드 작성법 3단계]
예상 데이터 작성하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import org.junit.jupiter.api.Test; // Test 패키지 임포트
import static org.junit.jupiter.api.Assertions.*; // 앞으로 사용할 수 있는 패키지 임포트
@SpringBootTest // 해당 클래스를 스프링 부트와 연동해 통합 테스트를 수행하겠다고 선언하는 것 @SpringBootTest를 사용하면 손쉽게 통합 테스트를 위한 환경을 준비해준다. @SpringBootTest는 모든 빈들을 스캔하고 애플리케이션 컨텍스트를 생성하여 테스트를 실행한다
class Project1112ApplicationTests {
@Autowired // 스프링 컨테이너에 등록한 빈에게 의존관계주입이 필요할 때, DI(의존성 주입)을 도와주는 어노테이션이다.
ArticleService articleService; // articleService 객체 주입
@Test // 해당 메서드가 테스트를 위한 코드라고 선언하는 것, 코드 위쪽을 보면 여러 자바 API가 임포트된 것을 확인할 수 있다 @Test 어노테이션을 사용하기 위해 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));
}
}
예상 데이터를 확인했으므로 각 데이터를 Article 객체 a, b, c에 저장한다 이때 id는 Long 타입이므로 접미사 L을 붙인다 a, b, c 3개의 객체를 Arrays.asList() 메서드를 사용해 ArrayList로 합치고 이를 List<Article> 타입의 expected에 저장한다 Arrays 클래스가 빨간색으로 표시되면 마우스를 올린 후 Import class를 클릭하고 Arrays (java.util)을 선택해 관련 패키지를 임포트한다
[Tip] Arrays.asList()메서드 해당 메서드는 입력된 배열 또는 2개 이상의 동일한 타입 데이터를 정적 리스트로 만들어 변환한다 정적리스트는 고정 크기이르므로 add()나 remove()메서드를 사용할 수 없다
실제 데이터 흭득하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import org.junit.jupiter.api.Test; // Test 패키지 임포트
import static org.junit.jupiter.api.Assertions.*; // 앞으로 사용할 수 있는 패키지 임포트
@SpringBootTest
class Project1112ApplicationTests {
@Autowired
ArticleService articleService; // articleService 객체 주입
@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));
// 2. 실제 데이터
List<Article> articles = articleService.index();
}
}
articleService.index() 메서드를 호출해 그 결과를 List<Article> 타입의 articles에 받아 오고 모든 게시글을 조회 요청하여 그 결과로 반환되는 게시글의 묶음을 받아 오는 작업이다
예상 데이터와 실제 데이터 비교해서 검증하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import org.junit.jupiter.api.Test; // Test 패키지 임포트
import static org.junit.jupiter.api.Assertions.*; // 앞으로 사용할 수 있는 패키지 임포트
@SpringBootTest
class Project1112ApplicationTests {
@Autowired
ArticleService articleService; // articleService 객체 주입
@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));
// 2. 실제 데이터
List<Article> articles = articleService.index();
// 3. 비교 및 검증
assertEquals(expected.toString(), articles.toString());
}
}
제 데이터와 예상 데이터가 일치하는지 비교한다 비교는 assertEquals(x, y)
메서드를 이용한다 이 메서드는 JUnit
에서 제공하는데, 예상 데이터(x)와 실제 데이터(y)를 비교해 일치하면 테스트를 통과시킨다 따라서 x에는 예상 데이터를 문자열로 변환한 expected.toString()
을 넣고, y에는 실제 데이터를 문자열로 변환한 articles.toString()
을 넣는다