개요
다양한 배포 환경(로컬, 개발, 운영 등)에서의 성능을 일관되게 측정하기 위해 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를 통해 테스트 시나리오를 정의합니다.
메인 스레드 그룹 설정
- Test Plan 우클릭 → Add → Threads (Users) → Thread Group 생성 후 스레드 수 조정
- Thread Group 내부에 HTTP Request Defaults 추가: 서버명을
${__P(SERVER)}, 포트를${__P(PORT)}로 지정 - 두 개의 HTTP 요청 샘플러 추가:
- 이름: "Frontend", 경로:
/ - 이름: "Backend", 경로:
/api/currentUser
- 이름: "Frontend", 경로:
- 각 요청에 Response Assertion 추가: 응답 코드가
200과 일치하는지 검증
사전 인증 처리 (setUp Thread Group)
API 접근 전 인증 토큰을 획득하고 세션에 유지해야 합니다.
- setUp Thread Group 생성
- 내부에 HTTP Request 추가:
- 이름: Login
- 메서드: POST
- 경로:
/api/login/account - 파라미터: username=
${__P(UNAME)}, password=${__P(PASS)}
- 로그인 응답에서 토큰 추출을 위해 Regular Expression Extractor 추가:
- 변수 이름: accessToken
- 정규식:
"token":"([^"]+)" - 템플릿:
$1$
- 추출된 값을 전역 프로퍼티로 저장하기 위해 BeanShell Sampler 사용:
${__setProperty(authToken,${accessToken})} - 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 리포트는 각 환경별로 시간 태그가 붙어 구분되며, 응답 시간 그래프, 통계 테이블 등을 포함합니다.