Ocean_
꾸준한 프로그래밍
Ocean_
전체 방문자
오늘
어제
  • 분류 전체보기 (174)
    • About Me (4)
    • 우아한테크코스 (27)
    • C & LINUX (50)
    • Operating System (12)
    • Database (25)
    • Computer Vision (0)
    • Problem Solving (0)
      • Programmers (0)
      • BOJ (0)
    • 코코코딩공부 (44)
      • Spring (12)
      • JAVA (14)
      • 디자인 패턴 (4)
      • 책 읽기 (4)

블로그 메뉴

  • 홈
  • 방명록

공지사항

인기 글

태그

  • 프로세스
  • C++
  • 자바
  • signal
  • 정규화
  • bean
  • 인덱스
  • 우아한형제들
  • Operating System
  • 1259
  • 우테코5기
  • C
  • 데이터 조작어
  • 백준
  • 우아한테크코스5기
  • DB
  • Linux
  • OperatingSystem
  • 운영체제
  • BOJ
  • 리눅스
  • SIGINT
  • Spring
  • OS
  • 블랙잭
  • 우테코 체스
  • 우아한테크코스
  • 트랜잭션
  • 원시값 포장
  • 우테코

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Ocean_
코코코딩공부

테스트를 더 빠르게 진행시켜보자

코코코딩공부

테스트를 더 빠르게 진행시켜보자

2023. 10. 21. 18:16

ApplicationContext 개선

우리의 서비스는 TestContainer 를 사용중인데 이로 인해 테스트 실행시 컨테이너가 실행되며 처리되는 시간이 길어졌다. 이런 테스트 속도를 개선하고자 하였다.

 

Application Context

Spring TestContext Framework는 ApplicationContext 인스턴스와 WebApplicationContext 인스턴스를 로딩하고 캐싱하는 기능을 한다.

이를 통해 한 번 로드된 컨텍스트를 캐시에 저장해두고 동일 환경 시 해당 컨텍스트를 재사용한다. 만약 이전 테스트와 다른 환경의 컨텍스트가 필요하다면 컨텍스트가 로딩된다.

현재 우리 서비스는 총 11개의 Context 생성된다.

테스트를 진행하면서 다른 환경의 컨텍스트가 빈번하게 발생할 경우 처리되는 시간이 매우 느려질 가능성이 있다. 이를 최적화 해보기로 하였다.

 

이유

https://docs.spring.io/spring-framework/reference/testing/testcontext-framework/ctx-management/caching.html

다음과 같은 공식문서에서는

contextCustomizers(from ContextCustomizerFactory) – this includes @DynamicPropertySource methods as well as various features from Spring Boot’s testing support such as @MockBean and @SpyBean.

@MockBean and @SpyBean이 객체마다 다르게 선언되어 있으면 Context를 재사용할 수 없고 새롭게 생성된다고 한다.

우리의 서비스도 @MockBean 과 @SpyBean이 객체마다 다르게 사용되고 있었다. 이를 줄일 필요가 있었다.

 

개선

class LikedCafeControllerTest extends BaseControllerTest {

    @Autowired
    private MemberRepository memberRepository;
    @Autowired
    private CafeRepository cafeRepository;
    ~~@MockBean~~
    ~~private JwtTokenProvider jwtTokenProvider;~~
    ...
}

다음과 같이 실제객체를 사용할 수 없어 MockBean으로 구성되어있는 객체를 BaseControllerTest 에서 한번에 상속받아 사용하게 한다.

 

@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@ExtendWith(RestDocumentationExtension.class)
public abstract class BaseControllerTest extends BaseTest {

    @LocalServerPort
    private int port;

    @SpyBean
    protected S3Client s3Client;
    @SpyBean
    protected JwtTokenProvider jwtTokenProvider;
}

기존에 실제 객체를 사용한 클래스들도 존재하기 때문에 이를 @MockBean에서 @SpyBean 으로 변경하였고 처리하였다.

이로 인해 Application Context가 새로 생성되는 횟수가 11회에서 4회로 줄었고 테스트 속도도 18%정도 단축되었다.

'코코코딩공부' 카테고리의 다른 글

Batch Insert에 대한 고민(feat. 2배 개선)  (1) 2023.11.01
필터를 사용해 API 성능 로그 만들기  (2) 2023.10.31
TestContainer 사용기 & 테스트 격리  (1) 2023.10.16
DB Replication  (1) 2023.10.15
DataSource 라우팅이 안되는 이유. OSIV  (1) 2023.10.09
  • ApplicationContext 개선
  • Application Context
  • 이유
  • 개선
'코코코딩공부' 카테고리의 다른 글
  • Batch Insert에 대한 고민(feat. 2배 개선)
  • 필터를 사용해 API 성능 로그 만들기
  • TestContainer 사용기 & 테스트 격리
  • DB Replication
Ocean_
Ocean_
dongVeloper

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.