api 개발이 어느정도 완료되서 무거운 데이터를 다루는 api에 대해 부하테스트를 진행하여 tps 등을 확인해야 할 일이 있었다. 부하테스트를 할 수 있는 도구들은 많다. 그 중 간단하게 바로 사용할 수 있는 것이 JMeter였기에 사용했다.
부하테스트 도구
- Apache Bench
- Ngrinder
- 쓰레드 기반으로 동시성 제한이 있음
- 계정관리 기능이 존재
- 계정별 테스트 스케쥴 및 이력 조회 기능 제공
- Pinpoint
- Gatling
- Apache JMeter
- java 기반 오픈소스
- 분산테스트 지원
- 쓰레드 기반으로 동시성 제한이 있음
Apache JMeter 특징
- 다양한 프로토콜/서버 테스트 가능
- 웹 - HTTP,HTTPS
- SOAP/REST 웹 서비스
- FTP
- 데이터베이스(JDBC)
- Mail(SMTP,POP3,IMAP)
- CLI 지원
- CI 또는 CD 툴과 연동할때 편리
- UI를 사용하는 것보다 메모리 등 시스템 리소스를 적게 사용
- 시나리오 기반 테스트 가능
- 다양한 외부 프로토콜을 사용하여 기능 확장 가능
주요 개념
- Thread Group : 몇개의 쓰레드가 동시에 요청을 보내는지
- Sampler : 어떤 유저가 해야하는 액션인지
- HTTP Request
- Debug Sampler
- Listener : 응답을 받았을 때 어떤 동작을 취해야하는지(검증,리포트,그래프그리기 등)
- View Results Tree
- Summary Report
- TPS
- BeanShellListener
- Configuration : Sampler또는 Listener가 사용할 설정값(쿠키,JDBC 커넥션)
- Assertion : 응답 결과의 성공 여부를 판단하는 조건
사용법
- Custom Thread Gropus
예제
-
진행 단계

-
테스트 계획 (Get Item List)
- 스레드 그룹
- HTTP 헤더 관리자 - 기본 셋팅
- HTTP 요청 - token 인증용
- HTTP 요청 - 아이템 조회
- View Results Tree
- Debug Sampler
- Summary Report’
- TPS
1. 스레드 그룹

- Number of Threads(users) : 가상의 생성자를 몇 명으로 설정 할것인가(= 몇개의 쓰레드 생성?)
- Ramp-up Period(in seconds) : 한번의 실행을 몇초 동안 완료시킬 것인가
- Loop Count : 반복하고자 하는 횟수
2. HTTP 요청 (connect token)

3. View Results Tree 생성
- 생성 후 스크립트를 실행하면 트리에서 결과를 볼 수 있음.

4. 토큰 추출을 위해 Connect_Token 아래에 JSON Extractor 추가
- Connect_Token 요청의 응답에서 acceccToken을 가져오는데 사용
- 매개변수 설정 필요
- Names of created variables : 추출된 값이 저장될 변수 이름
- JSON Path expressions : JSON 경로 표현식.
- 1단계 요소일 경우 $.accessToken으로 입력
- 2단계 요소일 경우 $..accessToken으로 입력
- Match No. : 어떤 매치를 선택해야하는지 알려줌. JSON 응답에는 accessToken 이 하나만 있으므로 1이어야함. 0인 경우 무작위로 사용된다.
- Default Values : 일치하지 않는 경우 어떤값을 선택.

5. accessToken에 값이 저장되었는지 확인하기 위해 Debug Sampler 추가

6. 토큰 추가를 위해 Get Item 요청 아래
HTTP 헤더 관리자를 추가
BeanShell PreProcessor 추가
→ 토큰을 헤더에 추가


- 스크립트를 실행하고 결과트리에서 결과를 확인
결과 확인
Summary Report
Summary Report 구성
- Label : HTTP Request Sampler에서 설정한 Name
- #Samples : 호출 건수
- Average/Min/Max/Std.Dev. : 응답시간 통계 (1/1000초 단위로 표시됨)
- Error% : 오류율
- Throughput : 단위 시간당 처리량(TPS)

TPS

응답결과 인코딩 설정
bin/jmeter.properties 에 아래값 추가
sampleresult.default.encoding=UTF-8
간단하게 테스트를 진행하기 위해 사용해보았지만, 계정별 스케줄을 관리하고 제대로된 부하 테스를 진행하기 위해서는 ngrinder를 사용해야 할 것 같다. ngrinder는 서버 세팅이 필요하니 시간이 될 때, 진정으로 부하테스트가 이루어져야할 때 다시 공부해서 시도해봐야할 것 같다...
좋은 글 잘 읽었습니다, 감사합니다.