JMeter를 이용한 다중 환경 성능 테스트 자동화

개요

다양한 배포 환경(로컬, 개발, 운영 등)에서의 성능을 일관되게 측정하기 위해 JMeter와 쉘 스크립트를 결합한 자동화 전략을 소개합니다. 테스트 로직은 동일하나 호스트 주소, 포트, 인증 정보만 변경되므로, 이를 변수화하여 유연하게 대응할 수 있습니다.

JMeter 설치 및 기본 설정

먼저 JMeter를 설치하고 실행 가능하도록 환경을 구성합니다.

wget https://mirror.cogentco.com/pub/apache/jmeter/binaries/apache-jmeter-5.4.1.tgz
tar -zxvf apache-jmeter-5.4.1.tgz -C /opt

PATH에 JMeter 실행 경로를 추가합니다.

export PATH="$PATH:/opt/apache-jmeter-5.4.1/bin"

이후 터미널 어디서든 jmeter 명령어를 사용할 수 있습니다.

테스트 플랜 구성 (GUI 모드)

GUI를 통해 테스트 시나리오를 정의합니다.

메인 스레드 그룹 설정

  1. Test Plan 우클릭 → Add → Threads (Users) → Thread Group 생성 후 스레드 수 조정
  2. Thread Group 내부에 HTTP Request Defaults 추가: 서버명을 ${__P(SERVER)}, 포트를 ${__P(PORT)}로 지정
  3. 두 개의 HTTP 요청 샘플러 추가:
    • 이름: "Frontend", 경로: /
    • 이름: "Backend", 경로: /api/currentUser
  4. 각 요청에 Response Assertion 추가: 응답 코드가 200과 일치하는지 검증

사전 인증 처리 (setUp Thread Group)

API 접근 전 인증 토큰을 획득하고 세션에 유지해야 합니다.

  1. setUp Thread Group 생성
  2. 내부에 HTTP Request 추가:
    • 이름: Login
    • 메서드: POST
    • 경로: /api/login/account
    • 파라미터: username=${__P(UNAME)}, password=${__P(PASS)}
  3. 로그인 응답에서 토큰 추출을 위해 Regular Expression Extractor 추가:
    • 변수 이름: accessToken
    • 정규식: "token":"([^"]+)"
    • 템플릿: $1$
  4. 추출된 값을 전역 프로퍼티로 저장하기 위해 BeanShell Sampler 사용:
    ${__setProperty(authToken,${accessToken})}
  5. Main Thread Group에 HTTP Cookie Manager 추가하여 토큰을 쿠키로 전달:
    • Name: token
    • Value: ${__property(authToken)}
    • Domain: ${__P(SERVER)}:${__P(PORT)}
    • Path: /

스크립트 기반 실행 자동화

환경별 반복적인 명령어 입력을 방지하기 위해 Bash 스크립트를 작성합니다.

환경 변수 정의

export DEV_SERVER="dev.api.example.com"
export DEV_PORT="8080"
export DEV_UNAME="dev_user"
export DEV_PASS="dev_pass"

export STAGING_SERVER="staging.api.example.com"
export STAGING_PORT="80"
export STAGING_UNAME="stage_user"
export STAGING_PASS="stage_pass"

export PROD_SERVER="api.example.com"
export PROD_PORT="443"
export PROD_UNAME="prod_user"
export PROD_PASS="prod_pass"

실행 스크립트 (run-test.sh)

#!/bin/bash

TIMESTAMP=$(date "+%Y%m%d%H%M%S")
ENVIRONMENT=${1:-"dev"}
UPPER_ENV=$(echo "$ENVIRONMENT" | awk '{print toupper($0)}')
SERVER_VAR="${UPPER_ENV}_SERVER"
PORT_VAR="${UPPER_ENV}_PORT"
UNAME_VAR="${UPPER_ENV}_UNAME"
PASS_VAR="${UPPER_ENV}_PASS"

REPORT_DIR="report"
LOG_DIR="log"

[ ! -d "$REPORT_DIR" ] && mkdir -p "$REPORT_DIR"
[ ! -d "$LOG_DIR" ] && mkdir -p "$LOG_DIR"

JVM_ARGS="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m"
TEST_PLAN="test.jmx"

jmeter $JVM_ARGS \
  -n -t "$TEST_PLAN" \
  -J SERVER="${!SERVER_VAR}" \
  -J PORT="${!PORT_VAR}" \
  -J UNAME="${!UNAME_VAR}" \
  -J PASS="${!PASS_VAR}" \
  -l "$LOG_DIR/${ENVIRONMENT}-${TIMESTAMP}.jtl" \
  -e -o "$REPORT_DIR/${ENVIRONMENT}-${TIMESTAMP}"

스크립트 실행 예시

  • ./run-test.sh dev — 개발 환경 테스트
  • ./run-test.sh staging — 스테이징 환경 테스트
  • ./run-test.sh prod — 운영 환경 테스트 (기본값: dev)

생성된 HTML 리포트는 각 환경별로 시간 태그가 붙어 구분되며, 응답 시간 그래프, 통계 테이블 등을 포함합니다.

태그: JMeter 성능 테스트 자동화 스크립트 다중 환경 테스트 CI/CD

7월 7일 00:13에 게시됨