inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

Practical Testing: 실용적인 테스트 가이드

테스트 수행도 비용이다. 환경 통합하기

추상클래스 IntegrationTestSupport을 통한 테스트수행 비용단축에 관한 질문

664

fpg123

작성한 질문수 6

2

안녕하세요 강의 테스트 수행도 비용이다. 환경 통합하기 를 듣다가 궁금한 점이 생겨 질문드립니다.

강의에서는 추상클래스 IntegrationTestSupport에 어노테이션 @SpringBootTest을 달아서 통합테스트가 필요한 테스트클래스가 상속하여 스프링컨테이너가 반복 실행되는걸 단축하는게 인상깊었는데요.

원리가 궁금한 점이 있어 질문드립니다.

  1. 어떤 원리로 마치 스프링컨테이너가 전파되듯이 상속받은 클래스로 설정한 컨테이너가 작동하는걸까요?

  2. 그리고 어떻게 상속받은 클래스가 또 실행될 줄 알고 그 환경(컨테이너)가 어느시점까지 종료되지 않고 지속되고 있는건지 궁금합니다

spring tdd jpa mockito 소프트웨어-테스트 junit5

답변 2

1

박우빈

안녕하세요, fpg123님! :)

AI 인턴님이 잘 설명을 해주었네요 ㅎㅎ
스프링에서 Bean, Component를 Scan하는 방식을 생각해보시면 도움이 되실 것 같아요.
상속 받은 클래스가 또 실행될 줄 알고 환경을 지속한다기 보다는, 수행 전에 이미 Reflection 등으로 어떤 테스트 클래스들이 상속을 받고 있는지를 확인한 후에 수행이 되는 것이죠.

도움이 되셨기를 바랍니다.
감사합니다. :)

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴이에요.
IntegrationTestSupport 추상 클래스는 @SpringBootTest 어노테이션을 사용하여 테스트 클래스가 스프링 컨테이너와 통합 테스트를 수행할 수 있도록 도와줍니다.

IntegrationTestSupport 클래스를 상속받은 테스트 클래스는 @SpringBootTest 어노테이션을 통해 스프링 컨테이너를 설정할 수 있으며, 스프링 컨테이너는 이 테스트 클래스에서 사용되는 빈과 의존성을 미리 로드합니다. 이후에는 테스트 메소드가 실행될 때마다 스프링 컨테이너를 다시 생성하지 않고 이미 로드된 컨테이너를 재사용하는 것이죠.

상속 관계를 통해 스프링 컨테이너가 전파되는 원리는 Java의 상속 특성과 JUnit 테스트 프레임워크가 제공하는 기능을 이용한 것입니다. IntegrationTestSupport 클래스에서 스프링 컨테이너를 띄우고 초기화하는 작업을 수행하고, 이를 상속받은 테스트 클래스에서는 이 작업을 활용하여 추가적인 테스트를 수행할 수 있습니다.

상속 관계에서 상위 클래스가 또한 실행될 줄 아는 이유는 JUnit 프레임워크가 내부적으로 Reflection을 이용해 테스트 클래스의 상속 계층을 분석하고 실행흐름을 제어하기 때문입니다. 따라서 상속 관계에서 테스트 클래스가 실행될 때, 상위 클래스의 설정된 스프링 컨테이너도 같이 실행되게 되는 것이죠.

스프링 컨테이너의 생명주기는 스프링 애플리케이션의 생명주기와 연동됩니다. 보통 스프링 컨테이너는 애플리케이션의 시작 시점에 생성되고, 애플리케이션의 종료 시점에 소멸됩니다. 통합 테스트에서는 테스트 수행 전후로 스프링 컨테이너가 생성되거나 종료되는데, 이는 JUnit의 기능을 이용하여 테스트 실행 전후에 스프링 컨테이너를 생성하거나 종료하는 작업을 추가할 수 있기 때문입니다.

이렇게 상속과 JUnit의 Reflection 기능을 활용하여 IntegrationTestSupport 클래스와 상속받은 테스트 클래스를 통해 스프링 컨테이너의 초기화와 재사용을 구현할 수 있는 것이며, 이를 통해 통합 테스트 수행 시간을 단축할 수 있게 됩니다.

더 자세한 내용은 인프런의 스프링 강의 ‘환경 통합하기’를 참고하세요. 질문이 있으시면 언제든지 물어보세요.
감사합니다.

private 상수 테스트 관련 질문

0

83

1

void는 어떻게 테스트하나요..? void로 애초에 코딩하면 안되나요??

0

126

2

커버리지는 어떻게 활용하시는지 궁금합니다.

0

161

2

테스트 문서화 질문입니다

0

105

2

단위테스트 질문이 있습니다

0

96

2

컨트롤러는 모킹을 한 이유가 궁금합니다.

0

103

2

ERD 가장자리에 있는 도메인 테스트 질문

0

89

2

DTO 검증 필드에 대한 테스트 코드 작성은 어디까지?

0

135

2

OrderCreateRequest DTO에 대해서 궁금한점

0

102

2

고전파의 테스트 대역 사용 대상, 공유 의존성

0

156

2

계층 관련 질문이 있습니다.

0

139

3

'코틀린'에서는 빌더를 따로 쓰지 않는데, 이 때는 어떻게 test fixture를 만드시는지 궁금합니다

1

124

2

혹시 update 로직은 어떻게 테스트하나요? (@Setter?)

0

135

2

단위테스트와 통합테스트의 경계가 궁금합니다.

0

229

2

Service+Repository 통합테스트 관련 질문입니다.

0

150

2

OrderControllerDocsTest 작성 해봤는데요. 날짜 형식이 이상하게 나와요

0

185

2

test 용 .yml

0

90

2

throws Exception

0

80

2

카페키오스크 클래스 문의 ,,

0

89

2

Rest docs 문서용 테스트코드를 따로 작성해야 되나요?

0

174

2

테스트 코드에서 필요한 생성자

0

138

1

tearDown 순서

0

116

2

@Builder 생성자 private

0

136

2

@DisplayName gradle / intellJ

0

93

2