프로그래밍/Backend
나만의블로그만들기(5)
supernovaMK
2024. 8. 2. 14:36
이번에는 개발 환경 과정에서 테스트 코드를 작성해보려고 한다.
package com.example.firstproject.service;
import com.example.firstproject.dto.ArticleForm;
import com.example.firstproject.entity.Article;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest
class ArticleServiceTest {
@Autowired
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());
}
@Test
void show_성공_존재하는_ID_입력(){
Long id=1L;
Article expected = new Article(1L,"가가가가","1111");
Article article = articleService.show(id);
assertEquals(expected.toString(),article.toString());
}
@Test
void show_실패_존재하지_않는_id_입력() {
Long id=-1L;
Article expected = null;
Article article = articleService.show(id);
assertEquals(expected,article);
}
@Transactional
@Test
void create_성공_title과_content만_있는_dto_입력() {
String title="라라라라";
String content="4444";
ArticleForm dto=new ArticleForm(null,title,content);
Article expected= new Article(4L,"라라라라","4444");
Article article=articleService.create(dto);
assertEquals(expected.toString(),article.toString());
}
@Transactional
@Test
void create_실패_id가_포함된_dto_입력() {
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);
}
}
@SpringBootTest 어노테이션을 붙혀주어 스브링부트와 테스트 코드를 연동시켜준다.
@Transactional 어노테이션을 사용하여 롤백해야하는 상황에 붙혀 주어야지 모든 테스트를 동시에 실행하였을 때 문제가 없이 작동한다.
assertionEquals를 사용하여 두가지 값이 일치하는지를 확인할 수 있다. 이 메서드는 JUnit5에서 제공하는 메서드이다.
참고로 테스트 코드는 JUnit5로 만들었다.
그렇다면 JUnit5란 무엇일까?
JUnit 5는 자바 기반의 단위 테스트 프레임워크인 JUnit의 최신 버전이다. 즉 자바로 단위 테스트를 사용하고 싶을 때 사용하는 프레임 워크인 샘이다.
테스트 코드를 작성하는 과정에서 한가지 오류가 있었다.
repository에서 만든 데이터를 꺼내어서 쓸 때 한글이 깨져서 equals비교를 할 때 오류가 나는 것이였다. 기존 서비스 동작에서는 한글 오류가 없었는데, 테스트 코드에서 데이터를 받아올 때 한글이 깨지면서 생기는 오류였다. intellij에서의 인코딩을 모두 utf-8로 바꾸어서 사용하였지만, 오류는 고쳐지지 않았다.
해결 방법은 build.gradle에서 test하는 경우에 encoding을 utf-8로 추가한다는 내용을 붙혀주었더니 해결이 되었다.
tasks.named('test') {
useJUnitPlatform()
systemProperty 'file.encoding', 'UTF-8'
}
테스트 코드를 작성하면서 TDD 형식의 개발을 처음 해보았다.
TDD에 대해 자세히 알아보는 포스팅을 다뤄볼 예정이다.