[Spring] 부하테스트(Apache JMeter)

yeonjoo913·2023년 7월 18일
2

Spring

목록 보기
12/19

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 : 응답 결과의 성공 여부를 판단하는 조건

사용법

  1. Custom Thread Gropus

예제

  • 진행 단계

  • 테스트 계획 (Get Item List)

    • 스레드 그룹
      • HTTP 헤더 관리자 - 기본 셋팅
      • HTTP 요청 - token 인증용
        • JSON 추출기 - 토큰 추출
      • HTTP 요청 - 아이템 조회
        • 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 추가
→ 토큰을 헤더에 추가

  1. 스크립트를 실행하고 결과트리에서 결과를 확인

결과 확인

Summary Report

Summary Report 구성

  1. Label : HTTP Request Sampler에서 설정한 Name
  2. #Samples : 호출 건수
  3. Average/Min/Max/Std.Dev. : 응답시간 통계 (1/1000초 단위로 표시됨)
  4. Error% : 오류율
  5. Throughput : 단위 시간당 처리량(TPS)

TPS


응답결과 인코딩 설정

bin/jmeter.properties 에 아래값 추가

sampleresult.default.encoding=UTF-8

간단하게 테스트를 진행하기 위해 사용해보았지만, 계정별 스케줄을 관리하고 제대로된 부하 테스를 진행하기 위해서는 ngrinder를 사용해야 할 것 같다. ngrinder는 서버 세팅이 필요하니 시간이 될 때, 진정으로 부하테스트가 이루어져야할 때 다시 공부해서 시도해봐야할 것 같다...

profile
주니어 백엔드 개발자. 까먹는다 기록하자!

1개의 댓글

comment-user-thumbnail
2023년 7월 18일

좋은 글 잘 읽었습니다, 감사합니다.

답글 달기