본문 바로가기

더 괜찮은 개발자가 되기위한/프로젝트 완료하기

시스템 테스트 – JMeter 활용

□ 시스템 테스트 – JMeter 활용


시스템테스트는 정보시스템이 완전히 통합되어 구축된 상태에서 정보시스템의 기능을 총체적으로 검사하는 것이다. 통합된 각 모듈들이 원래 계획했던 대로 작동하는지, 시스템의 실제 동작과 원래 의도했던 요구사항과는 차이가 없는지 판단하게 된다. 수행 시간, 파일 저장 및 처리 능력, 최대 부하, 복구 및 재시동 능력, 수작업 절차 등을 점검한다. 시스템 검사는 시스템의 내부적인 구현 방식이나 설계에 대한 지식에 관계 없이 테스트를 수행하는 블랙박스 테스트의 일종으로 분류된다.


일반적으로 제안요청서에 많이 나와 있는 “100명이 동시에 사용할 경우 1초이내 결과 표시와 같은 요구사항은 시스템 테스트를 통해 검증할 수 있다. 대표적인 시스템 테스트 툴인 JMeter를 활용해서 어떻게 테스트를 진행하는지 알아보자.


JMeter는 시스템 테스트 중에 부하테스트에 초점을 맞춘 툴이다. 산업계에서는 대표적으로 로드 러너(Load Runner)를 많이 사용하고 있지만 가격이 상당히 고가이기 때문에 중소 규모의 프로젝트에서는 활용하기 쉽지 않다. 하지만, JMeter는 아파치 오픈 소스 프로젝트에서 개발한 툴이기 때문이 상업적 또는 비상업적인 프로젝트에서 무료로 사용이 가능하며, 사용법을 익힐 수 있는 많은 자료들을 인터넷에서 쉽게 찾을 수 있기 때문에 다양한 분야에서 활용되고 있다.


Jmeter 설치

(출처: http://jmeter.apache.org/download_jmeter.cgi)


JMeter는 아파치 사이트에서 다운로드 받을 수 있다. 윈도우 환경에서는 파일을 다운받아 압축을 풀면 별도의 설치과정 없이 그대로 사용할 수 있다. 생성된 폴더 안에 있는 jmeter.bat 파일을 클릭하면 JMeter가 실행된다.


JMeter 구조


먼저 JMeter 구조를 살펴보자. Test PlanJMeter가 수행할 일련의 테스트 단계를 모아 놓은 것이다. Thread GroupTest Plan의 시작점이 된다. ControllersSamplerLogical Controller로 구성되는데 Sampler는 서버로 전달되는 프로토콜을 정의한다. 이 책에서는 웹 프로젝트에 사용되는 HTTP Request를 사용해서 테스트해본다.


Logical ControllerJMeter가 요청을 전달할 때 사용할 로직을 정의한다. 예를 들어 HTTP Request를 보낼 때 Cookie 정보를 같이 전송할 필요가 있다면 Logical Controller에 관련 내용을 정의할 수 있다.


ListenersJMeter가 테스트를 수행하면서 수집하는 정보에 접근할 수 있는 수단을 제공한다. 테스트 요약 정보를 보거나 테스트 결과를 그래프로 표현한다.


TimerSampler가 수행할 때 지연시간을 정의한다. 예를 들어 사람이 웹사이트를 사용할 때 계속 화면을 누르지 않고 읽거나 생각할 시간이 필요하다. Timer는 그와 같은 상황을 재현하기 위해 테스트 중간에 잠깐 쉬는 시간을 두는 것이다


Thread Group 생성


Thread GroupTestPlan에서 마우스 오른쪽 클릭해서 생성할 수 있다. Thread Group이 생성되면 우측에 설명 화면이 나오는데 (1) Number of Thread(users)는 몇 개의 Thread를 생성할지 결정한다. Thread는 테스터에 해당한다. Thread2일 경우 2명이 테스트하는 것과 같은 의미이다. (2) Ramp-Up Period는 모든 Thread가 생성되는데 까지 걸리는 시간을 의미한다. Ramp-Up Period 2이면 2초안에 2개의 스레드가 모두 생성된다. (3) Loop Count는 한 스레드 당 모두 몇 번 테스트를 수행하는지 정의한다. Loop Count10이면 모두 10번 테스트가 수행된다.


HTTP Request 생성


HTTP Request 또한 TestPlan에서 마우스 오른쪽 클릭해서 생성할 수 있다. HTTP Request에 대한 환경 설정을 위해서는 부하 테스트를 위한 프로토콜과 서비스에 대한 구체적인 정보를 입력해야 한다. (1) Protocol은 테스트를 위해 사용하는 프로토콜을 지정하는 것이다. 웹 프로젝트 이므로 http를 지정한다. (2) Server Name or IP는 테스트 도메인이나 웹서버 IP를 지정하면 된다. 서비스 도메인을 www.smartbusi.or.kr으로 지정했다고 가정해 보자. (3) Port Number는 서비스에 사용할 포트 번호를 지정한다. 여기에서는 웹서비스 기본 포트인 80을 지정했다. (4) Method는 웹서버로 서비스 요청을 보낼 방식을 지정하는 것인데 기본적으로 POST 방식과 GET 방식을 사용한다. 여기에서는 주소 뒤에 구체적인 서비스 내용과 파라미터를 같이 전달하는 GET 방식을 지정했다. (5) Path는 웹서버에서 서비스를 인식할 수 있는 상세한 위치 정보를 표현한다. 여기에서는 /contents/mainPage.do를 사용했다. (6) 마지막으로 Parameters는 서비스를 요청하면 같이 전달할 인수를 지정하는 것이다. 여기에서는 PageNum인수를 전달하고 값으로는 10을 지정했다


Timer 생성


Timer 또한 TestPlan에서 마우스 오른쪽 클릭해서 Add 버튼을 통해 생성할 수 있다. 다양한 Timer 유형이 있지만 가장 많이 사용되고 이해가 쉬운 Constant Timer를 사용해 보도록 하자. Timer는 서비스 요청을 발생시키기 전에 얼마나 대기하는지를 결정하는 기능을 지원한다. 얼마의 시간을 설정해야 할지 결정하기 위해서는 도메인 환경을 먼저 분석해야 한다. 가장 우선적으로 해야 할 것은 고객에게 물어보는 것이다. 간단한 내용을 빨리빨리 봐야 하는지 아니면 화면에서 보여주는 정보를 보고 분석을 해야 하는지 업무 특성에 따라서 서비스 지연시간이 결정된다. 또 다른 방법은 웹서버 접속 로그를 분석하는 것이다. 동일 IP에서 하나의 서비스를 다시 호출하는데 소요되는 시간의 평균을 구해보는 것이다. 인터뷰와 로그 분석 결과를 종합해보면 얼마의 시간을 Timer에 입력해야 하는지 결정할 수 있다. 여기에서는 300 milliseconds를 설정했다.


Listener 생성


앞에서 잠깐 설명했듯이 Listener는 테스트 결과를 표현해주는 기능을 제공한다. (1) View Results TreeThread의 모든 테스트에 대한 결과와 함께 요청과 응답의 세부 사항을 보여준다. (2) Summary Report는 모든 테스트 결과를 종합해서 통계 데이터를 한눈에 알 수 있도록 보여준다. (3) Graph Report Thread의 모든 테스트 결과를 시간 별로 그래프로 시각화 해 보여 준다


Summary Report


JMeter 테스트 결과 분석할 때 가장 많이 보는 화면인 Summary Report에 대해 구체적으로 알아보자. Summary Report Thread가 수행한 모든 테스트 결과를 종합해서 보여주는 화면인데, 만일 프로젝트 요구사항 중 평균 응답시간에 대한 내용이 있다면 Average 항목을 살펴보는 것이 좋다. 위 그림에서 421로 나오는데 이는 평균 0.421초 안에 모든 응답을 처리했다는 얘기가 된다. MinMax를 각각 응답 최소 시간과 최대 시간을 나타낸다. 가장 이상적인 것은 MinMax가 같은 것이다. 하지만 현실적으로 항상 응답 시간이 같을 수 없지만 튜닝을 통해 표준 편차(Std. Dev.)가 최소가 되도록 하는 것이 좋다.