자바 Junit 기능중 타임 아웃 테스트 하기

자바(JAVA)

자바 Junit 기능중 타임 아웃 테스트 하기

 

개발환경 : window 7 64bit, Eclipse Kepler, Android 4.2.2,Junit 4.0

 

프로젝트에서 서버 프로그램 중에 배치 개발을 많이 하고 한다. 간단한

로직이라면 별 문제가 되지 않겠지만 실시간 으로 데이터를 조회해서

처리해야 되는 로직중에 시간이 문제 되는 것들이 있다. 그래서 쿼리도

튜닝하고 로직에서 어떻게 시간을 줄일수 있을지 고민 하곤했다.

 

이전에는 보통 소스에서 stop watch 클래스를 만들어 시간을 재고

그 측정값을 로그로 표현해서 관리자가 보도록 했다. 이것은 전체적으로

프로그램이 어느 정도 완료된 후에 해 볼수 있는 테스트 이다.

 

하지만 Junit 은 어노테이션 파라미터 하나로 시간을 테스트 해

볼수 있다. 예를 들어 배치가 돌아야 하는데 특정시간을 넘어서는 안된다.

그 시간을 셋팅하고 Junit 을 돌렸을 때 시간내에 완료하지 못한다면

테스트 실패로 판단한다.

 

Junit 에서는 @Test 어노테이션의 파라미터로 Timeout 을 제공한다.

여기에 원하는 값을 넘기면 된다.

 

1. 예제 코드

 

3가지 함수의 예제를 볼것이다. 두함수는 시간을 벗어나는 함수 이고

하나는 시간안에 들어오도록 만들었다. 그렇게 해서 Junit 이 결과값을

출력하는지 볼것이다.

 

timeoutMethodOneTest() – timeout 값을 2초간 주었다. 그리고 Thread.sleep

5초간 주었으므로 원하는 시간보다 초과할 것을 예상할수 있다. 결과는 실패가

될것이다.

 

timeinMethodTwoTest()첫번째 함수와 반대로 timeout 설정값보다 sleep

시간을 적게 주었다. 결과는 성공으로 나올 것이다.

 

TimeoutMethodRunForEverTest() – timeout 값을 2초로 주었지만 함수내의

로직은 무한 반복으로 돌아가므로 실패를 예상할수 있다.

 

import org.junit.Test;

public class TimeOutTestCase {
	@Test(timeout = 2000)
	public void timeoutMethodOneTest() throws InterruptedException {
		Thread.sleep(5000);
		System.out.println("시간제한 테스트 1!!");
	}

	@Test(timeout = 5000)
	public void timeinMethodTwoTest() throws InterruptedException {
		Thread.sleep(3000);
		System.out.println("시간제한 테스트 2!!");
	}

	@Test(timeout = 2000)
	public void timeoutMethodRunForEverTest() {
		while (true) {
			// Do nothing
		}
	}
}

 

2. 실행후 결과 화면

 

소스에서 예상한대로 2개는 시간이 초과하여 실패로 표시되었다.

그리고 Failure Trace 표시를 보게 되면 설정한 2초 후에 타임아웃 되었다고 나온다.

이로써 Junit 의 유용한 기능을 하나 알게 되었다. 하지만 적용여부는 개인 몫이다.

 

 

Posted by 녹두장군