k6는 Grafana Labs에서 만든 부하 테스트 툴로 API 엔드포인트에 대한 성능 테스트 도구로 사용되며 오픈소스이다.
부하테스트 및 테스트 시나리오를 자바스크립트 코드 기반으로 작성하여 재사용성과 가독성이 좋다. (타입스크립트로도 작성 가능)
k6 의 설치 방법과 부하테스트 방법에 대해서 정리한다.
k6를 이용한 부하테스트 방법
설치
다음 명령어를 통해 설치가 가능하다. (Mac OS 기준)
brew install k6
OS가 다르다면 아래 문서를 참고하여 설치해준다.
https://k6.io/docs/get-started/installation/
k6를 이용한 부하 테스트 방법
먼저 간단히 테스트 플로우를 그려보자면 테스트 코드 작성 (JS or TS) -> terminal 접속하여 해당 코드 k6 run -> 테스트 결과 값 확인
순으로 테스트 플로우는 간단하다.
그 중 제일 중요한 테스트 코드 작성 방법에 대해서 알아본다.
테스트 코드 작성
먼저 아래 코드는 http 통신에서 가장 기본이 되는 테스트 코드 두가지이다.
get
import http from 'k6/http';
export default function () {
http.get('https://test.k6.io');
}
post
import http from 'k6/http';
export default function () {
const url = 'http://test.k6.io/login';
const payload = JSON.stringify({
email: 'aaa',
password: 'bbb',
});
const params = {
headers: {
'Content-Type': 'application/json',
},
};
http.post(url, payload, params);
}
여기서 get(), post() 이외에도 다양한 HTTP 요청에 대한 테스트가 가능하다.
자 그럼 가장 기본이 되는 get() 요청에 대한 스크립트를 작성 후 k6 run script.js(ts) 테스트를 실행해보자.
k6 run [script 명] 을 통해 실행을 하게 되면 다음과 같이 테스트 스크립트에 대한 결과 값을 보여준다.
이번에는 시나리오 작성을 통한 부하테스트의 예시를 알아본다.
import http from "k6/http" // http test
import { sleep } from "k6" // sleep 기능 사용 시 추가 (sleep(n) -> 지정한 n 기간 동한 VU 실행을 일시 중지)
export let options = {
vus: 10, // 가상의 유저 수
duration: '1m' // 테스트 진행 시간
};
const BASE_URL = '테스트 URL';
export default function () {
let getUrl = BASE_URL
http.get(getUrl);
sleep(1);
}
다음과 같이 작성하게 되면 유저 10명이 1분 간 BASE_URL에 대한 API 테스트가 진행된다.
duration에서 1m은 1분을 의미하며 30s 와 같이 초로도 변경이 가능하다.
자 이제 해당 스크립트를 실행하게 되면 다음과 같이 1분간 실행되고 있는 모습을 확인할 수 있다.
테스트가 종료되면 동일하게 결과값을 출력해준다.
추가적으로 조금 더 다양한 시나리오의 예시를 확인하고 싶다면 아래 k6 공식 문서를 참고해보자.
https://k6.io/docs/using-k6/scenarios/advanced-examples/
그리고 여기서 여러가지 정보들이 나오는데 각 항목별 내용은 다음과 같다.
아래 항목은 k6에서 항상 수집하는 항목에 대한 설명이다.
Matric Name | Type | Description |
vus | Gauge | 현재 활성화된 사용자 유저 |
vus_max | Gauge | 가능한 최대 가상 사용자 수(로드 레벨을 확장할 때 성능에 영향을 미치지 않도록 VU 리소스가 미리 할당됨) |
iterations | Counter | 테스트에서 Vu 가 JS 스크립트를 실행한 총 횟수 |
iteration_duration | Trend | default/main function 의 전체 반복을 한 번 완료하는데 소요된 시간 |
dropped_iterations | Counter | k6 v0.27.0 에 도입된 VU lack 또는 lack of time 으로 인해 시작할 수 없는 반복 회수 |
data_received | Counter | 데이터를 전달받은 양 |
data_sent | Counter | 데이터를 전달한 양 |
checks | Rate | 성공적으로 체크된 Rate |
아래 항목은 http 와 관련된 항목에 대한 설명이다.
Matric name | Type | Description |
http_reqs | Counter | 총 얼마나 많은 HTTP requests 를 k6 에서 생성했는지 횟수 |
http_req_blocked | Trend | 요청을 시작하기 전에 차단된 시간(TCP connection slot 을 기다리는) 단위: float |
http_req_connecting | Trend | 원격 호스트에 대한 TCP 연결을 설정하는데 소요된 시간. 단위: float |
http_req_tls_handshaking | Trend | 원격 호스트와의 핸드셰이킹 TLS 세션에 소요된 시간 |
http_req_sending | Trend | 원격 호스트에 데이터를 보내는데 소요된 시간 |
http_req_waiting | Trend | 원격 호스트로부터의 응답을 대기하는 데 소요된 시간(a.k.a. "time to first byte", or "TTFB"). |
http_req_receiving | Trend | 원격 호스트로부터 응답 데이터를 수신하는 데 소요된 시간 |
http_req_duration | Trend | 요청의 총 시간입니다. 이는 http_req_sending + http_req_waiting + http_req_receiving과 같습니다(즉, 초기 DNS 조회/연결 시간 없이 원격 서버가 요청을 처리하고 응답하는 데 소요된 시간). |
http_req_failed | Rate | The rate of failed requests according to setResponseCallback. |
테스트 결과물 출력
—out 옵션을 사용하면 테스트 결과에 대해서 출력을 할 수 있다.
AWS CloudWatch, Grafana Cloud, Prometheus, Datadog, New Relic, K6 Cloud, InfluxDB, CSV, JSON 등 여러가지 형태를 지원한다.
예를 들어 다음과 같이 실행을 하면 json 형태 파일로 결과값이 생성된다.
또한 html 로도 내보낼 수 있는 기능이 있다.
먼저 기존 코드에 다음 두가지 항목을 추가 해준다.
//상단의 추가
import { htmlReport } from "https://raw.githubusercontent.com/benc-uk/k6-reporter/main/dist/bundle.js";
//하단의 추가
export function handleSummary(data) {
return {
"summary.html": htmlReport(data),
}
}
이렇게 스크립트에 추가 후 실행하면 다음과 같이 summary.html 파일을 확인할 수 있다.
html 파일을 열어 다음과 같이 확인이 가능하다.
추가 Tip
만약 성능 테스트를 진행하고픈 API 가 postman 이나 swagger를 통해 작성된 것이 있다면 k6에서 k6용 script로 변환해주는 툴도 제공하고 있어서 아래 문서를 참고하여 진행해보는 것도 도움이 될 것이다.
Swaager
https://k6.io/blog/load-testing-your-api-with-swagger-openapi-and-k6/
Postman
https://k6.io/blog/load-testing-with-postman-collections/
기존에는 JMeter를 통해서 부하테스트를 진행하였는데 이번에 알게 된 k6를 사용해보니 좀 더 다양하게 테스트를 진행할 수 있어 좋았던 것 같다.
그리고 무엇보다 테스트에 대한 내용을 코드로 작성하여 관리할 수 있는 점도 한 몫한 것 같다.
k6 공식 문서가 정리가 너무 잘되어 있어 부족한 부분이나 추가적으로 필요한 부분들은 아래 공식 문서를 통해 확인해보면 될 것 같다.
관련글
참고
k6 공식 문서
k6 api
https://k6.io/docs/javascript-api/
https://jiyeonseo.github.io/2022/09/11/k6-get-started/
'Tools' 카테고리의 다른 글
Termius로 어디서든 원격 SSH 접속하기 (0) | 2023.09.27 |
---|---|
Tools - Postman REST API 테스트 환경 만들기 (0) | 2021.07.04 |
Eclipse - 기존 프로젝트 import시 프로젝트 이름 변경 (0) | 2021.05.19 |
댓글