JMeter
- Java 기반의 오픈소스 성능 테스트 도구이다.
- 다양한 프로토콜(http, ftp, jdbc, ...)을 지원하며 여러 가지 성능 테스트 기능을 제공한다
설치
- Mac을 이용하기 때문에 brew로 설치를 진행
# brew로 jmeter 설치
$ brew install jmeter
# jmeter 실행 (시스템 경로에 자동으로 추가됨)
$ jmeter
추가로 사용할 Graph, Listener 플러그인을 설치한다 (JMeter > Options > Plugins Manager)
- 3 Basic Graphs
- 5 Additional Graphs
- Custom Thread Groups
- JMeter Listener pack
JMeter 구성요소
- JMeter에는 테스트 계획을 작성하는 Test Plan과 Thread Group, Sampler, Listner, Assertion 등 테스트 계획에 들어갈 구성요소들이 존재한다
- Thread Group : 테스트에 참여할 가상 사용자인 Thread의 수, 반복할 횟수를 설정하는 Loop Count 등을 설정
- Sampler : 테스트할 요청을 지정
- HTTP Request, JDBC Request, FTP Request , ..
- Listner : 테스트 결과를 저장하고 보여주는 역할.
- Summary Report : 간단하게 요약된 정보를 보여주는 기본 Listener
- View Results Tree : 상세한 정보를 보여주는 Listener
- Aggregate Report : 요약된 정보를 표현하는 테이블 형태의 Listener, 평균 응답 시간, 에러 비율, 대기 시간 등을 보여준다
- Graph Results : 그래프 형식으로 측정 결과를 시각화하는 Listener
- Response Times Over Time : 시간에 따른 응답 시간을 보여주는 Graph, 응답 시간이 급격히 증가하는 구간을 찾아서 성능 이슈를 파악하는데 유용
- Assertion : 테스트 결과를 검증하는 역할, 응답 데이터에 대한 조건을 지정하고 일치하지 않으면 실패를 반환
- Response Assertion : 응답 데이터의 특정 텍스트 또는 패턴 검증
- JSON Assertion : 응답 데이터가 유효한 JSON 형식인지 검증
- Sampler : 테스트할 요청을 지정
테스트
- 예시로 테스트용 Appliation의 4개의 API에 대해 성능 테스트를 진행해 본다.
- 회원가입 API : POST, 회원가입을 진행 (DB insert)
- 로그인 API : POST, 회원가입 된 유저의 id, pw로 로그인해서 JWT 토큰 발급
- 게시글 작성 API : POST, 게시글 작성 (DB insert)
- 게시글 조회 API : GET, 전체 게시글 조회 (DB select)
- Test Plan 하위에 각 API마다 Thread Group을 생성하고, API 호출을 위한 HTTP Request Sampler와 Listener들을 추가
- 또한, 여러 개의 Thread Group의 결과를 한번에 확인하기 위해 Listener 추가
API 성능테스트를 진행할 때, 각 API마다 동시에 처리할 수 있는 요청의 수가 다르고, 응답 시간도 다르기 때문에 별도의 ThreadGroup을 만들어 설정하는 것이 좋다 (하나의 Thread Group에 여러개의 HTTP Request를 넣어서 처리하게 되면, 각 Request들이 서로 영향을 끼칠 수 있기 때문에)
테스트 결과 확인
- Samples : 요청 횟수
- Average : 평균 응답 시간
- Min : 최소 응답 시간
- Max : 최대 응답 시간
- Std.Dev. : 표준 편차
- n% Line : 전체 중 n%의 요청이 넘지 않는 최대 시간
- Error : 에러비율
- Throughput : Throughput
이후 Thread 수와 Loop Count를 증가해 가며 테스트를 진행한다.
저부하 API부터 고부하 API까지 테스트를 진행하고, 결과를 분석하여 오류가 발생하거나 응답속도가 느린 API에 대한 성능 튜닝을 진행하면서 서비스의 성능을 개선해 나가면 된다.
끝
'Java' 카테고리의 다른 글
[Java] try-with-resources (0) | 2024.04.22 |
---|---|
[Java] instanceof pattern matching (0) | 2024.04.22 |
[Java] TypeFactory으로 제네릭 타입 변환하기 (0) | 2023.11.01 |