Junit으로 성능 테스트(Stress Test) 모듈 만들기

웹 어플리케이션을 성능 테스트 하기 위해서는 다양한 툴들이 존재 합니다.
현재 진행하고 있는 프로젝트에서는 “LoadRunner“를 사용하고 있습니다.
또한 아래의 사이트를 참고 하시면 “Opensource Stress Test Tool“를
확인 할수 있습니다.
http://www.opensourcetesting.org/performance.php

물론 이러한 툴을 사용하면 편리하긴 하지만
좀 쓸만한 툴들은 “고가“의 상용 툴인 경우도 있고, 별도로 시간을 내어서
툴을 익혀야하는 경우도 있고 또한 막상 써보면 기능적으로 부족한 부분도
다소 있습니다.

이러한 몇몇 이유로 가끔 직접 “성능테스트 모듈“을 만들어 사용 합니다.
무엇보다 직접 만드는 큰 이유는 “개발자 레벨에서 선행 성능 테스트를 해보는 것” 과
HttpClient 성능 튜닝등 개발툴로는 한계가 있는 부분“을 테스트 하는 경우 입니다.

그전에는 직접 “쓰레드를 생성하는 모듈“, “실행하는 모듈“, “테스트 런쳐 모듈
등을 만들었습니다.
그러다 보니 소스도 다소 지저분하고, 무엇보다 “Junit” 같은 “테스트 프레임웍
과 같이 사용하기가 어려웠습니다.

마침 “jMock” 오픈 소스 라이브러리에서 제가 고민했던 부분을
지원해서 간단하게 소개 하고자 합니다.

(1) pom.xml 설정

jMock 버전은 반드시 “2.6.0-RC2” 이상이어야 합니다.
Spring은 수행시간 측정을 위해서  “StopWatch” 클래스가 필요하기
때문에 설정을 했습니다.

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>pe.beyondj2ee</groupId>
	<artifactId>stress</artifactId>
	<version>0.0.1-SNAPSHOT</version>

	<dependencies>

		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.10</version>
		</dependency>

		<dependency>
			<groupId>org.jmock</groupId>
			<artifactId>jmock</artifactId>
			<version>2.6.0-RC2</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>3.1.2.RELEASE</version>
		</dependency>
	</dependencies>
</project>

(2) Junit 소스

package pe.beyondj2ee.streetest;

import java.util.concurrent.atomic.AtomicInteger;

import org.jmock.lib.concurrent.Blitzer;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.util.StopWatch;

public class TestStress {
	// ~ Static fields/initializers ~

	AtomicInteger c;

	// 첫번째 파라미터 action, 두번째 파라미터 쓰레드 갯수
	Blitzer blitzer = new Blitzer(10000, 10);

	@Before
	public void setUp() {
		c = new AtomicInteger(0);
	}

	@Test
	public void testRequest() throws Exception {

		StopWatch sw = new StopWatch();
		sw.start();
		blitzer.blitz(new Runnable() {
			public void run() {
				c.getAndIncrement();
				System.out.println(Thread.currentThread().getName() + ": done");
			}
		});// end thread

		sw.stop();
		System.out.println("execute time : " + sw.getTotalTimeSeconds());
		System.out.println("execute count : " + c.get());
	}

	@After
	public void tearDown() throws InterruptedException {
		blitzer.shutdown();
	}
}

위의 예제는 “AtomicInteger c”변수에 각 쓰레드들이 실행하면서
1“씩 증가 하는 로직 입니다.
먼저 “Blitzer” 멤버 변수를 선언 합니다. 생성자의 첫번째 파라미터는
action 수“를 말하며, 두번째 파라미터는
Thread Pool 안에 존재할 Thread의 갯수“를 의미 합니다.

즉,  일을 10,000번 수행하는데,  10개의쓰레드로 처리하라
라는 뜻입니다. 10개의 쓰레드가 강제로 1,000개의 일을
할당 하는 것보다 좀더 효율적 입니다.

run” 메서드는 실제로 실행할 로직을 구현하는 메서드 입니다.
위의 소스는 “AtomicInteger c를 1 증가하고, 현재 쓰레드
아이디를 출력하는 로직” 입니다.

결과는 아래와 같습니다.

이미지 2

좀더 다양한 “Junit 성능 테스트“를 알고 싶은 분들은 아래의 사이트를
참고 하세요

http://jmock.org/threads.html

One thought on “Junit으로 성능 테스트(Stress Test) 모듈 만들기”

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중