테스트 작성

OneTwoThree·2023년 6월 12일
0

springboot

목록 보기
5/9

테스트 코드 생성방법

  • 테스트 하고 싶은 대상(원하는 메소드 내에서) 우클릭 -> generate -> test
  • test 폴더 안에 테스트 클래스가 생기고 테스트 코드가 생성됨
package com.example.firstproject.service;

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 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() {
        // 예상
        Article a = new Article(1L, "aaaa", "1111");
        Article b = new Article(2L, "bbbb", "2222");
        Article c = new Article(3L, "cccc", "3333");
        List<Article> expected = new ArrayList<Article>(Arrays.asList(a,b,c));


        // 실제
        List<Article> articles =articleService.index();

        // 비교
        assertEquals(expected.toString(), articles.toString());
    }
}
  • @SpringBootTest 스프링부트와 연동해서 테스트

  • 테스트할 서비스 클래스를 @Autowired로 DI를 통해 가져옴

  • 예상 데이터와 실제 데이터를 비교해준다

  • 테스트 메소드 옆 재생 표시로 테스트해준다

  • 테스트 성공 확인

  • 테스트 실패 확인
    @Test
    void show_성공____존재하는_id_입력() {
        //예상
        Long id = 1L;
        Article expected = new Article(id,"aaaa","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);

        //비교 null은 toString을 호출할 수 없으니까 지워주자
        assertEquals(expected,article);

    }
  • 위와 같이 경우를 나눠서 테스트 할 수도 있음

  • 메소드별로 테스트하지 않고 클래스 옆 버튼으로 한번에 테스트 할 수 있음

테스트 트랜잭션

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 javax.transaction.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() {
        // 예상
        Article a = new Article(1L, "aaaa", "1111");
        Article b = new Article(2L, "bbbb", "2222");
        Article c = new Article(3L, "cccc", "3333");
        List<Article> expected = new ArrayList<Article>(Arrays.asList(a,b,c));


        // 실제
        List<Article> articles =articleService.index();

        // 비교
        assertEquals(expected.toString(), articles.toString());
    }

    @Test
    void show_성공____존재하는_id_입력() {
        //예상
        Long id = 1L;
        Article expected = new Article(id,"aaaa","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);

        //비교 null은 toString을 호출할 수 없으니까 지워주자
        assertEquals(expected,article);

    }


    @Test
    @Transactional
    void create_성공____title과_content만_있는_dto_입력() {
        //예상
        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());
    }

    @Test
    @Transactional
    void create_실패____id가_포함된_dto_입력() {
        //예상
        String title = "라라라라";
        String content = "4444";
        ArticleForm dto = new ArticleForm(4L,title,content);
        Article expected = null;

        //실제
        Article article = articleService.create(dto);

        //비교
        assertEquals(expected,article);

    }


}
  • 클래스 단위로 테스트 할 때는 테스트 트랜잭션을 해줘야 함
  • 데이터 조회가 아닌 생성,삭제,수정 등에는 @Transactional 어노테이션을 붙여줌
  • 다른 테스트 메소드에 영향을 끼칠 수 있기 때문임

0개의 댓글