morenow
morenow
morenow
전체 방문자
오늘
어제
  • 분류 전체보기 (83)
    • 스프링부트와 AWS로 혼자 구현하는 웹 서비스 (5)
    • [MSA] Spring Cloud로 개발하는 마이.. (14)
    • Baekjoon Online Judge (40)
    • Programmers (11)
    • Spring Boot (7)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Feign Client
  • Refresh Token Refresh
  • B Tree
  • Id Token
  • B+ Tree
  • HTTP Interface
  • dirty write
  • HttpExchange
  • re-distribution
  • lost update
  • JWT단점
  • write skew
  • 마법사 상어와 파이어스톰
  • successHandler
  • 백준 파이어스톰
  • jwt
  • copy up
  • Open Feign
  • Spring Boot
  • 백준20058C++

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
morenow

morenow

Spring Boot

[Spring Boot] Unit Test (단위 테스트) vs Integration Test (통합 테스트)

2023. 1. 20. 05:35

TDD

TDD는 Test Driven Development의 약자로 ‘테스트 주도 개발’이라고 한다.

외부의 요구 조건이 많이 바뀔 경우, 팀원이 많은 경우 등 보다 탄탄하게 코드를 짜야 하는 경우에 이러한 개발을 한다.

애초에 테스트 코드까지 2개의 코드를 짜야하니 생산성이 떨어지지만, 나중이 편해진다.

 

테스트 프레임워크 xUnit

가장 대중적인 테스트 프레임워크인데, 대표적인 프레임워크는 다음과 같다.

  • JUnit - Java
  • DBUnit - DB
  • CppUnit - C++
  • NUnit - .net

당연히 Java의 테스트 프레임워크인 JUnit을 쓰겠다. 그 중 JUnit5를 쓰겠다.

이것은 Spring이 아니라 Java의 테스트 프레임워크인 것을 명심해야 한다. 이외에도 TestNG 등이 있다.

Test framework는 많은 annotation으로 테스트 프로그램 작성을 위한 코드를 제공한다. ex) assertThat(), @BeforeEach 등

 

Unit Test 단위 테스트

엄청 큰 프로젝트가 있다고 해보자. 기능의 변경이나 추가 등이 있을 때마다 테스트 서버를 열고 닫아야 하는 것인가? 실제 업무로직을 담당하는 Service layer만 테스트하는 기능이 필요하다. Web layer나 DAO layer와 상관없이 업무 로직의 테스트가 잘 작동되는지를 보아야 하는 것.

따라서 Spring을 실행시키지 않고 service를 제외한 나머지를 POJO 코드로 가짜로 생성해 서비스 로직만 테스트 해야한다.

아래와 같은 것들은 Unit Test가 아니라 Integration Test이다.

  • 데이터베이스에 접근
  • 네트워크를 통한 통신 유발
  • 파일 시스템 접근
  • 다른 unit과 동시에 행하는 test
  • 특별한 configuration이 필요한 테스트

Unit Test를 하려고 할 때 주의해야 할 것들이 있다.

@SpringBootTest 를 사용하지 않고 @ExtendWith(MockitoExtension.class)를 사용

전자를 사용하면 Spring을 실행하면서 테스트한다. 이는 Unit Test가 아니게 된다.

Dependency Injection 중 필드 주입 (field injection) 을 하면 안되고 생성자 주입 (constructor injection)을 해야 한다.
//do not field injection
@AutoWired
private Student student;

//do construct injection
@AutoWired
public Service (Student student) {
	this.student = student;
}

필드 주입 시 IoC Container가 DI를 직접 해주어야 한다. 즉 Spring이 실행되어야 하므로 Unit Test를 위해선 쓰면 안된다.

DAO layer 등 다른 layer는 모두 Mock 처리해야 한다.

다른 layer가 실제로 동작하면 서비스 로직이 제대로 작동하는지 검증할 수 없다. 따라서 각 Repository를 선언할 때 @Mock 처리하고 내가 검증할 service에는 @InjectMocks 처리해서 나머지 Mock들을 주입시킨다.

@Mock
private FirstRepository firstRepository;
@Mock
private SecondRepository secondRepository;
@InjectMocks  // 테스트 하려는 오브젝트에 @Mock 된 오브젝트를 inject
private Service service;

@BeforeEach
void setupService() {
    firstRepository = mock(FirstRepository.class);
    secondRepository = mock(SecondRepository.class);
    service = new Service(firstRepository, secondRepository);
}

Integration Test 통합 테스트

  • Broad Integration Test

@SpringBootTest를 사용해서 실제 실행하는 것과 비슷한 환경을 만들어 테스트한다. 테스트 이후 데이터를 직접 건들였으면 조정이 필요하다.

  • Narrow Integration Test

일부 요소만 테스트한다. @WebMvcTest 혹은 @DataJpaTest 등을 쓰는 테스트가 해당한다.

 

@WebMvcTest는 Unit Test가 못하는 mapping, (De)serialization, Error handling 등을 하기 위해, 가짜 MVC 클래스인 MockMvc 클래스를 주입받아 서버 없이 테스트하는 것이다. 대표적으로 Controller layer를 테스트할 때 쓰인다. GetMapping, PostMapping 등을 Unit Test가 처리하지 못하기 때문이다.

다음 게시글에서 진행하는 테스트가 이에 해당한다. https://morenow.tistory.com/3

 

02장 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 - 스프링 부트에서 테스트 코드를 작성하자

이 글은 이동욱 님의 스프링 부트와 AWS로 혼자 구현하는 웹 서비스를 읽고 정리한 글입니다. 내용보다 중요한 점, 추가적으로 알아본 것 등을 위주로 적었습니다. http://www.yes24.com/Product/Goods/838491

morenow.tistory.com

 

@DataJpaTest는 repository가 같은 JPA bean을 자동 생성한다. 쿼리가 복잡해 JPQL 구문으로 @Query 해야하는 메소드 테스트 하는 데에 주로 쓰인다.

 

https://www.arhohuttunen.com/spring-boot-integration-testing/

 

Spring Boot Integration Testing With @SpringBootTest | Code With Arho

Learn how to write Spring Boot integration tests with @SpringBootTest. Learn different options for customizing the application context for the tests.

www.arhohuttunen.com

 

'Spring Boot' 카테고리의 다른 글

Spring의 새로운 동기식 HTTP Client, RestClient  (0) 2024.03.09
JWT 총정리 (2) - Access Token, Refresh Token  (1) 2024.03.08
JWT 총정리 (1) - JWT의 원리와 흐름  (1) 2023.10.09
Git in IntelliJ - 인텔리제이에서 Git의 모든 것 (2)  (0) 2023.02.03
Git in IntelliJ - 인텔리제이에서 Git의 모든 것 (1)  (0) 2023.01.27
    'Spring Boot' 카테고리의 다른 글
    • JWT 총정리 (2) - Access Token, Refresh Token
    • JWT 총정리 (1) - JWT의 원리와 흐름
    • Git in IntelliJ - 인텔리제이에서 Git의 모든 것 (2)
    • Git in IntelliJ - 인텔리제이에서 Git의 모든 것 (1)
    morenow
    morenow

    티스토리툴바