게시판 만들기(스프링 부트3, 나도코딩 스터디)/13장. 테스트 코드 작성

13.1~13.2 테스트 코드 작성하기(게시판 만들기 / 길벗 코딩 자율학습단)

coding232624 2023. 12. 6. 11:11

테스트

프로그램의 품질을 검증하는 것

의도대로 프로그램이 잘 작동하는지 확인하는 과정

 

테스트 코드 작성법

1. 예상 데이터 작성하기

2. 실제 데이터 획득하기

3. 예상 데이터와 실제 데이터 비교해 검증하기

 

테스트 케이스

다양한 경우에 대비해 성공 / 실패할 경우를 가정해 만드는 상황(데이터)

 

test 디렉터리 위치

main > java > 프로젝트 > service > ArticleServiceTest

 

@SpringBootTest

스프링 부트와 해당 클래스를 연동해 테스트할 때 사용하는 어노테이션

테스트 코드에서 스프링 부트가 관리하는 다양한 객체를 주입받을 수 있음

 

@Test

해당 메서드가 테스트를 위한 코드라고 선언하는 어노테이션

 

테스트 케이스의 트랜잭션 처리

태스트 시 데이터를 조회하는 것이 아닌 조작(생성 / 수정 / 삭제)하는 작업을 했다면 테스트를 마치고 데이터를 롤백해야함(롤백하지 않을 시 조작된 데이터가 남아 조회과정에서 오류 발생가능)

테스트 메서드 위에 @Transactional 메서드를 붙여 처리

 

조회 / 생성 / 수정 / 삭제 Test메서드

@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_입력() {
        //1. 예상 데이터
        Long id = 1L;
        Article expected = new Article(id,"가가가가", "1111");
        //2. 실제 데이터
        Article article = articleService.show(id);
        //3. 비교 및 검증
        assertEquals(expected.toString(),article.toString());
    }
    @Test
    @Transactional
    void show_실패_존재하지_않는_id_입력() {
        //1. 예상 데이터
        Long id = -1L;
        Article expected = null;
        //2. 실제 데이터
        Article article = articleService.show(id);
        //3. 비교 및 검증
        assertEquals(expected,article);
    }

    @Test
    @Transactional
    void create_성공_title과_content만_있는_dto_입력() {
        //1. 예상 데이터
        String title = "라라라라";
        String content = "4444";
        ArticleForm dto = new ArticleForm(null,title, content);
        Article expected = new Article(4L,title,content);
        //2. 실제 데이터
        Article article = articleService.create(dto);
        //3. 비교 및 검증
        assertEquals(expected.toString(),article.toString());
    }
    @Test
    @Transactional
    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);
    }

    @Test
    @Transactional
    void update_성공_존재하는_id와_title_content가_있는_dto_입력() {
        //1. 예상 데이터
        Long id = 1L;
        String title = "키키키키";
        String content = "5555";
        ArticleForm dto = new ArticleForm(id,title,content);
        Article expected = new Article(id,title,content);
        //2. 실제 데이터
        Article article = articleService.update(id,dto);
        //3. 비교 및 검증
        assertEquals(expected.toString(),article.toString());
    }

    @Test
    @Transactional
    void update_성공_존재하는_id와_title만_있는_dto_입력() {
        //1. 예상 데이터
        Long id = 1L;
        String title = "키키키키";
        ArticleForm dto = new ArticleForm(id,title,null);
        Article expected = new Article(id,title,"1111");
        //2. 실제 데이터
        Article article = articleService.update(id,dto);
        //3. 비교 및 검증
        assertEquals(expected.toString(),article.toString());
    }
    @Test
    @Transactional
    void update_실패_존재하지_않는_id의_dto_입력() {
        //1. 예상 데이터
        Long id = -5L;
        String title = "키키키키";
        String content = "5555";
        ArticleForm dto = new ArticleForm(id,title,content);
        Article expected = null;
        //2. 실제 데이터
        Article article = articleService.update(id,dto);
        //3. 비교 및 검증
        assertEquals(expected,article);
    }

    @Test
    @Transactional
    void delete_성공_존재하는_id_입력() {
        //1. 예상 데이터
        Long id = 1L;
        Article expected = new Article(id,"가가가가","1111");
        //2. 실제 데이터
        Article article = articleService.delete(id);
        //3. 비교 및 검증
        assertEquals(expected.toString(),article.toString());
    }
    @Test
    @Transactional
    void delete_실패_존재하지_않는_id_입력() {
        //1. 예상 데이터
        Long id = -1L;
        Article expected = null;
        //2. 실제 데이터
        Article article = articleService.delete(id);
        //3. 비교 및 검증
        assertEquals(expected,article);
    }
}