테스트 라이프사이클
k6 테스트 라이프사이클 — 스크립트가 실행되는 순서
k6 스크립트는 함수가 하나만 있으면 되는데, 그 함수 겉을 감싸는 단계(스테이지) 가 따로 정해져 있어요. init → setup → VU 코드 → teardown 이라는 순서로 진행되는데, 각 단계가 언제·몇 번 호출되는지에 따라 스크립트 구조가 달라집니다. 이번 글에서는 네 단계가 각각 어떤 용도인지, 또 왜 그런 위치에 코드를 둬야 하는지를 차근차근 짚어 볼게요.
출처: k6 공식 문서 — Test lifecycle 원본 URL: https://grafana.com/docs/k6/latest/using-k6/test-lifecycle/
네 단계 라이프사이클
k6 테스트는 아래 네 단계로 실행돼요.
init컨텍스트에서 스크립트를 준비합니다. 파일을 로드하고 모듈을 임포트하고 테스트 라이프사이클 함수를 정의하는 단계예요. 필수입니다.setup함수가 실행돼서 테스트 환경을 세팅하고 데이터를 생성해요. 선택.- VU 코드가
default함수나 시나리오 함수에서 실행되며,options가 정한 만큼 오래·여러 번 반복돼요. 필수입니다. teardown함수가 실행되어 데이터를 후처리하고 테스트 환경을 닫아요. 선택.
참고
init코드를 제외한 각 단계는 라이프사이클 함수 안에서 일어납니다. 라이프사이클 함수는 k6 런타임이 정해진 순서로 호출하는 함수를 말해요.
라이프사이클 함수를 코드로 보면 이런 모양입니다.
// 1. init code
export function setup() {
// 2. setup code
}
export default function (data) {
// 3. VU code
}
export function teardown(data) {
// 4. teardown code
}
init 단계
init 컨텍스트는 스크립트가 로드될 때 VU당 한 번이 아니라, 프로세스에서 전체적으로 한 번 실행돼요. 여기서는 아래 같은 일을 합니다.
- 모듈 임포트
- 로컬 파일 시스템에서 파일 로드
- 모든
options로 테스트 설정 - VU·
setup·teardown단계(그리고 커스텀 함수나handleSummary()함수)를 위한 라이프사이클 함수 정의
// init context: importing modules
import http from 'k6/http';
import { Trend } from 'k6/metrics';
// init context: define k6 options
export const options = {
vus: 10,
duration: '30s',
};
// init context: global variables
const customTrend = new Trend('oneCustomMetric');
// init context: define custom function
VU 단계 (default 함수)
부하를 실제로 만드는 요청들은 default 함수(또는 시나리오가 지정한 함수) 안에 넣어요. k6는 각 반복마다 VU를 재설정하면서 이 함수를 실행합니다. 이 "재시작" 과정에서 쿠키가 비워지고, 테스트 설정에 따라 TCP 연결이 끊기기도 해요. 그래서 VU 코드는 반복이 전제된 가벼운 상태를 유지해야 합니다.
setup과 teardown 단계
부하 테스트가 시작되기 전에 데이터를 만들어 두고 싶거나, 끝나고 나서 정리하고 싶을 때 setup과 teardown을 써요.
import http from 'k6/http';
export function setup() {
const res = http.get('https://quickpizza.grafana.com/api/json');
return { data: res.json() };
}
export function teardown(data) {
console.log(JSON.stringify(data));
}
export default function (data) {
console.log(JSON.stringify(data));
}
setup()은 setupTimeout(기본 60초) 안에 끝나야 해요. 이 시간을 넘기면 VU가 시작되기 전에 테스트가 실패합니다. Grafana Cloud k6에서는 setupTimeout 상한이 10분이라, setup()에서 오래 걸리는 작업이 필요하다면 무거운 일은 외부 프로세스로 옮기고 결과만 테스트에 넘기는 걸 권장해요.
setup/teardown 건너뛰기
--no-setup과 --no-teardown 옵션으로 두 단계 실행을 생략할 수 있어요.
k6 run --no-setup --no-teardown ...
setup 결과를 default와 teardown에서 쓰기
setup()의 반환값은 default 함수와 teardown 함수의 첫 번째 인자로 전달됩니다. 그래서 한 번 만들어 둔 데이터를 어디서든 재사용할 수 있어요.
export function setup() {
return { v: 1 };
}
export default function (data) {
console.log(JSON.stringify(data));
}
export function teardown(data) {
if (data.v != 1) {
throw new Error('incorrect data: ' + JSON.stringify(data));
}
}
추가 라이프사이클 함수
default 대신 다른 이름의 함수를 시나리오의 exec으로 지정해 실행할 수도 있어요. 이러면 시나리오마다 서로 다른 워크로드를 별도 함수로 분리할 수 있습니다.
import http from 'k6/http';
import { sleep } from 'k6';
export const options = {
scenarios: {
my_web_test: {
// the function this scenario will execute
exec: 'webtest',
executor: 'constant-vus',
vus: 50,
duration: '1m',
},
},
};
export function webtest() {
http.get('https://test.k6.io/contacts.php');
sleep(Math.random() * 2);
}
더 알아보기
- 공식: k6 — Test lifecycle
- 공식: k6 — Options