Back-end/Spring

[Spring] 테스트를 위한 애플리케이션 컨텍스트 관리

 

https://withseungryu.tistory.com/84?category=880574

 

[Spring] JUnit - @Before, @After

💡 @Before, @After 란? Test 코드에서 아래 코드가 계속 중복되는 것을 볼 수 있다. ApplicationContext context = new GenericXmlApplicationContext("applicationContext.xml"); User dao = context.getBean("..

withseungryu.tistory.com

위 글에서 JUnit 테스트 수행 방식을 보면 테스트 메소드 개수만큼 애플리케이션 컨텍스트가 만들어짐을 볼 수 있다.

 

빈이 많아지고 복잡해지면 애플리케이션 컨텍스트 생성에 많은 시간이 걸릴 것이다.

또한 애플리케이션 컨텍스트가 만들어질 때 모든 싱글톤 빈 오브젝트가 초기화되기 때문에,

이 초기화 작업 시 시간을 필요로 할뿐더러

초기화시 어떤 빈은 독자적으로 많은 리소스를 할당하거나 독립적인 스레드를 띄우기도 한다.

 

이런 경우에 많은 문제를 일으킬 수 있다.

 

따라서  JUnit이 매번 테스트 클래스의 오브젝트를 만들 때마다 애플리케이션 컨텍스트를 만들지 않도록 해줘야한다.

 

💡 해결 방법

스태틱 필드에 애플리케이션 컨텍스트를 저장해 매번 생성되는 오브젝트들이 참조 할 수 있도록 해주자.

JUnit은 @BeforeClass 스태틱 메소드를 지원해주고 있다.

하지만 스프링(Spring) 프레임워크는 더 편리한 기능을 제공해준다.

 

 

✏️스프링 테스트 컨텍스트 프레임워크

 

스프링 프레임워크가 JUnit의 애플리케이션 컨텍스트 관리를 위해 지원해주는 기능이다.

@Runwith@ContextConfiguration, @Autowired를 붙여 아래와 같이 기능 구현 할 수 있다.

 

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="applicationContext.xml")
public class UserDaoTest {
	@Autowired
	private ApplicationContext context;
    //...생략
    
    @Before
	public void setUp() {			
//		ApplicationContext context = new GenericXmlApplicationContext("applicationContext.xml");
		this.dao = context.getBean("userDao", UserDao.class);
    }
}

 

🧐 @Runwith 란?

JUnit 프레임워크의 테스트 실행 방법을 확장할 때 사용하는 애노테이션

 

🧐 @ContextConfiguration 란?

자동으로 만들어줄 애플리케이션 컨텍스트의 설정파일 위치를 지정

 

 

※ @ContextConfiguration이 xml 파일을 잘 못찾는 경우 해결 방법

 

 

Project의 Properties -> Java Build Path -> classpath를 확인해준 후 아래와 같이 경로 수정

@ContextConfiguration(locations="classpath:test-applicationContext.xml")

 

🧐 @Autowired 란?

스프링의 DI에 사용되는 특별한 애노테이션

 

Autowired가 붙은 인스턴스 변수가 있으면, 테스트 컨텍스트 프레임워크는 변수 타입과 일치하는 빈을 찾는다.

타입이 일치하는 빈이 있으면 인스턴스 변수에 주입해준다.

 

이때 @Autowired는 applicationContext.xml에 붙은 것이 아닌, AppicationContext에 붙여있는데

애플리케이션 컨텍스트가 DI 된걸 볼 수 있는데 왜 그럴까?

 

스프링 애플리케이션 컨텍스트는 초기화할 때 자기 자신도 빈으로 등록해 ApplicationContext타입의 빈이 존재하기 때문이다.

 

검증

위와 같이 한 후 setUp()에 아래와 같이 코드 두 줄을 추가하고 테스트를 실행하면,

@Before
public void setUp() {
		System.out.println(this.context);
		System.out.println(this);        
}

테스트 메소드는 다르지만, 애플리케이션 컨텍스트는 모두 @51b7e5df로 동일함을 알 수 있다.

 

이미 만들어진 애플리케이션 컨텍스트를 재사용할 수 있기 때문에 테스트 실행 시간이 매우 짧아져

수행시간이 각각 1.34초, 0.15초, 0.06초로 확연히 줄어듬을 알 수 있다.

 

📃 정리

프로그램의 효율을 위해 애플리케이션 컨텍스트는 최대한 생성 횟수를 줄이자.

코드 저장소 : https://github.com/withseungryu

 

withseungryu - Overview

exchange student at georgia college & state university - withseungryu

github.com

참고 문서 : 

토비의 스프링3 (이일민)

반응형