스프링부트3 자바 백앤드 개발 입문 - 길벗
포트폴리오 작성할 때 일부 코드를 JUnit test했는데,
책을 읽다보니 좀더 체계적인 test 과정이 있어서 정리한다
테스트란?
테스트 코드의 순서
1. 예상 데이터 작성하기
2. 실제 데이터 작성하기
3. 예상 데이터와 실제 데이터 비교해 검증하기
테스트를 통과하며 지속적인 리팩터링으로 코드를 개선하고
테스트를 통과하지 못하면 디버깅을 통해 잘못된 부분을 찾아 고쳐야한다
테스트는 성공할 경우 뿐만 아니라 실패할 경우도 고려해야한다
또 성공1, 성공2, 실패1, 실패2 .. 이렇게 다양한 상황을 예상해 세부적으로 작성해야한다
테스트를 통한 코드 검증과 리팩터링은 개발자의 기본 소양
TDD(Test Driven Development, 테스트 주도 개발)
일단 테스트 코드를 만든 후 이를 통과하는 최소한의 코드부터 시작해 점진적으로 코드를 개선, 확장해 나가는 개발방식
@SpringBootTest : 해당 클래스를 스프링 부트와 연동해 통합 테스트를 수행하겠다 선언
예시 클래스 ArticleBO.java
public List<Article> index() {
return articleRepository.findAll();
}
test code
ArticleBOTest.java
@SpringBootTest
class ArticleBOTest {
@Autowired
ArticleBO articleBO;
@Test
void index() {
// 예상 데이터: 객체로 저장
Article a = new Article(1, "가가가", "111");
Article b = new Article(2, "나나나", "222");
Article c = new Article(3, "다다다", "333");
List<Article> expected = new ArrayList<Article>(Arrays.asList(a, b, c)); //abc 합치기
// 실제 데이터: index메소드 호출해 결과를 list타입의 articles에 받아온다
List<Article> articles = articleBO.index(); // 모든 게시글을 조회 요청하고 그 결과로 반환되는 게시글 list를 받아온다
// 비교 및 검증
assertEquals(expected.toString(), articles.toString());
}
}
Arrays.asList() 메소드
List<String> list = new ArrayList<>(listA); assertEquals(x. y) 메소드
예시 클래스 ArticleBO.java
public Article show(int id) {
return articleRepository.findById(id).orElse(null);
}
test code
ArticleBOTest.java
@SpringBootTest
class ArticleBOTest {
@Autowired
ArticleBO articleBO;
@Test
void show_성공_존재하는_id_입력() {
// 예상 데이터: id가 1인 게시물의 조회를 요청했다고 가정
int id = 1;
Article expected = new Article(id, "가가가", "111");
// 실제 데이터: show()메소드 호출해서 얻은 결과를 article 객체에 저장
Article article = articleBO.show(id);
// 비교 및 검증
assertEquals(expected.toString(), articles.toString());
}
@Test
void show_실패_존재하지않는_id_입력() {
// 예상 데이터: 존재하지 않는 id를 조회한다고 가정, db에서 조회되는 내용이 없어 null반환할 것
int id = -1;
Article expected = null;
// 실제 데이터: show()메소드 호출해서 얻은 결과를 article 객체에 저장
Article article = articleBO.show(id);
// 비교 및 검증
assertEquals(expected, article);
}
}
예시 클래스 ArticleBO.java
public Article show(ArticleForm dto) {
Article article = dto.toEntity(0;
if (article.getId() != null) {
return null;
}
return articleRepository.save(article);
}
test code
ArticleBOTest.java
@SpringBootTest
class ArticleBOTest {
@Autowired
ArticleBO articleBO;
@Test
void create_성공_title과content만있는_dto_입력() {
// 예상 데이터: 사용자가 새 게시물을 생성한 상황 가정
String title = "라라라"; // id는 db에서 자동으로 생성
String content = "444";
ArtivleForm dto = new ArticleForm(null, title, content);
Article expected = new Article(4, title, content);
// 실제 데이터: create(dto)메소드 호출해서 얻은 결과를 article 객체에 저장
Article article = articleBO.create(dto);
// 비교 및 검증
assertEquals(expected.toString(), articles.toString());
}
@Test
void show_실패_id가포함된_dto_입력() {
// 예상 데이터: id써 줄 필요 없는데 id 입력한 상황 가정
int id = 4;
String title = "라라라";
String content = "444";
ArtivleForm dto = new ArticleForm(id, title, content);
Article expected = null;
// 실제 데이터: create(dto)메소드 호출해서 얻은 결과를 article 객체에 저장
Article article = articleBO.create(dto);
// 비교 및 검증
assertEquals(expected, article);
}
}
혼자 테스트 진행 할 때는 학원에서 배운 내용을 토대로 따라하는 방식이었는데,
실제 데이터랑 예상 데이터를 판단해서 작성해보니까
테스트의 순서랑 성공시, 실패시 설정해야하는 조건 부분에서 이해가 좀 더 되었다