Apache JMeter
Apache JMeter는 서버가 제공하는 성능 및 부하를 측정할 수 있는 테스트 도구이다. JMeter는 순수 Java 애플리케이션 오픈소스이며 서버나 네트워크 또는 개체에 대해 과부하를 시뮬레이션하여 강도를 테스트하거나 다양한 부하 유형에서 전체 성능을 분석하는 데 사용할 수 있다.
비슷한 부하테스트 도구로는 Apache Benchmark, Ngrinder, Pinpoint, Gatling등이 있다. 다음은 Apache JMeter가 가진 특징을 나열한 것이다.
- 다양한 프로토콜/서버를 테스트할 수 있다.
- 웹 - HTTP, HTTPS
- SOAP / REST 웹 서비스
- FTP
- 데이터베이스 (JDBC 사용)
- Mail (SMTP, POP3, IMAP)
- ...
- CLI 지원
- CI 또는 CD 툴과 연동할 때 편리하다.
- UI를 사용하는 것보다 메모리 등 시스템 리소스를 적게 사용한다.
- 시나리오 기반 테스트가 가능하다.
- 다양한 외부 플러그인을 사용하여 기능 확장이 가능하다.
주요 개념
JMeter를 사용하기 전에 알아야 하는 개념에 대해 살펴보자.
- Thread Group: 몇 개의 쓰레드가 동시에 요청을 보내는 지
- Sampler: 어떤 유저가 해야 하는 액션
- Listener: 응답을 받았을 때 어떤 동작을 취하는 지 (검증, 리포트, 그래프 그리기 등)
- Configuration: Sampler 또는 Listener가 사용할 설정 값 (쿠키, JDBC 커넥션 등)
- Assertion: 응답 결과의 성공 여부를 판단하는 조건 (응답 코드, 본문 내용 등)
사용
먼저 Apache JMeter를 설치해야 한다. (앞서 언급했듯 JMeter는 순수 자바 애플리케이션이다. Java 8 문법을 내부적으로 사용하기 때문에 자바 8 버전 이상이 설치되어 있어야한다.)
이후 다운로드 받은 알집파일을 풀고 bin 디렉토리에 있는 실행파일을 실행한다.
그리소 Test plan name을 설정한 후 저장한다. 그러면 좌측 탭에 반영되는 것을 알 수 있다.
Thread Group
먼저 Thread Group을 설정하자. Test plan을 우클릭 한 후 Thread Group을 추가한다.
그러면 아래와 같은 설정 창이 나온다.
노출되는 창에서 Thread Properties가 중요한 부분이다.
- Number of Threads: 몇 개의 쓰레드(유저 수)로 테스트할 지
- Ramp-up period: {Number of Thread} 만큼의 쓰레드를 몇초에 걸쳐서 만들 지
- Loop Count: 요청을 몇번을 반복할 지
추가적으로 Action to be taken after a Sample error는 에러 처리가 되었을 때 취할 액션이다. 이는 Assertion의 결과로 판단한다.
Sampler
우리가 정의했던 각각의 유저가 해야 할 일을 Sampler에서 정의한다.
그럼 아래와 같은 설정 창이 노출된다.
여기서는 Web Server부분을 건드리면 된다. Description이 잘 되어 있어서 차근차근 보면 이해가 갈 것이다. 예제에서는 GET /study/1로 쿼리스트링이나 바디 없이 요청을 보낸다.
Listener
결과를 받고 행동을 취하는 것이 Listener이다. Listener도 정의하자.
다양한 listener가 있는데 필요에 맞게 추가하면 된다. 예제 테스트에서는 아래 4개의 listener만 추가했다.
이제 상단에 실행 버튼(초록 삼각형)을 누르면 테스트가 실행된다.
우리는 아까 유저 10명이 요청을 보내도록 선택했고, 1번만 반복하도록 선택했다. 이를 각각의 Listener가 자신의 관심사에 맞게 Report를 노출한다.
위 이미지는 View Results Tree Listener가 반환한 결과이다. 결과를 통해 요청들이 각각 어떻게 처리되었는 지 분석할 수 있다.
다음은 Aggregate Report Listener를 보자.
요청 10개의 평균 응답시간은 48ms이다. 90%의 요청의 응답이 50ms안에는 끝난 것을 알 수 있고 가장 빠른 것은 24ms에 끝났다. 가장 오래 걸린 요청은 118ms가 걸렸다.
가장 오래 걸린 요청을 확인하기 위해 View Results in Table Listener를 보자.
View Results in Table의 Report를 통해 118ms가 걸린 요청이 첫 번째 요청임을 알 수 있다. 이는 아마 앱이 뜨고 처음으로 받은 요청이라서 서블릿을 생성하는 등의 작업에 걸린 시간인 것 같다.
이렇듯 Listener를를 다양하게 사용하면서 부하를 분석할 수 있다.
<참고>
참고로 지금 생성한 Listener나 다른 요소들도 트리 구조로 요소를 생성이 가능하다. 가령 Sampler1, Sampler2가 있다면 루트를 잡아서 전체에 적용되는 Listener를 생성할 수도 있고, 몇 개의 Sampler만 잡아서 해당 Sampler가 사용하는 Listener를 생성할 수도 있다.
Assertion
위에서는 요청의 성공 여부를 Http StatusCode(200번대)만 보고 판단한다. 만약 성공 여부를 판단하는 조건이 조금 더 복잡하게 만들고 싶다면 Assertion을 사용한다.
Response Assertion을 보자.
해당 설정은 Http StatusCode가 200번대가 아니라 딱 200번 응답만 성공으로 보겠다는 것이다.
다음은 JSON Assertion을 추가해보자.
해당 예제는 ResponseBody의 $.name이 study1이 아니면 실패로 보겠다는 것이다. 참고로 아까전에 언급했듯 실패했을 때의 액션은 Thread Group에서 설정할 수 있다. default값은 continue로 별다른 액션없이 테스트를 이어나가게 되어 있다.
CLI
우리는 지금까지 Apache JMeter가 제공하는 GUI를 사용했지만 이는 CI/CD를 적용하기 힘들다. 그래서 CLI를 통해 실행하는 방법을 알아보자.
먼저 작성한 TestPlain을 저장하면 .jmx확장자로 저장된다. 해당 테스트 플랜은 아래의 커맨드로 실행할 수 있다. {path}대신 apache jmeter가 설치된 경로를 넣어주면 된다.
/{path}/apache-jmeter-5.2.1/bin/jmeter -n -t ./study_perf_test.jmx
이를 이용하면 성능 테스트도 자동화할 수 있다.
Reference
'개발 > Apache JMeter' 카테고리의 다른 글
Apache JMeter로 성능 테스트하기 (0) | 2023.11.15 |
---|---|
Apache JMeter 분산 테스트 설정 및 TEST (0) | 2023.04.26 |
Apache JMeter 설치 및 TEST (0) | 2023.04.26 |
분산 테스트 (0) | 2022.04.15 |
Apache JMeter JDBC Request (0) | 2022.04.15 |
댓글