어떤 제품에서든 우수한 성능은 중요한 경쟁 우위가 될 수 있다. 제품의 모듈에서 코드 변경이 해당 제품의 성능에 부정적인 영향을 주기도 한다. 그런 까닭으로 개발자 입장에서는 코드 변경 후 성능 테스트, 즉 성능 회귀 테스트를 실시하는 것이 중요하다.
이 테크팁에서는 성능 회귀 테스트를 집중적으로 살펴 본다. 이 작업을 살펴보는 과정에서 Japex라고 부르는 오픈 소스 성능 회귀 테스트를 예로 사용한다. 다른 성능 회귀 도구도 사용 가능하다.
Japex는 마이크로 벤치마크 개발 및 테스트 프레임워크이다. 벤치마크란 제품의 성능을 평가하는 테스트이다. 마이크로 벤치마크는 벤치마크의 간단한 버전으로서 주로 특정 코드 모듈을 테스트할 때 쓰인다. Japex에서는 어떤 모듈의 마이크로 벤치마크를 작성하고 이를 자동 실행하며 모듈 변경이 성능에 미치는 영향을 식별하는 결과를 생성하도록 지원한다. Japex 프레임워크는 고도로 구성 가능하며, 사실상 어떤 Java 제품과도 함께 사용할 수 있다.
샘플 응용 프로그램: WSTest 및 Japex 사용
샘플 응용 프로그램이 이 팁에 제공된다. 샘플에서는 Japex 및 WSTest(wstest project에서 개발한 오픈 소스 마이크로 벤치마크)를 사용하는 성능 회귀 테스트를 보여 준다. WSTest는 Java 웹 서비스를 위한 클라이언트 서버 마이크로 벤치마크로서 Java EE 웹 서비스 기술에 중점을 둔다. 이 마이크로 벤치마크에서 시뮬레이션하는 다중 스레드 서버 프로그램은 여러 개의 SOAP 기반 웹 서비스 요청을 병렬 처리한다.
이 샘플 응용 프로그램에서는 WSTest에서 제공한 테스트의 하위 집합을 사용하며, Japex용 드라이버 클래스를 포함한다. 테스트 구성에 사용되는 샘플 구성 파일도 포함되어 있다.
이제 샘플 응용 프로그램 설정 및 실행 방법을 소개한다.
환경 설정
이 팁의 샘플에서는 GlassFish라는 오픈 소스 Java EE 5 참조 구현을 사용한다. GlassFish 응용 프로그램 서버를 다운로드하지 않은 경우, GlassFish Community 다운로드 페이지에서 다운로드한다.
실제로 서로 다른 2개의 GlassFish 응용 프로그램 서버 빌드(서로 다른 2개의 빌드를 선택할 수 있음)를 설치하고 포트 8080 및 9090 각각에서 도메인 인스턴스를 실행해야 한다. 샘플 응용 프로그램에서는 두 빌드를 대상으로 성능 테스트를 실행하고, 각 빌드의 성능 결과를 표시한다. 성능 차이는 두 빌드 간의 웹 서비스 기술 코드의 차이에서 비롯된다. 서버측 성능만 테스트한다. 이 샘플에서는 클라이언트측 성능을 테스트하지 않는다. 이런 방법으로 두 빌드 간 코드 변화의 영향을 측정할 수 있다.
또한 JDK 5.0(Java SE 다운로드 페이지에서 다운로드 가능)과 Apache Ant 1.6.5(GlassFish 번들에 포함되어 있음, Windows에서는 lib\ant 하위 디렉토리에 있음)도 필요하다.
성능 테스트를 실행하려면 Japex(japex 문서 & 파일 페이지에서 다운로드 가능)가 필요하다.
샘플 응용 프로그램 설치
샘플 패키지를 다운로드하고 압축을 해제한다. 이 샘플의 루트 디렉토리는 techtip\Sample이다. 현재 디렉토리를 techtip\Sample 디렉토리로 변경한다. 빌드 환경에 따라 스크립트(UNIX는 setenv.sh, Windows는 setenv.bat)를 편집한다. 예를 들어, 스크립트의 JAVA_HOME 환경 변수의 값을 해당 시스템에 있는 JDK 5.0의 위치로 변경한다. 그런 다음 스크립트를 실행하여 환경을 설정한다. AS_HOME 환경 변수를 GlassFish 빌드 중 하나의 설치 디렉토리로 설정한다. 서버측 성능만 테스트하므로 클라이언트측에는 AS_HOME 변수 하나만 설정하면 된다.
웹 서비스 구축
샘플에서는 WSTest와 함께 패키징된 WSDL 파일을 사용하여 웹 서비스를 만든다. WSTest에서는 종점 구현 클래스인 TestServiceImpl.java.를 제공한다.
또한 WSTest에서는 샘플을 위해 ant 태스크를 지정하는 빌드 파일, build.xml도 제공한다. ant buid 태스크에서는 WSDL을 사용하여 이동 가능한 아티팩트를 생성하며, 이를 클래스 파일에 컴파일한다. 또한 종점 구현 클래스를 컴파일하고 배포 가능한 WAR 파일을 만든다. build.xml 파일에서 또 다른 태스크, ant deploy가 WAR 파일을 배포한다.
WSTest 구축 및 배포에 대한 자세한 내용은 wstest project site를 참조한다.
클라이언트 구축
다음은 Japex 기반 웹 서비스 클라이언트를 구축하는 단계이다.
- 드라이버 클래스를 작성한다.
- 구성 파일을 작성한다.
- 웹 서비스 실행을 위해 이동 가능한 아티팩트를 생성한다.
- 클라이언트를 컴파일한다.
드라이버 클래스 작성
가상의 사용자를 시뮬레이션하고 서버 시스템에 로드를 생성하려면 드라이버 클래스가 필요하다. Japex 기반의 드라이버 클래스인 TestServiceXMLDriver.java가 샘플 응용 프로그램과 함께 패키징되어 있다. src\client 디렉토리에서 찾으면 된다. 샘플에는 두 응용 프로그램 서버 빌드의 성능을 비교하기 위해 서로 다른 2개의 드라이버 클래스가 포함되어 있다.
Japex driver 클래스는 JapexDriverBase 클래스를 확장해야 하며, 이 클래스는 Japex 드라이버 프레임워크의 JapexDriver 인터페이스를 구현한다. JapexDriverBase 클래스는 Japex 드라이버 프레임워크의 일부이며, JapexDriver 인터페이스의 다음 메소드를 구현한다.
public void initializeDriver(); public void prepare(TestCase testCase); public void warmup(TestCase testCase); public void run(TestCase testCase); public void finish(TestCase testCase); public void terminateDriver(); JapexDriver 인터페이스 및 JapexDriverBase 클래스에 대한 자세한 내용은 해당 사이트를 참조한다.
샘플에서 src\client 디렉토리의 TestServiceBaseDriver.java 클래스는 JapexBaseDriver 클래스를 확장한다. TestServiceBaseDriver 클래스는 JapexDriverBase 클래스의 initializeDriver(), initializeDriver() 및 run()> 메소드를 대체한다.
TestServiceBaseDriver.java 클래스의 initializeDriver() 메소드는 서비스 포트를 생성하고 종점 주소로 이를 초기화한다.
public void initializeDriver() { TestService ts = new TestService(); stub = ts.getTestServicePort(); .... ((BindingProvider) stub).getRequestContext().put( BindingProvider.ENDPOINT_ADDRESS_PROPERTY, getParam("endpoint")); ....prepare() 메소드는 변수, 객체 및 데이터 구조를 채우고, 다음 단계를 위해 준비시킨다.
public void prepare(TestCase testCase) { methodName = testCase.getParam("methodName").intern(); if (methodName == "echoDate") { try { xmlCal = DatatypeFactory.newInstance() .newXMLGregorianCalendarDate(2005, 4, 25, 0); } ...run() 메소드는 초기화 단계에서 생성된 서비스 포트를 사용하여 서버상의 메소드에 대해 웹 서비스 호출을 수행한다.
public void run(TestCase testCase) { if (methodName == "echoVoid") { stub.echoVoid(); } ...드라이버 클래스 작성에 대한 자세한 내용은 Japex 설명서를 참조한다.
구성 파일 작성
Japex 구성 파일은 테스트 스위트를 정의한다. 테스트 스위트는 하나 이상의 드라이버 및/또는 테스트 케이스를 포함할 수 있다. 각 드라이버는 하나 이상의 테스트 케이스를 포함할 수 있다. 구성 파일은 전역 매개 변수를 하나 이상 갖거나 갖지 않을 수도 있다. 구성 파일에서 전역 매개 변수는 드라이버 앞에 나타나며, 드라이버는 테스트 케이스 앞에 나타난다.
구성 파일에서 매개 변수를 사용하여 성능 테스트를 구성할 수 있다. 이 매개 변수는 전역, 드라이버 또는 테스트 케이스의 세 범위를 가질 수 있다. 전역 매개 변수는 모든 드라이버 및 테스트 케이스에 적용된다. 드라이버 매개 변수는 특정 드라이버 및 테스트 케이스에 적용된다. 테스트 케이스 매개 변수는 특정 테스트 케이스에 적용된다.
샘플 응용 프로그램의 Japex 구성 파일은 TestServiceXMLDriver-for-build-comparison.xml이다. 이 파일은 configs 디렉토리에 있다. 테스트 스위트의 이름은 WSpex이다. 이 파일에서는 많은 수의 전역 매개 변수를 정의한다.
<testSuite name="WSpex" xmlns="http://www.sun.com/japex/testSuite" xmlns:xi="http://www.w3.org/2001/XInclude"> <param name="japex.numberOfThreads" value="1"/> <param name="japex.warmupTime" value="00:00:10"/> <param name="japex.runTime" value="00:00:10"/> <param name="japex.warmupsPerDriver" value="1"/> <param name="japex.runsPerDriver" value="1"/> <param name="japex.reportsDirectory" value="reports"/>키워드 japex로 시작하는 매개 변수는 Japex용으로 예약된 것이다. japex.numberOfThreads 매개 변수는 시뮬레이션된 사용자의 수를 정의한다. 매개 변수 japex.warmupTime 및 japex.runTime은 테스트 케이스 매개 변수이다. 이들은 모든 테스트 케이스의 준비 및 실행 기간을 설정한다. 매개 변수 japex.warmupsPderDriver 및 japex.runsPerDriver는 드라이버별로 수행해야 할 준비 및 실행 횟수를 정의한다.
마지막 매개 변수인 japex.reportsDirectory는 보고서 파일의 위치를 지정한다.
configs\entities 디렉토리에는 몇 개의 구성 파일이 더 생성된다. TestServiceXMLDriver-for-build-one.xml 및 TestServiceXMLDriver-for-build-two.xml 파일은 서로 다른 두 응용 프로그램 서버 빌드용 드라이버를 정의한다.
<driver name="TestServiceXMLDriver-for-build-one" xmlns="http://www.sun.com/japex/testSuite"> <param name="japex.driverClass" value="com.sun.wstest.TestServiceXMLDriver"/> <param name="description" value="TestService XML driver using JAX-WS from AS"/> <param name="endpoint.port" value="8080"/> <param name="endpoint" value= http://${endpoint.host}:${endpoint.port}/WSTest/TestService"/>이 파일은 어떤 드라이버 클래스를 사용할 것인지 정의한다. 또한 포트 번호와 종점 URL도 지정한다. 샘플에서 드라이버 클래스는 TestServiceXMLDriver이다. 두 응용 프로그램 서버 빌드의 인스턴스는 서로 다른 포트 번호에서 수신해야 한다.
구성 파일 classpath-as.xml에서는 Japex가 테스트 구성 및 실행을 위해 사용할 수 있는 클래스 경로를 정의한다. all-tests.xml 파일은 모든 테스트 케이스와 적용 가능한 입력 매개 변수를 정의한다. 이 파일도 configs\entities 디렉토리에 있다.
<testCaseGroup xmlns="http://www.sun.com/japex/testSuite"> <testCase name="echoVoid"> <param name="methodName" value="echoVoid"/> </testCase> ... <testCase name="echoSynthetic4K"> <param name="methodName" value="echoSynthetic"/> <param name="size" value="4096"/> </testCase> ...구성 파일 작성에 대한 자세한 내용은 Japex 설명서를 참조한다.
이동 가능한 아티팩트 생성 및 클라이언트 컴파일
이동 가능한 아티팩트를 생성하고 클라이언트를 위한 모든 Java 클래스를 컴파일하는 방법은 서버의 경우와 비슷하다. ant build 태스크가 이를 자동으로 수행한다.
샘플 실행
스크립트를 실행하여 환경을 설정했으면 다음과 같이 샘플을 실행할 수 있다.
- 각 GlassFish 인스턴스에 다음 명령을 입력하여 두 인스턴스 모두 시작한다.
%AS_HOME%/bin/asadmin start-domain domain1
- 웹 서비스, 클라이언트와 필요한 아티팩트를 구축하고 이를 WAR 파일로 패키징한다.
techtip\Sample디렉토리에 다음 명령을 입력하면 된다.ant build
- 다음 명령을 입력하여 응용 프로그램을 배포한다.
ant deploy
- 다음 명령을 입력하여 응용 프로그램을 실행한다.
ant run
- 다음과 같은 출력이 표시된다.
run:[java] Reading configuration file'configs/TestServiceXMLDriver-for-build-comparison.xml' ...[java] Estimated warmup time + run time is 1 minutes[java] TestServiceXMLDriver-for-build-one using 1thread(s) on 1 cpu(s)[java] Run 1: echoVoid,177.661,echoInteger,148.959,echoFloat,140.094,echoString,162.918,echoDate,84.997,echoStruct,166.121,echoSynthetic4K,72.235,echoSynthetic8K,122.979,echoSynthetic12K,86.514,echoArray40,28.863,echoArray80,18.589...[java] Generating reports ...
응용 프로그램이
reports디렉토리에 보고서를 생성한다. 특정 보고서의 디렉토리에서index.html페이지를 확인하여 해당 보고서를 탐색할 수 있다. 각 보고서는reports아래의 별도 디렉토리에 위치한다. 각 보고서별 디렉토리는 보고서 생성 시점의 타임스탬프를 나타내는 이름을 갖는다.각 보고서에서는 실행 요약과 각 테스트 케이스의 세부 사항을 표시하며, 여기에는 결과를 비교하는 그래프도 포함된다.
예를 들어, 다음은 두 빌드에 대한 테스트 실행에서 초당 트랜잭션을 비교하는 그래프 중 일부이다.
결과 요약
보고서에 대한 자세한 내용은 Japex 사이트를 참조한다.
- 응용 프로그램 실행 후 다음 명령을 입력하여 배포 취소할 수 있다.
ant undeploy
- 다음 명령을 입력하면 응용 프로그램에 대해 생성된 모든 클래스 및 WAR 파일을 삭제한다.
ant clean
저자 정보
Singh과 Bharath Mundlapudi는 Sun Microsystems, Java Performance Engineering 그룹 소속이다.
"Java EE" 카테고리의 다른 글
- Attach API (댓글 18개 / 트랙백 1개) 2007/09/03
- JSP 2.0 EXPRESSION LANGUAGE (댓글 1개 / 트랙백 0개) 2004/02/05
- 환경 엔트리를 이용해서 배포의 사용자 정의하기 (댓글 2개 / 트랙백 0개) 2003/12/24
- JAX-WS를 이용한 웹 서비스 개발 (댓글 1개 / 트랙백 0개) 2006/01/18
- EJB 2.1로 메시지 구동 빈 이용하기 (댓글 1개 / 트랙백 0개) 2005/05/18
- EclipseLink를 사용하여 JPA에서 반복 불가능한 읽기 방지 (댓글 0개 / 트랙백 1개) 2008/07/09
- 컴포넌트 시스템과 클래스 로더 경계 (댓글 1개 / 트랙백 0개) 2004/10/05
- JAX-WS Dispatch 및 Provider API를 이용한 문서 처리 (댓글 4개 / 트랙백 0개) 2006/09/15
- POJO를 Persistent Entity로 변환하기 (댓글 1개 / 트랙백 0개) 2005/12/27
- SAAJ 소개 (댓글 1개 / 트랙백 0개) 2005/06/08
TRACKBACK :: http://blog.sdnkorea.com/blog/trackback/423
-
Japex 및 WSTest를 사용하는 성능 회귀 테스트
Tracked from ★ dingpong의 조그만 휴식 공간 ★ 삭제Japex 및 WSTest를 사용하는 성능 회귀 테스트에 대한 강좌 입니다. 프로그래머에게 자신이 작성한 코드에 대한 성능 테스트는 필수이며 또한 궁금한 사항입니다. 프로그래밍을 하면서도 어떻게 하면 성능이 조금이라도 더 좋아질 수 있을까란 생각을 안한다면 그것은 뭔가 문제가 있는 개발자겠지요^^; 자바에서 이러한 것을 이 강좌를 보고
2007/09/19 23:31
댓글을 달아 주세요
자바스크립트를 저는 처음 보았는데 이렇게 자바스크립트가 흥미로운지 몰랐네요..다양한 언어와 컴퓨터 상에서 쓰이는 자바 스크립트 정말로 괜찮고 한국에서 썬 개발되었다는 것 만으로 매우 놀랍습니다.....
2007/09/03 07:30위 내용은 자바스크립트가 아닌 자바 인데요..
2007/09/04 15:28자바스크립트는 자바에서 파생되어진 스크립트 언어 입니다.
좋은정보 감사합니다.
2007/09/04 17:58앞으로도 멋진 사이트로 남길 바래요
2007/09/06 10:16알아보기 쉽게 잘 올리셨네요.
2007/09/08 03:13감사합니다.
유용하게 이용하고 있습니다.
수고 많으십니다.
긴글 잘보았습니다.
2007/09/08 16:12쉽게 잘 정리 해놓으셨네요 ^^ 잘 보구 갑니당~
2007/09/10 13:58자바는 알면 알수록 재미가 있어지네요. 좋은 자료 잘 활용하겠습니다.
2007/09/13 22:40좋은 정보 감사해요~
2007/09/19 03:21좋은자료 많이 많이 올려주세요..감사
2007/09/19 06:42직접적인 개발자가 아니라서 정확한 세부사항까지 이해하기는 어려웠지만 나름 좋은 지식공유가 된것 같아서 기쁘네요... 앞으로도 좋은 지식발견이 되었으면 좋겠습니다. 감사합니다...!
2007/09/19 21:08좋은 정보 감사합니다. 많이 배우고 가요.
2007/09/19 22:35좋은 정보 많이 배우고 갑니다.
2007/09/19 23:02성능 테스트에 대한 내용은 매우 중요한데 이렇게 알고 있으면 프로그래밍 하면서 유용하게 잘 사용 할 수 있을 것 같네요^^
2007/09/19 23:33