Apache JMeter 를 사용한 서버 테스트

2023. 5. 22. 18:48기술 창고/테스트

728x90
SMALL

백엔드 서버를 개발하고 부하 테스트를 위해 JMeter를 사용하여 테스트 해보기로 했습니다.

JMeter는 Java 기반으로 이루어진 프로그램이라 Java와 Spring 프레임워크로 개발한 서버를 테스트하기에도 아주 적합하다고 생각합니다.

 

부하를 테스트하는 도구들은 여러가지가 있습니다.

Ngrinder 라든지... Apache Benchmark 라든지.... Gatling 이라든지...

 

우선 JMeter 의 특징을 살펴보자면,

다양한 프로토콜(HTTP, HTTPS 등) 및 서버를 테스트할 수 있고, REST 웹 서비스를 테스트 하기에도 좋으며, 데이터베이스나 FTP 도 지원한다고 합니다.

또한, CLI를 지원하여 CI / CD 연동도 편리합니다.

다양한 외부 플러그인을 사용하여 기능 확장도 가능합니다.

 

JMeter를 사용하면서 반드시 알고있어야 할 내용들이 있습니다.

1. Thread Group : 몇 개의 쓰레드를 요청보낼 것인지, 그 쓰레드들을 말합니다.

2. Sampler : 요청을 보낼 때 발생되는 액션을 말합니다.

3. Listener : 요청을 보내고 응답을 받게 되었을 떄 어떤 동작을 수행하는지에 대한 처리 - 그래프 산출, 결과 조회 등

4. Assertion : 응답을 받았을 때 성공 실패 여부를 판단하는 조건을 말합니다.

 

 

 

(1) JMeter 설치

https://jmeter.apache.org/download_jmeter.cgi

 

Apache JMeter - Download Apache JMeter

Download Apache JMeter We recommend you use a mirror to download our release builds, but you must verify the integrity of the downloaded files using signatures downloaded from our main distribution directories. Recent releases (48 hours) may not yet be ava

jmeter.apache.org

JMeter 사이트에 들어가서 zip 파일을 다운받습니다.

 

 

압축을 풀고 bin 폴더 내부에 있는 ApacheJMeter 실행 프로그램을 실행합니다.

 

 

 

(2) JMeter 테스트 세팅

처음에 테스트 계획에 테스트 이름을 지정해줍니다.

 

 

테스트 계획 부분에 오른쪽 마우스 클릭하여 추가 -> 쓰레드들 (Thread Group) -> setUp 쓰레드 그룹 or 쓰레드 그룹을 누릅니다.

앞서 말했던 부하 테스트를 위한 요청하는 쓰레드들을 설정해주기 위함입니다.

 

 

생성된 쓰레드 그룹에서 이름을 기입하고 쓰레드 속성들 항목에 쓰레드 설정을 해줍니다.

- 쓰레드들의 수 : 요청할 쓰레드 수

- Ramp-up 시간 : 한 쓰레드가 수행될 때 몇 초가 걸릴 것인지 시간(초) 지정

- 루프 카운트 : 최종적으로 요청할 때 몇 번 반복할 것인지 지정

 

주석 밑에 표본추출기 오류 발생 시 취해야 할 액션은 상황에 따라서 옵션을 설정해주면 됩니다.

저의 경우 쓰레드가 정상적으로 수행되든 오류가 발생하든 계속 진행하는 기본 옵션을 지정해주었습니다.

 

 

쓰레드 그룹에서 오른쪽 마우스 클릭하여 추가 -> 표본추출기(Sampler) -> HTTP 요청을 누릅니다.

Sampler 는 사용자가 취할 행위를 지정하는 것이며, 그 행위는 HTTP 요청입니다.

 

 

생성된 HTTP 요청 설정 창에서 이름을 기입해주고, 중점적으로 세팅할 부분은 기본 설정 탭의 웹 서버 항목입니다.

프로토콜은 기본적으로 HTTP 이며, IP는 현재 로컬이기 때문에 localhost로 지정합니다.

만약 로컬 환경이 아니라 도메인이 지정되어있다면 도메인을 넣어주어도 상관없습니다.

포트 번호는 당연히 8080, 현재 테스트해볼 method 방식은 GET 이라서 GET으로 지정해주었습니다.

경로는 만든 api 경로를 명시해줍니다.

 

밑에 파라미터들, Body 데이터가 있는데, 이는 POST와 같은 method 방식에서 요청 인자값이 존재할 때 넣어주어야 합니다.

지금은 단순한 조회 목적인 GET 테스트 이기 때문에 아무런 데이터를 요청값을 넣어주지 않았습니다.

 

 

테스트 계획 항목에 오른쪽 마우스를 누르고, 추가 -> 리스너(Listener) -> 응답을 받았을 시 확인할 항목을 선택 해줍니다.

저는 결과들의 트리 보기, 요약 보고서, 총합 보고서, 백엔드 리스너, 결과 그래프, 결과들을 테이블로 보기 항목들을 선택하였습니다.

 

이제 세팅은 끝났고 실행 버튼을 눌러 테스트를 실행해줍니다.

 

 

테스트가 무사히 끝나면 추가한 리스터 항목들에 각각의 결과값이 나오게 됩니다.

총합 보고서 내용을 보자면 평균 21792ms 가 걸렸고, 최소 호출 시간은 5286ms, 최대 호출 시간은 35059ms 가 걸렸습니다.

또한 오류도 일부 발생된 것을 확인할 수 있습니다.

 

이로서 다수의 요청이 발생되었을 때 수행 시간이 어느 정도 걸리는지 확인할 수 있고 이를 통해 코드를 개선할 수 있습니다.

 

 

추가 - Assertions

Assertions 는 초기에 말했던 것처럼 응답을 받을 때 어떤 응답을 받아야 성공한 것이라고 판단하는지 정하는 항목입니다. 

현재 200번대의 응답 코드를 받기만하면 정상 동작된 것이라고 판단되는 상태입니다.

 

간단하게 응답 코드에 대한 Assertion 조건을 세팅해보도록 하겠습니다.

 

테스트 계획에서 오른쪽 마우스 클릭, 추가 -> Assertions들 -> 원하는 Assertions 항목 선택 (여기서는 응답 Assertion) 합니다.

 

 

생성된 Assertion 의 이름을 정해주고, 응답 코드를 선택합니다.

조건은 200번 코드를 받아야만 정상 동작이라고 판단할 것이기 때문에 Equals 를 선택합니다.

패턴에는 200을 기입해주면 끝입니다.

 

이제 다시 테스트 실행을 요청하면 지정한 Assertion 조건에 따라 정상 동작 여부가 판단될 것입니다.

 

 

+ 추가

post나 put, get 메소드 방식의 api들을 호출할 때 만약 요청해야할 파라미터 값이 존재한다면 추가로 설정해주어야 합니다.

이 부분 때문에 요청을 맞게 설정했음에도 오류가 발생해서 반나절의 시간을 소비하고 말았습니다 ㅡ.,ㅡ;;

 

 

쓰레드 그룹에서 오른쪽 마우스 클릭, 추가 -> 설정 엘리먼트 -> HTTP 헤더 관리자를 선택해줍니다.

 

 

오류가 발생한 원인이 추출되는 데이터의 형식이 지원되지 않는 형식이라 오류가 난다고 나왔습니다.

만든 api controller 에서 Json 형식으로 반환해주는 RestController 어노테이션을 설정해주었기 때문에 Jmeter 에도 Content-type 을 지정해서 json 형식의 데이터를 지원하겠다고 설정해주어야 합니다.

 

아래의 추가 버튼을 눌러 항목을 추가하고 이름에 Content-type, 값은 application/json 을 넣어줍니다.

 

 

다시 HTTP 요청 Sampler 에서 body 데이터에 json 형식의 요청 인자값을 넣어줍니다.

 

 

그리고 나서 다시 실행 버튼을 누르고 Listener 들을 확인해보면, 오류가 발생되었던 서버가 정상적으로 수행되고 응답 데이터도 확인할 수 있습니다.

 

 

추가로, 서버에 jwt 토큰을 필요로 할 경우, HTTP 헤더 관리자에서 항목을 추가한 뒤 토큰 내용을 넣어주면 됩니다.

저의 경우에는 Authorization - jwt토큰 값 , Refresh-Token - 리프레시 토큰 값을 추가하면 됩니다.

728x90
반응형
LIST