상똥이의 Back-End 공부방
[Board Project] 7. 데이터베이스 연결 테스트 (JPA/ assertj) 본문
목차
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);
}
}
'프로젝트 > 게시판 만들기' 카테고리의 다른 글
[Board Project] 9. 데이터베이스 접근 로직 구현 (0) | 2023.10.12 |
---|---|
[Board Project] 8. 메타데이터 공동 필드 추출하기 (0) | 2023.10.11 |
[Board Project] 6. 데이터베이스 연결 테스트 준비 (mokaroo/ MySQL/ JPA) (0) | 2023.10.09 |
[Board Project] 5. 데이터베이스 연동하기(2) (annotation/ JPA) (0) | 2023.09.05 |
[Board Project] 4. 데이터베이스 연동하기 (MySQL/ JPA) (0) | 2023.09.05 |