상똥이의 Back-End 공부방

[Board Project] 7. 데이터베이스 연결 테스트 (JPA/ assertj) 본문

프로젝트/게시판 만들기

[Board Project] 7. 데이터베이스 연결 테스트 (JPA/ assertj)

상똥백 2023. 10. 9. 17:59

목차

1. select 테스트 

2. insert 테스트

3. update 테스트

4. delete 테스트

 

[1. select 테스트 케이스 작성]

1. 존재하는 게시글, 댓글의 개수를 확인한다 (select)

- 테스트 함수의 이름은 givenTestData_whenSelecting_thenWorksFine() //아무 이름이나 상관없다

(1) @DisplayName 어노테이션 삽입 : 괄호 안에 "select test"로 이름 붙여주기

(2) @Test 어노테이션 삽입

(3) articleRepository를 통해 Articleclass의 엔터티 형식을 갖추는 게시글 개수(row, cardination)를 findAll() 메서드로 List<Article> articles에 저장한다.

(4) articleCommentRepository를 통해 ArticleComment.class의 엔터티 형식을 갖추는 댓글 개수(row, cardination)를 findAll() 메서드로 List<ArticleComment> articleComments에 저장한다.

(5) assertThat을 사용하여 각 list가 올바른 개수(=0)를 가지고 있는지 hasSize()와 함께 사용하여 확인한다

※ 혹시나 오류가 난다면 여기에 들어가서 해결 방법 찾아보기

코드(접은 글)

더보기

아직 데이터 삽입 전이므로, 모두 0이어야 한다

다른 수를 넣으면 테스트 실패해야 함

(1) Article개수 확인

    @DisplayName("select 테스트")
    @Test
    void givenTestData_whenSelecting_thenWorksFine() {
        List<Article> articles = articleRepository.findAll();
        List<ArticleComment> articleComments = articleCommentRepository.findAll();

        assertThat(articles)
                .isNotNull()
                .hasSize(0);
    }

(2) ArticleCommenst 개수 확인

    @DisplayName("select 테스트")
    @Test
    void givenTestData_whenSelecting_thenWorksFine() {
        List<Article> articles = articleRepository.findAll();
        List<ArticleComment> articleComments = articleCommentRepository.findAll();

        assertThat(articleComments)
                .isNotNull()
                .hasSize(0);
    }

 

게시글 개수 확인 테스트
passed failed
댓글 개수 확인 테스트
passed failed

(6) 이전 글에서 만들어둔 데이터를 sql파일에 삽입한다.

(7) 게시글, 댓글이 각각 123개 1000개인지 확인한다.

데이터 삽입 후 게시글 개수 확인 테스트
passed failed
데이터 삽입 후 댓글 개수 확인 테스트
passed failed

 

[2. insert test]

1. 새로 삽입된 게시글 인식 여부를 확인한다 (insert)

- 테스트 함수의 이름은 givenTestData_whenInserting_thenWorksFine() //아무 이름이나 상관없다

(1) @DisplayName 어노테이션 삽입 : 괄호 안에 "select test"로 이름 붙여주기

(2) @Test 어노테이션 삽입

(3) count메서드를 사용해 이전 게시글 수를 저장해두는 변수(previousCountArticle)를 만들어둔다

(4) save함수를 사용해 새 게시글을 형식에 맞게 하나 만든다

(5) 기존 게시글 개수보다 하나 더 많아져야 테스트가 성공한다.

 

2. 새로 삽입된 댓글 인식 여부를 확인한다 (insert)

(1) @DisplayName 어노테이션 삽입 : 괄호 안에 "select test"로 이름 붙여주기

(2) @Test 어노테이션 삽입

(3) count메서드를 사용해 이전 게시글 수를 저장해두는 변수(previousCount)를 만들어둔다

(4) save함수를 사용해 새 댓글을 형식에 맞게 하나 만든다. (이때 필요한 게시글은 임시로 만든 savedArticle을 활용한다)

(5) 기존 댓글 개수보다 하나 더 많아져야 테스트가 성공한다.

 

[3. update 테스트]

1. 게시글 내용이 업데이트되는지 확인한다.

(1) findById(1L)로 게시글을 찾아내 업데이트하는 테스트를 진행한다

- 이때 1인 이유는 Id를 기본로 했기 때문이고, 게시글 첫 번째를 의미하며 아무 숫자(1~123)든 상관 없다.

- L을 붙이는 이유는 Id가 Long타입이기 때문에 L을 붙여줘야 하기 때문이다.

(2) article테이블 속성 중 해시태그를 업데이트한다 (다른 속성도 가능)

(3) 업데이트된 해시태그 문구를 변수 updatedHashtag로 설정하고 그 값을 "#springBoot"로 한다

(4) saveAndFlush 메서드를 활용해 바로 변경사항을 데이터베이스에 반영한다

(5) 변수 updatedHashtag와 변경된 사항이 동일한지 hasFieldOrPropertyWithValue메서드를 사용해 확인한다.

 

2. 댓글 내용이 업데이트되는지 확인한다.

(1) findById(1L)로 댓글을 찾아내 업데이트하는 테스트를 진행한다

(2) article_comment 테이블 속성 중 댓글 내용인 content를 업데이트한다 (댓글 특성상 다른 속성은 적절하지 않다)

(3) 업데이트된 댓글 문구를 변수 updatedContent로 설정하고 그 값을 "Sangddong can do it"으로 한다

(4) saveAndFlush 메서드를 활용해 바로 변경사항을 데이터베이스에 반영한다

(5) 변수 updatedcontent와 변경된 사항이 동일한지 hasFieldOrPropertyWithValue메서드를 사용해 확인한다.

 

[4. delete 테스트]

1. 게시글 삭제가 잘 이뤄지느닞 테스트한다.

(1) findById(1L)로 삭제할 게시글을 고다.

(2) 변수 previousArticleCount에 원래 게시글 개수를 저장하고 previousArticleCommentCount에 원래 댓글 수를 저장한다.

- 댓글까지 고려하는 이유는, 댓글의 특성상 게시글이 삭제되면 그 게시글에 달린 댓글도 삭제되어야 하기 때문이다.

(3) 삭제하기로 한 게시글에 달린 댓글의 개수를 변수 deletedCommentSize에 저장한다.

(4) delete메서드를 사용해 게시글을 삭제한다

(5) 게시글 전체 수가 이전보다 한 개 줄었는지 테스트하고, 댓글 전체 수가 이전보다 그 게시글에 포함된 개수만큼 줄었는지 확인한다.

 

 

전체 코드

package com.fastcampus.projectbord.repository;

import com.fastcampus.projectbord.config.JpaConfig;
import com.fastcampus.projectbord.domain.Article;
import com.fastcampus.projectbord.domain.ArticleComment;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.context.annotation.Import;

import java.util.List;

import static org.assertj.core.api.Assertions.assertThat;

@DisplayName("JPA 연결 테스트")
@Import(JpaConfig.class)
@DataJpaTest
class JpaRepositoryTest {
    private final ArticleRepository articleRepository;
    private final ArticleCommentRepository articleCommentRepository;

    public JpaRepositoryTest(
            @Autowired ArticleRepository articleRepository,
            @Autowired ArticleCommentRepository articleCommentRepository
    ) {
        this.articleRepository = articleRepository;
        this.articleCommentRepository = articleCommentRepository;
    }

    @DisplayName("select 테스트")
    @Test
    void givenTestData_whenSelecting_thenWorksFine() {
        List<Article> articles = articleRepository.findAll();

        assertThat(articles)
                .isNotNull()
                .hasSize(0);
    }

    @DisplayName("insert 테스트")
    @Test
    void givenTestData_whenInserting_thenWorksFine() {
        // Given
        long previousCountArticle = articleRepository.count();
       
        // When
        Article savedArticle = articleRepository
                .save(Article.of("new article", "new content", "#spring"));

        // Then
        assertThat(articleRepository.count())
                .isEqualTo(previousCountArticle + 1);
    }

    @DisplayName("update 테스트")
    @Test
    void givenTestData_whenUpdating_thenWorksFine() {
        // Given
        Article article = articleRepository.findById(1L).orElseThrow();
        String updatedHashtag = "#spring";
        article.setHashtag(updatedHashtag);

        // When
        Article savedArticle = articleRepository.saveAndFlush(article);

        // Then
        assertThat(savedArticle).hasFieldOrPropertyWithValue("hashtag", updatedHashtag);
    }

    @DisplayName("delete 테스트")
    @Test
    void givenTestData_whenDeleting_thenWorksFine() {
        // Given
        Article article = articleRepository.findById(1L).orElseThrow();
        long previousArticleCount = articleRepository.count();
        long previousArticleCommentCount = articleCommentRepository.count();
        int deletedCommentsSize = article.getArticleComments().size();

        // When
        articleRepository.delete(article);

        // Then
        assertThat(articleRepository.count())
                .isEqualTo(previousArticleCount - 1);
        assertThat(articleCommentRepository.count())
                .isEqualTo(previousArticleCommentCount - deletedCommentsSize);
    }
}