테스트
: 프로그램의 품질을 검증하는 것으로, 의도대로 프로그램이 잘 동작하는지 확인하는 과정이다.
@SpringBootTest
: 스프링 부트와 해당 클래스를 연동해 테스트할 때 사용하는 어노테이션이다. 테스트 코드에서 스프링 부트가 관리하는 다양한 객체를 주입받을 수 있다.
@Test
해당 메서드가 테스트를 위한 코드라고 선언하는 어노테이션
본인 프로젝트의 service 메서드를 검증하는 코드를 만들어보자.
마우스 오른쪽 클릭 -> Generate -> Test 를 선택하면 아래와 같은 창이 생성된다.
여기서 테스트하고자 하는 메서드를 클릭해서 test 파일을 생성해준다.
위와 같이 작성하면 test 코드의 기본 틀을 만든 것이다. ArticleService 클래스를 테스트하기 위해 articleService 객체를 선언하는데 이때 외부 객체를 가져오는 것이기 때문에 @Autowired
어노테이션도 작성한다.
이후 맨 처음 설명했던 어노테이션을 확인한다.
테스트를 실행하는 순서는 다음과 같다.
Service 코드에 있는 index() 메서드
public List<Article> index() {
return articleRepository.findAll();
}
data.sql
테스트 코드
@Test
void index() {
//예상 데이터
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));
//실제 데이터
List<Article> articles = articleService.index();
//비교 및 검증
assertEquals(expected.toString(), articles.toString());
}
예상 데이터와 실제 데이터를 비교하는 코드이며 사용한 메서드는
assertEquals(x, y)
이다.
assertEquals(x, y)
: JUnit에서 제공하는 메서드로 예상 데이터(x)와 실제 데이터(y) 를 문자열로 변환하고 비교하며, 일치하면 테스트를 통과한다.
테스트가 통과되었다는 것을 확인할 수 있다.
또 다른 메서드를 테스트하는 과정은 동일하다. 아래와 같은 오류가 발생하는 것은 test 파일이 이미 존재하는 것을 확인하는 오류이기 때문에 OK를 클릭한다.
@Test
void create_성공() {
//예상 데이터
String title = "라라라라";
String content = "4444";
ArticleForm dto = new ArticleForm(null, title, content);
Article expected = new Article(4L, title, content);
//실제 데이터
Article article = articleService.create(dto);
//비교
assertEquals(expected.toString(), article.toString());
}
예상 데이터는 사용자가 새 데이터를 작성하는 상황으로 가정한다고 했을 때, id는 DB에서 자동으로 생성해주기 때문에, 필요한 title, content만 작성해주면 된다. 이를 dto에 객체로 생성하고, expected에 저장한다.
@Test
void create_실패() {
Long id = 4L;
String title = "라라라라";
String content = "4444";
ArticleForm dto = new ArticleForm(id, title, content);
Article expected = null;
Article article = articleService.create(dto);
assertEquals(expected, article);
}
실패 상황은 사용자가 새 게시물을 작성할 때, id 값을 생성할 필요가 없는대도, 임의로 생성했다고 가정한 코드이다. 결과는 id를 사용자가 넣으면 null
이 반환되기 때문에 expected에 null 값을 저장하는 것이다. null 값은 문자열로 변환할 수 없기 때문에 assertEquals()에는 expected와 article을 반환한다.
테스트 케이스의 트랜잭션 처리
테스트 시 데이터를 조작(생성/수정/삭제)했다면 테스트를 마치고 데이터를 롤백해야한다. 롤백하기 위해 이전 포스트인@Transactional
어노테이션을 사용한다.
데이터를 조회하는 테스트를 제외하고는 모두 트랜잭션으로 묶어서 테스트가 종료한 후 원래대로 돌아갈 수 있게 롤백 처리를 해줘야한다.
백엔드 입문자에게 겁을 주는 게시물이군요