이 글은 성능 테스트를 할 때 고려해 볼만한 도구들을 소개하는 글입니다.
이론을 건너뛰고, 도구 소개를 보고 싶으신 분은 4장으로 이동하시면 됩니다.
1. 성능 테스트란?
- 소프트웨어 애플리케이션의 반응 시간, 안정성, 확장성, 리소스 사용량 등을 측정하는 프로세스
- 시스템이 예상 부하를 견딜 수 있는지 확인하고, 성능 병목 현상을 파악하여 최적화하는 데 목적을 둔다.
2. 성능 테스트의 종류
- 부하 테스트 (Load Testing)
- 예상되는 최대 사용자 수를 시뮬레이션하며 성능 측정
- 스트레스 테스트 (Stress Testing)
- 시스템이 한계치 이상으로 과부하 상태에서 어떻게 반응하는지 확인
- 내구성 테스트 (Endurance Testing)
- 스파이크 테스트 (Spike Testing)
- 짧은 시간동안 급격한 변화를 주어 시스템의 반응을 측정
- 볼륨 테스트 (Volume Testing)
- 대량의 데이터를 처리할 때의 시스템 성능을 측정
3. 성능 테스트의 중요성
- 빠른 응답 시간
- 사용자 경험을 향상시키기 위해 API 응답 시간이 중요
- 안정성
- 다양한 상황에서 API가 안정적으로 동작하는지 확인이 필요
- 확장성
- 트래픽 증가에 따라 API 서버가 원활하게 작동할 수 있는지 검증
3-1. 성능 테스트 수행 방법
- 목표 설정
- 테스트의 목표와 성공 기준을 명확히 설정
- 테스트 시나리오 작성
- 실제 사용 사례에 기반한 시나리오 작성
- 테스트 환경 구축
- 실제 환경과 유사한 테스트 환경 설정
- 테스트 실행
- 성능 테스트 도구를 사용하여 테스트 실행
- 결과 분석
- 결과를 분석하여 성능 병목 현상과 개선점 찾기
- 최적화 및 재테스트
- 성능 문제를 해결하고, 다시 테스트하여 성능 향상을 확인
3-2. 성능 테스트 결과 분석
- 응답 시간
- 처리량 (Throughput)
- 자원 사용량
- CPU, 메모리, 네트워크 사용량 등을 모니터링
- 에러 비율
4. 성능 테스트 도구 소개
4-1. Apache JMeter
Apache JMeter는 강력한 성능 테스트 도구로, 다양한 프로토콜을 지원한다.
설치 방법
HomeBrew를 이용
$ brew search jmeter
실행
터미널에서 jmeter 명령어 입력
$ jmeter
사용 방법
- 첫 실행시, Test Plan의 이름 및 설명을 첨부할 수 있다.
-
스레드 요청 그룹 생성 후, 요청 속성 설정
-
Number of Threads : 동시에 실행되는 가상 사용자의 수
-
Ramp-up Period : 가상 사용자가 전체 시간 동안 동시에 시작되지 않고, 일정한 시간 동안 차례로 시작되는 기간을 지정
-
Loop Count : 반복 횟수
-
요청 생성 후, Request URL 및 헤더, 파라미터(혹은 Body) 지정
장점 및 특징
- 다양한 프로토콜 지원
- HTTP, HTTPS, FTP, JDBC, JMS, LDAP, SOAP, TCP 등 다양한 프로토콜 지원
- 확장성
- 분산 테스트
- 여러 머신에서 테스트를 실행하여 부하를 분산할 수 있다.
- 강력한 GUI
- 사용자 친화적인 GUI로 테스트 계획을 쉽게 작성할 수 있다.
- 스크립트 지원
- BeanShell, Groovy 등의 스크립트를 사용하여 복잡한 테스트 시나리오를 작성할 수 있다.
단점
- 고사양 요구
- 많은 리소스를 소모하므로 고사양의 하드웨어가 필요할 수 있다.
- 복잡한 설정
- 고급 기능을 사용하려면 복잡한 설정과 스크립팅이 필요할 수 있다.
- 실시간 모니터링 제약
- 실시간으로 대규모 테스트를 모니터링하는 데 제약이 있을 수 있다.
- 러닝 커브
- 기본적인 사용은 쉽지만, 고급 기능을 익히는 데는 시간이 필요할 수 있다.
4-2. Postman
널리 사용되는 API 테스트 도구로, 간단한 성능 테스트를 수행할 수 있다.
Postman에서는 API performance를 테스트 할 수 있는 기능을 추가했다고 한다.
성능 테스트 시나리오 작성
- Runner 생성
- Run Configuration
- 몇 번의 반복 요청을 보낼지
- 반복 요청 간의 지연 시간은 얼마나 가질지
- 실행
성능 테스트 결과
단순히 반복한 결과와 각 요청별로 어느정도의 시간이 걸렸는지만 보여준다.
아쉬운 점
공식 홈페이지에서는 아래와 같은 그래프와 함께 표로 데이터 통계를 볼 수 있다고 했지만,
무료 계정으로 확인한 결과 보이지 않는다. → 유료 플랜에서만 지원하는 기능인 것 같다.
4-3. Gatling
실시간 그래프와 함께 상세한 보고서를 제공하는 유료 성능 테스트 도구
Java Development Kit (JDK) 8 이상이 요구된다.
사용 방법
공식홈페이지 에서 사용 가능
서비스가 유료로 전환되면서, 무료 플랜의 경우 30번만 테스트 가능
GUI를 사용한 테스트
테스트 결과
Summary 탭에서는 실행한 테스트에 대한 결과를 요약하여 볼 수 있다.
Report 탭에서는 각 요청 및 연결에 대한 정보들을 상세히 보여준다.
스크립트로 테스트 시나리오 작성하여 테스트하는 방식
Gatling은 Scala 기반으로 시나리오를 작성한다.
예제 코드 (src/gatling/scala)
import io.gatling.core.Predef._
import io.gatling.http.Predef._
import scala.concurrent.duration._
class BasicSimulation extends Simulation {
val httpProtocol = http
.baseUrl("http://example.com") // 테스트할 URL
.acceptHeader("application/json")
val scn = scenario("BasicSimulation")
.exec(http("request_1")
.get("/"))
setUp(
scn.inject(atOnceUsers(100)) // 사용자 수 설정
).protocols(httpProtocol)
}
테스트 실행
커맨드 라인에서 Gatling 실행:
sh ./bin/gatling.sh
결과 분석
- 테스트가 완료되면 Gatling은 HTML 형식의 보고서를 생성합니다.
- 생성된 보고서를 브라우저로 열어 결과를 분석합니다.
장점
- 고성능
- 비동기 방식으로 많은 사용자 요청을 처리할 수 있다.
- 확장성
- Scala를 기반으로 스크립트를 작성하여 복잡한 테스트 시나리오를 구현할 수 있다.
- 실시간 보고
- 테스트 진행 중 실시간으로 성능 지표를 모니터링할 수 있다.
- 자동 보고서 생성
- 테스트가 끝나면 상세한 HTML 보고서를 자동으로 생성한다.
- DevOps 친화적
- 코드로 시나리오를 작성하기 때문에 버전 관리 시스템과 CI/CD 파이프라인에 통합이 용이
단점
- 유료 정책
- 러닝 커브
- Scala 언어에 익숙하지 않은 사용자는 시나리오 작성이 어려울 수 있다.
- 복잡한 설정
- 고급 기능을 사용하기 위해서는 복잡한 설정과 코드 작성이 필요할 수 있다.
- 자원 요구
- 대규모 테스트를 실행할 때는 높은 하드웨어 자원이 필요할 수 있다.
4-4. k6
성능 테스트 스크립트를 작성하고 실행할 수 있는 오픈 소스 도구
설치 방법
테스트 스크립트 작성
k6는 JavaScript로 테스트 스크립트를 작성한다.
예제 (get-google.js)
import http from "k6/http"
import { sleep } from "k6"
export let options = {
vus: 10,
duration: '1m'
};
export default function () {
let getUrl = "<https://www.google.com>";
http.get(getUrl);
sleep(1);
}
테스트 실행
$ k6 run test.js
실행 결과
결과 분석
- 테스트 실행 중 콘솔에 실시간으로 결과가 출력됩니다.
- k6는 다양한 포맷(JSON, InfluxDB 등)으로 결과를 내보낼 수 있어, 이후 분석 도구와 연동할 수 있습니다.
장점
- CLI 도구
- 커맨드 라인 인터페이스(CLI)를 통해 쉽게 테스트를 실행하고 결과를 확인할 수 있다.
- 고성능
- 단일 프로세스로 수천 개의 가상 사용자를 처리할 수 있다.
- 확장성
- Grafana와 같은 모니터링 도구와 쉽게 통합할 수 있다.
- DevOps 친화적
- CI/CD 파이프라인에 통합하여 자동화된 테스트 환경을 구축하기 용이하다.
- 경량화
- 비교적 가벼운 도구로, 빠르고 간편하게 성능 테스트를 수행할 수 있다.
단점
- 고급 기능 한계
- JMeter나 Gatling에 비해 고급 기능이 부족할 수 있다.
- 제한된 프로토콜 지원
- HTTP/HTTPS 프로토콜 위주로 지원
- 다양한 프로토콜을 필요로 하는 경우 한계가 있을 수 있다.
- 러닝 커브
- JavaScript에 익숙하지 않은 사용자는 초기 학습이 필요할 수 있다.
4-5. Locust
Python으로 작성된 스크립트를 사용하여 사용자 행동을 시뮬레이션하는 도구
설치 방법
pip 명령어로 설치
$ pip install locust
혹은
$ sudo apt install python3-locust
테스트 스크립트 작성
Locust는 Python을 기반으로 스크립트를 작성한다.
예제 (locustfile.py)
from locust import HttpUser, task, between, TaskSet
class UserBehavior(TaskSet):
def home(self):
self.client.get('/')
class LocustUser(HttpUser):
host = "<https://google.com>"
tasks = [UserBehavior]
wait_time = between(1, 4)
테스트 실행
$ locust -f locustfile.py
브라우저를 열고 http://localhost:8089에 접속하여 웹 인터페이스에서 테스트를 설정하고 시작할 수 있다.
브라우저 접속
결과 분석
- 웹 인터페이스에서 실시간으로 테스트 결과를 모니터링할 수 있다.
- 결과는 CSV 파일로 내보낼 수 있으며, 이후 분석 도구와 연동할 수 있다.
장점
- 실시간 피드백
- 웹 인터페이스에서 실시간으로 결과를 확인할 수 있어 테스트 진행 상황을 쉽게 모니터링할 수 있다.
- 확장성
- 분산 로드를 통해 대규모 부하 테스트가 가능하다.
- 커스터마이즈 가능
- Python의 강력한 기능을 활용하여 복잡한 시나리오를 쉽게 작성할 수 있다.
- 경량화
- 간편한 설치와 사용으로 빠르게 테스트를 시작할 수 있다.
단점
- 고급 기능 한계
- JMeter와 같은 도구에 비해 고급 기능이 부족할 수 있다.
- 성능 제한
- 대규모 테스트에서는 성능 제한이 있을 수 있으며, 분산 로드를 필요로 할 수 있다.
- Python 의존성
- Python에 익숙하지 않은 사용자는 초기 학습이 필요할 수 있다.
4-6. BlazeMeter
클라우드 기반의 성능 테스트 플랫폼으로, 다양한 테스트 시나리오를 제공한다.
시작
테스트 작성
- JMeter 스크립트 업로드
- 기존에 작성한 JMeter 스크립트를 업로드하여 테스트할 수 있다.
- BlazeMeter 자체 스크립트 작성
- BlazeMeter UI에서 직접 테스트 스크립트를 작성할 수 있다.
- Swagger/OpenAPI 파일 사용
- API 스펙 파일을 업로드하여 테스트 시나리오를 자동 생성할 수 있다.
사용 방법
시나리오가 필요한 테스트의 경우, Blazemeter로 행동을 녹화하면 시나리오를 jmx 파일로 추출할 수 있다.
- Ex. 로그인 → “송아리아이티” 검색 → 회사 홈페이지 접속
이렇게 생성된 jmx 파일을 다운로드하여, Apache Jmeter에서 import 하여 사용할 수 있다.
장점
- 클라우드 기반
- 클라우드에서 테스트를 실행하므로, 로컬 자원에 대한 의존성이 없다.
- JMeter 호환
- JMeter 스크립트를 손쉽게 업로드하고 실행할 수 있다.
- 확장성
- 분산 로드를 지원하여 수십만 명의 가상 사용자를 시뮬레이션할 수 있다.
- 통합성
- CI/CD 도구와 통합하여 자동화된 테스트 환경을 구축할 수 있다.
- 실시간 모니터링 및 보고서
- 테스트 중 실시간으로 결과를 모니터링하고, 테스트 후 상세한 보고서를 제공한다.
단점
- 비용
- 고급 기능과 대규모 테스트는 유료 플랜이 필요
- 인터넷 의존성
- 클라우드 기반이므로, 인터넷 연결이 필요하며, 인터넷 속도에 따라 테스트 환경이 영향을 받을 수 있다.
- 초기 설정 복잡성
- 처음 사용하는 사용자는 설정 과정에서 다소 복잡함을 느낄 수 있다.
- 제한된 커스터마이제이션
- JMeter나 Gatling 같은 오픈 소스 도구에 비해 일부 기능은 제한될 수 있다.
5. 마무리
Postman의 경우는 아직까지는 성능 테스트로 이용하기에는 기능들이 너무 부족하다.
Gatling의 경우는 유료 서비스이므로, 비용 절감이 중요시되는 입장에서는 과하다고 생각된다.
k6와 Locust의 경우는, 성능 테스트를 위해 언어를 배워야 한다는 입장에서 개인적으로는 부담스럽다.
따라서, Apache JMeter와 (시나리오가 필요한 경우) BlazeMeter를 함께 사용하는 것이 제일 적절해 보인다.
6. 참고자료