[Spring Boot] Day13 - 테스트 코드

Sarah·2025년 12월 13일

Spring Boot

목록 보기
12/17

테스트

  • 테스트 : 프로그램이 의도한대로 잘 작동하는지 확인하는 과정

테스트 코드

  • 테스트 코드를 작성하여 작성한 코드가 의도한대로 작동하는지 확인 할 수 있다.
  • 테스트를 통과하면 지속적인 리팩터링으로 코드 개선
  • 테스트 미통과 시 디버깅 진행
  1. 예상 데이터 작성하기
  2. 실제 데이터 획득하기
  3. 예상 데이터와 실제 데이터 비교 및 검증

테스트 코드 작성하기

  • 서비스 계층에서 테스트하고 싶은 메서드 -> 오른쪽 마우스 클릭 -> Generate -> Test

  • 생성된 테스트 코드는 src -> test 디렉터리 안에 만들어진다.

  @SpringBootTest
  class ArticleServiceTest {
      @Autowired
      ArticleService articleService;
  • @SpringBootTest : 테스트 코드와 스프링부드를 연동해 통합 테스트를 수행하도록 선언하는 어노테이션
  • @Autowired 어노테이션을 추가해 articleService 객체 주입!!

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<>(Arrays.asList(a,b,c));

        // 2. 실제 데이터
        List<Article> articles = articleService.index();

        // 3. 비교 및 검증
        assertEquals(expected.toString(), articles.toString());
    }
  • @Test : 해당 메서드가 테스트 코드임을 선언
  • 예상 데이터는 내가 임의로 만든 데이터와 결과.
  • 실제 데이터는 articleService.index() 호출 했을 때 나오는 결과
  • assertEquals(예상데이터, 실제데이터) 를 사용해서 둘이 일치하는지 확인
  • 테스트 실행은 메서드 시작 행 앞에 있는 실행 버튼 클릭
  • 테스트 통과 시 결과

show() 테스트

1. 성공하는 경우의 테스트

    @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());
    }
  • 예상 데이터 : id가 1인 데이터를 달라고 했을 때, expected는 "가가가가", "1111"
  • 실제 데이터 : 서비스로 show를 호출하고, id (=1)인 데이터를 반환

2. 실패하는 경우의 테스트

    @Test
    void show_실패_존재하지_않는_id_입력() {
    	// 1. 예상 데이터
        Long id = -1L;
        Article expected = null;
        // 2. 실제 데이터
        Article article = articleService.show(id);
        // 3. 비교 및 검증
        assertEquals(expected, article);
    }
  • 예상 데이터 : id가 -1인 데이터를 달라고 했을 때, null 반환
  • 실제 데이터 : 서비스로 show를 호출해서 id가 -1인 데이터 반환 (=null)
  • -1는 절대 없는 id이기 때문에 항상 null이 나옴

create() 테스트

1. 성공하는 경우의 테스트

    @Transactional
    @Test
    void create_성공_title과_content만_있는_dto_입력() {
        // 1. 예상 데이터
        String title = "라라라라";
        String content = "4444";
        ArticleForm dto = new ArticleForm(null, title, content);
        Article expected = new Article(4L, "라라라라", "4444");
        // 2. 실제 데이터
        Article article = articleService.create(dto);
        // 3. 비교 및 검증
        assertEquals(expected.toString(), article.toString());
    }
  • 예상 데이터 : title, content의 데이터를 각각 "라라라라", "4444"로 넣었을 때 예상되는 데이터는 id=4, title="라라라라", content="4444"

  • 실제 데이터 : 서비스의 create 메서드 호출 (매개변수로 dto를 넣음)

  • 즉, title에 "라라라라", content에 "4444"를 넣은 dto를 create로 전달했을 때, 새 Article이 생성되고, id는 DB에 의해 자동으로 부여됨

  • @Transactional : create, update, delete 테스트할 때는 반드시 테스트를 트랜잭션으로 묶어서 테스트가 종료된 후 롤백될 수 있도록 하는 어노테이션

2. 실패하는 경우의 테스트

    @Transactional
    @Test
    void create_실패_id가_포함된_dto_입력() {
        // 1. 예상 데이터
        Long id = 4L;
        String title = "라라라라";
        String content = "4444";
        ArticleForm dto = new ArticleForm(id, title, content);
        Article expected = null;
        // 2. 실제 데이터
        Article article = articleService.create(dto);
        // 3. 비교 및 검증
        assertEquals(expected, article);
    }
  • 예상 데이터는 null
  • 실제 데이터는 articleService.create(dto) -> dto는 id,title,content 폼이 전달됨.
  • 하지만 서비스 create 메서드에서 전달된 dto에 id가 포함되어 있다면 null을 반환하도록 처리함.
    public Article create(ArticleForm dto) {
        Article article = dto.toEntity();
        if(article.getId() != null) {
            return null;
        }
        return articleRepository.save(article);
    }
  • 즉, 예상 데이터인 null과 실제 데이터가 일치하는지 확인

profile
헤맨 만큼 내 땅

0개의 댓글