JMeter를 활용한 추첨 API 당첨 확률 검증 및 부하 테스트

JMeter를 활용한 추첨 API 당첨 확률 검증

Apache JMeter는 자바 기반의 오픈 소스 부하 테스트 도구로, 소프트웨어의 성능과 안정성을 평가하는 데 널리 사용됩니다. 초기에는 웹 애플리케이션 테스트에 국한되었으나, 현재는 데이터베이스, FTP 서버, REST API 등 다양한 프로토콜과 자원에 대한 부하 및 기능 테스트를 지원합니다. 특히 API 테스트에서 JMeter는 특정 비즈니스 로직(예: 추첨 확률, 재고 차감 등)이 요구사항에 부합하는지 검증하는 데 매우 효과적입니다. 본 글에서는 JMeter를 사용하여 추첨 API의 당첨 확률이 명세서대로 동작하는지 테스트하는 방법을 다룹니다.

1. 비즈니스 요구사항 및 테스트 전략

요구사항:
총 참여 예상 인원은 2,000명이며, 경품 A와 B의 초기 당첨 확률은 각 5%로 설정됩니다. 만약 한 경품의 재고가 소진되면 나머지 경품의 당첨 확률이 10%로 상향 조정되며, 두 경품 모두 소진될 경우 당첨 확률은 0%가 됩니다.

테스트 접근법:
전체 예상 인원의 10%에 해당하는 200명의 동시 접속자를 시뮬레이션하여 확률 분포와 재고 소진 로직을 검증합니다.

2. 테스트 데이터 구성

  • 사용자 데이터: API 명세서에 따라 event_idparticipant_id를 포함한 200개의 테스트 레코드를 데이터베이스에 적재하여 200명의 가상 사용자를 준비합니다.
  • 재고 데이터: 경품 재고 테이블에서 경품 A와 B의 초기 수량을 각각 100개로 설정합니다.
  • 검증 시나리오:
    • 시나리오 1: 경품 A와 B의 재고가 모두 충분한 상태
    • 시나리오 2: 경품 A 재고 소진, 경품 B 재고 잔여
    • 시나리오 3: 경품 A 재고 잔여, 경품 B 재고 소진
    • 시나리오 4: 경품 A와 B 재고 모두 소진

3. JMeter 스크립트 구성

3.1 스레드 그룹 (Thread Group)

200명의 동시 접속 환경을 구성하기 위해 스레드 수(Number of Threads)를 200으로 설정합니다.

3.2 HTTP 헤더 관리자 (HTTP Header Manager)

API 서버에 JSON 형식의 데이터를 전송하기 위해 Content-Typeapplication/json으로 지정하는 헤더를 추가합니다.

3.3 JSR223 사후 처리기 (JSR223 PostProcessor)

응답 데이터에 포함된 한글 등 멀티바이트 문자의 인코딩 깨짐 현상을 방지하기 위해 BeanShell 대신 성능이 우수한 JSR223 사후 처리기를 사용하고 Groovy 스크립트를 작성합니다.

// 응답 데이터의 문자 인코딩을 UTF-8로 강제 지정 및 데이터 타입 설정
prev.setDataEncoding("UTF-8");
SampleResult.setDataType(SampleResult.TEXT);

3.4 HTTP 요청 (HTTP Request)

프로토콜, 서버 IP, 포트 번호 및 엔드포인트 경로를 설정하고, 메서드는 POST로 지정합니다.

요청 본문 (Body Data):
파라미터화된 변수를 활용하여 JSON 페이로드를 구성합니다.

{
  "eventId": "${eventId}",
  "participantId": "${participantId}"
}

3.5 CSV 데이터 셋 구성 (CSV Data Set Config)

HTTP 요청의 하위 요소로 CSV Data Set Config를 추가하여 eventIdparticipantId를 동적으로 주입합니다. 미리 준비된 CSV 파일의 경로를 지정하고, 변수 이름(Variable Names)에 eventId,participantId를 입력합니다. CSV 파일의 첫 번째 줄이 헤더이므로 'Ignore first line' 옵션을 True로 설정하여 데이터 읽기 시 헤더를 건너뛰도록 구성합니다.

3.6 응답 단언 (Response Assertion)

당첨 여부를 판별하기 위해 응답 단언을 추가합니다. 응답 텍스트(Response Text)에 "isWinner": true가 포함되어 있는지 검증하도록 설정합니다. (API 명세상 당첨 시 true, 미당첨 시 false를 반환한다고 가정). 단언에 실패한 요청은 미당첨 또는 예외 상황으로 간주됩니다.

3.7 집계 보고서 및 결과 트리 (Aggregate Report & View Results Tree)

테스트 실행 중 요청의 성공/실패 비율과 응답 시간을 모니터링하기 위해 집계 보고서와 결과 트리를 추가합니다. 주로 오류율(Error %) 지표에 집중하여 확률을 역산합니다.

4. 테스트 실행 및 결과 분석

스크립트 구성을 마친 후 테스트를 실행하고 집계 보고서를 확인합니다. 응답 단언에 의해 미당첨 건수가 오류(Error)로 집계되므로, 만약 집계 보고서의 오류율이 91%로 기록되었다면 실제 당첨률은 9%(100% - 91%)로 계산됩니다. 이 수치는 요구사항인 10%(A와 B 각 5% 합산)에 근접한 값입니다. 표본 수(동시 접속량)를 늘리거나 테스트 반복 횟수를 증가시키면 통계적 유의성이 확보되어 목표 확률인 10%에 더욱 수렴하게 됩니다.

각 시나리오별로 테스트를 반복 수행한 후, 재고 소진 시점에서의 확률 변동 추이와 실제 당첨 건수를 엑셀 등의 도구로 정리하여 명세서에 정의된 동적 확률 조정 로직이 정상적으로 작동하는지 최종 검증합니다.

태그: JMeter API-Testing Load-Testing Performance-Testing Groovy

6월 1일 04:15에 게시됨