본문 바로가기
PlayGround/AWS 연습

[Project] mini1 - Test Code 작성

by HJ0216 2023. 10. 1.

이 글은 향로님의 [스프링부트로 웹 서비스 출시하기] 참고하며 프로젝트를 만들며 정리한 글입니다.

 

2) 스프링부트로 웹 서비스 출시하기 - 2. SpringBoot & JPA로 간단 API 만들기

이번 시간엔 SpringBoot & JPA로 간단한 API를 만들 예정입니다. Tip) 아직 SI 환경에선 Spring & MyBatis 를 많이 사용하지만, 쿠팡/우아한형제들/NHN Entertainment 등 자사 서비스를 개발하는 곳에선 SpringBoot & J

jojoldu.tistory.com

 

 

👉 기본 환경

- Language: Java

- DB: MySQL

- IDE: IntelliJ

 

 

해당 포스팅에서는 Repository를 Spring Data JPA를 사용하여, JPARepository를 상속받아서 구현하였지만,JPA 기본 강의에서 배운 EntityManager를 활용해보고자 변경하여 진행하였습니다.

🙂 김영한의 [자바 ORM 표준 JPA 프로그래밍 - 기본편]

 

 

PostRepositoryTest.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package com.project.mini1.domain.posts;
 
import static org.assertj.core.api.Assertions.assertThat;
 
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.Rollback;
import org.springframework.transaction.annotation.Transactional;
 
import java.util.List;
 
@SpringBootTest
public class PostRepositoryTest {
 
    @Autowired
    PostRepository postRepository;
 
    @Test
    @Transactional
    public void 게시글_저장() throws Exception {
        // given
        // 테스트 기반 환경을 구축하는 단계
        Posts post = Posts.builder()
                .title("테스트 제목")
                .content("테스트 본문")
                .author("테스트 저자")
                .build();
 
 
        // when
        // 테스트 하고자 하는 행위 선언
        Long saveId = postRepository.save(post);
        Posts findPost = postRepository.findOne(saveId);
 
        // then
        // 테스트 결과 검증
        assertThat(findPost.getId()).isEqualTo(post.getId());
        // findOne id의 return 값 = save id의 return 값과 같은가
        assertThat(findPost).isEqualTo(post);
        System.out.println("findPost == post: " + (findPost == post));
 
    }
 
}
 
 

@SpringBootTest

    - 스프링과 관련되어 통합테스트를 진행할 때 사용(특히 DB와 연동되어 처리 할 경우 사용)

 

@RunWith(SpringRunner.class)

    - Springboot 3.x대 사용

    - 기본 설정 : JUnit5(Spring Web Dependency 사용 시, 자동으로 추가)

        - @ExtendWith(SpringExtension.class)로 대체 됨(생략 가능)

 

* JUnit: 자바 프로그래밍 언어용 단위 테스트 프레임워크

 

@Test

    - 테스트 메서드임을 선언

@Transactional

    - 해당 범위 내 메서드가 트랜잭션이 되도록 보장, 선언적 트랜잭션

 

Test Code 작성법

1. given

    - 테스트 기반 환경 구축

    - Builder로 인스턴스 생성 후, 변수 선언(추후, 검증 시 활용)

 

2. when

    - 테스트하고자 하는 행위 선언

    - Spring Data JPA를 사용하면 JPARepository를 상속받기 때문에 기본 메서드는 따로 구현하지 않아도 되지만, EntityManger를 사용할 경우, Repository에서 테스트하고자 할 메서드 구현 필수

 

3. then

    - 테스트 결과 검증

    - assertThat

        - 모든 테스트 코드는 asssertThat() 메서드에서 출발
        - AssertJ에서 제공하는 다양한 메서드를 연쇄 호출하며 코드를 작성

 

🤓 추가

JUnit5에는 @After, @Before 대신 @AfterEach, @BeforeEach 사용

    - 테스트 실행 전후로 작업을 추가하여 테스트 단위별로 독립성을 높일 수 있음

    - Test code는 기본적으로 수행 후 자동으로 rollback 진행하므로 cleanup() 작성 X

 

 

 

🔗 소스 코드

 

GitHub - HJ0216/mini1: SpringBoot+JPA Board Mini Project

SpringBoot+JPA Board Mini Project. Contribute to HJ0216/mini1 development by creating an account on GitHub.

github.com

 

📚 참고 자료

 

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 - 인프런 | 강의

실무에 가까운 예제로, 스프링 부트와 JPA를 활용해서 웹 애플리케이션을 설계하고 개발합니다. 이 과정을 통해 스프링 부트와 JPA를 실무에서 어떻게 활용해야 하는지 이해할 수 있습니다., 스프

www.inflearn.com

 

Runwith, springboottest어노테이션이 없이 테스트 하면 어떻게 되나요? - 인프런 | 질문 & 답변

이전에는 그 어노테이션 없이 test를 진행했던것같은데이번에는 저 어노테이션이 추가가되어있네요어떤 차이인거죠?runwith 어노테이션은 junit에 내장된 러너를 사용하는 대신 어노테이션에 정의

www.inflearn.com

 

JUnit 5 User Guide

Although the JUnit Jupiter programming model and extension model do not support JUnit 4 features such as Rules and Runners natively, it is not expected that source code maintainers will need to update all of their existing tests, test extensions, and custo

junit.org

 

[JAVA] UnitTest에서 사용하는 AssertJ의 AssertThat이란?

기본적으로 이 단계를 만족하도록 테스트를 작성할 수 있다. 간혹 그렇지 않은 경우도 있지만 초심자라면 더더욱 이것을 따르는 것이 좋다!! 1. given: 어떤 상황이 주어졌을 때(이 데이터 기반으

hseungyeon.tistory.com

 

@Before, @After - JUnit5

아래의 예제 대로 실행을 하면 Before, test,After 가 순차적으로 진행이 되어야한다. public class BeforeAfter { @Before public void SetUp(){ System.out.println("Before"); } @Test void transformation() { System.out.println("test"); } @

deviscreen.tistory.com