Apache JMeter 활용 해보기
웹 패킷 분석과 서버 성능 테스트를 할 일이 생겼다.
클라이언트 시뮬레이터가 필요해서 알아보다 아파치에서 제공하는 JMeter라는 툴을 알게되었다.
JMeter를 활용하면 다량의 가상 클라이언트 세션을 만들고 다양한 테스트를 진행해볼 수 있다.
사용해보면서 알게된 몇 가지 기능들에 대해 정리해보았다.
설치/실행(윈도우)
공식 홈페이지 http://jmeter.apache.org/download_jmeter.cgi 에서 압축 파일을 다운로드 받는다.
압축을 풀고 bin 디렉토리의 jmeter.bat 파일을 실행한다.
HTTP 요청 테스트
1. 쓰레드 그룹 설정
JMeter에서는 쓰레드를 이용해 클라이언트 세션을 만들어낼 수 있다.
쓰레드를 만들기 위해서는 먼저 쓰레드 그룹을 생성해야 한다.
JMeter를 실행시키면 다음과 같은 화면이 보인다. 다음 항목을 통해 쓰레드 그룹을 생성한다.
쓰레드 그룹을 생성하면 해당 쓰레드 그룹에 대한 설정을 할 수 있는 화면이 나온다.
- Number of Threads : 쓰레드 개수, 요청을 발생시킬 클라이언트 수를 의미한다. 여기서는 1개의 요청을 생성하기로 한다.
- Ramp-Up Period : 해당 쓰레드 그룹의 진행 시간을 의미한다. 예를들어 이 값이 9이고 Number of Threads가 3이라면 9초동안 쓰레드 1개당 3초간격으로 3개의 쓰레드가 생성된다. 만약 이 값을 0으로 주게되면 3개의 쓰레드들이 동시에 생성된다. 여기서는 1초로 주었으므로 1개의 쓰레드가 1초만에 생성 될 것이다.
- Loop Count : 해당 쓰레드 그룹의 발생 횟수를 의미한다. 여기서는 1을 주었으므로 1개의 쓰레드가 한번 생성된다. 만약 2로 주게된다면 1개의 쓰레드가 두번 생성된다.
2. 샘플러 설정
쓰레드 그룹을 생성했으면 해당 쓰레드 그룹에 HTTP 요청을 하기위한 샘플러를 생성한다.
샘플러를 생성하면 해당 샘플러에 대한 설정을 할 수 있다.
여기서는 HTTP Request 샘플러를 생성했으므로 다음과 같이 HTTP 요청에 대한 설정을 할 수 있다.
- Protocol : HTTP, UDP 등 어떤 프로토콜을 사용할 것인지에 대한 항목이다. 여기서는 HTTP로 요청을 할 것이므로 http로 지정해주거나 공란으로 두면 디폴트값인 http로 설정된다.
- Server Name or IP : 요청할 서버의 호스트네임이나 IP주소를 적는다.
- Port Number : 요청할 서버의 포트를 적는다. 나는 웹 서버를 아파치로 띄워두었으므로 아파치 기본 포트값인 80번 포트로 요청을 하도록 했다.
- Method : 요청 타입
- Path : 요청 URL
아래 부분에는 파라미터 설정에 대한 탭이 있다. 여기서는 POST 형태로 파라미터를 설정해서 요청할 것이므로 다음과 같이 설정했다.
Add 버튼을 눌러 원하는 파라미터를 추가할 수 있다.
파일전송도 필요하다면 파일 업로드 탭에서 다음과 같이 설정 할 수 있다.
3. 리스너 설정
JMeter에서는 결과값을 확인할 수 있는 각종 리스너들이 제공된다. 여기서는 View Results Tree와 Summary Report를 이용해 결과값을 확인해보기로 했다.
다음과 같이 쓰레드그룹에 리스너들을 추가한다.
4. 요청 후 결과 확인
상단의 Start 버튼을 누르면 지금까지 설정한 값들이 반영되어 요청이 시작된다.
이후 다음과 같이 리스너에서 Request와 Response 정보를 확인할 수 있다.
CSV Data Set Config
세션마다 다른 파라미터를 적용해야 할 경우가 있다. 예를들어 다수의 사용자들의 로그인 요청같은 테스트가 필요할 경우 사용자마다 개별적인 ID 파라미터가 필요하다.
수백개에서 수천개와 같이 다량의 요청이 필요하다면 CSV Data Set Config를 활용할 수 있다.
여기서는 다수의 사용자가 개별적인 ID와 비밀번호를 이용해서 로그인 요청을 하는 시뮬레이션을 진행해보았다.
1. csv 파일 만들기
csv파일은 엑셀 기반으로 작성할 수있다.
여기서는 test1~500 까지 500개의 테스트 사용자 ID를 생성해서 테스트를 진행했다. 비밀번호도 마찬가지로 개별적으로 적용했다.
2. CSV Data Set Config 설정
파일을 작성했으면 쓰레드 그룹에 CSV Data Set Config를 추가하고 다음과 같이 설정한다.
- Filename : csv파일 경로 항목이다. 앞에서 작성한 csv파일을 선택한다.
- Variable Names : csv파일에 있는 필드들의 변수 명이다. 앞에서 작성한 csv파일에는 ID와 비밀번호 이렇게 두 개의 필드들이 존재하므로 변수명도 두 개가된다.
나머지 부분들은 그대로 두고 진행한다.
3. HTTP Request 샘플러 설정
앞에서 CSV Data Set Config에 두 개의 변수들을 설정했었다.
여기에서 파라미터 값에 앞에서 설정했던 해당 변수명을 설정하면된다.
설정이 끝났으면 요청을 진행한다. 요청을 하면 1번쓰레드부터 500번쓰레드까지 csv파일에 있던 필드들을 행순으로 읽어와서 ID와 비밀번호 파라미터를 전송하게 된다.
여기서 추가적으로 참고할 사항은 만약 쓰레드가 501개일 경우 501번째 쓰레드는 다시 csv파일의 첫 번째 행으로 돌아가 첫 번째 필드 값을 전송하게된다.
Regular Expression Extractor
Request나 Response의 헤더와 바디 파싱이 필요할 경우가 있다. 예를 들어 두 개 이상의 요청 시나리오 테스트를 할 때 첫 번째 요청으로부터 Response받은 값에 따라 분기를 타고 두 번째 요청으로 넘어가야 하는 경우에 Regular Expression Extractor를 활용할 수 있다. 여기서는 Response Body의 특정 부분을 파싱하고 확인해보는 과정을 알아보았다.
전체 테스트 시나리오는 다음과 같다.
- 첫 번째 Request에서 서버에 파라미터 전송
- 서버에서 받은 파라미터 그대로 Response
- 첫 번째 Response Body에서 파라미터 파싱
- 두 번째 Request에서 서버에 파싱된 데이터 전송
- 두 번째 Response Body 파라미터 값 확인
1. 첫 번째 Request에서 서버에 파라미터 전송
Http Request 샘플러에서 GET으로 요청하였다. 서버는 A라는 파라미터 한 개를 전송받는다.
2. 서버에서 받은 파라미터 그대로 Response
서버에서 받은 파라미터를 그대로 Response 했기때문에 Response Body를 확인해보면 서버로부터 받은 파라미터 A가 출력된 것을 확인할 수 있다.
3. 첫 번째 Resposne Body에서 파라미터 파싱
첫 번째 Response Body의 파라미터 A를 파싱하기 위해 첫 번째 Request인 샘플러에 Add → Post Processors → Regular Expression Extractor를 추가한다. 그리고 이부분에서 다음과 같이 설정값을 준다.
- Field to check : 파싱할 필드를 지정하는 부분으로 여기서는 Resposne Body에서 파싱할것이므로 Body나 Body(unescaped)를 체크한다.
- Name of created variable : 파싱된 데이터의 변수명으로 임의대로 주면된다.
- Regular Expression : 파싱할 부분의 정규식을 지정하는 부분으로 (.+?) 정규식을 활용한다. 예를들어 파싱할 데이터가 <div>data</div>일 경우 <div>(.+?)</div> 해주면 data가 파싱된다.
- Templete : 템플릿은 항상 $1$로 주면된다.
- Match No. : 파싱된 데이터가 여러개일 경우 원하는 데이터 번호를 의미하는 부분으로 예를들어 5개가 파싱되었고 원하는 데이터가 세 번째 일 경우 3이된다. 한개만 파싱할 경우 1로 주면된다.
4. 두 번째 Request에서 서버에 파싱된 데이터 전송
설정이 완료되었으면 두 번째 Http Request 샘플러에서 파라미터를 추가하고 값을 위의 Regular Expression Extractor에서 설정했던 변수명을 적어준다.
Regular Expression Extracator 는 Response Body 이외에도 Request Body, Request Header, Response Header 등 필요에 따라 원하는 데이터들을 파싱할 수 있다.
Save Responses to a file
파일 다운로드 테스트가 필요할 경우에는 Save Responses to a file을 활용하면 Response에 의한 바이너리 데이터를 다운로드 받을 수 있다.
먼저 앞에서 활용했던 Regular Expression Extractor가 필요하다.
HTTP Request 샘플러의 Add → Post Processors 항목에서 Regular Expression Extractor를 추가하고 다음과 같이 설정한다.
본 예제의 서버에서는 바디에 바이너리 데이터만을 Response할것이므로 Field to check는 Body에 체크를 한다.
변수명은 Save Responsess to a file에서 설정할 변수명을 의미하는것으로 임의로 설정한다.
그리고 여기서 주목해야 될 부분은 (?s)(^.*) 정규식이다. 해당 정규식은 Response의 모든 데이터를 파싱한다는 의미이다. 즉, 서버에서 바이너리 데이터만을 Response하는 경우 해당 데이터를 모두 파싱해서 읽어들여 파일로 저장하기 위한 방법이다.
다시 HTTP Request 샘플러의 Add → Listener 항목에서 Save Responses to a file을 추가하고 다음과 같이 설정한다.
- Variable Name containing saved file name : 위의 Regular Expression Extractor에서 설정한 변수를 적는다.
- Filename prifix : 파일이 저장될 경로와 이름을 의미한다. 만약 원본 파일 이름으로 받고싶으면 위에서처럼 Regular Expression Extractor를 하나 더 추가해서 Response 헤더의 파일 이름을 파싱하고 변수를 만들어야한다. 여기서는 이 방법은 다루지 않는다.
Dont' add number to prefix와 Don't add content type suffix에 체크를한다.
설정이 완료되었으면 요청을 하고 위에서 설정한 경로에 파일이 다운로드되었는지 확인해본다.
Response 헤더에 파일 원본이름이 존재한다.
Response 바디는 바이너리 데이터로 이루어져있는것을 볼 수 있다.