부하 옵션 다루기
k6 부하 옵션(Options) 다루기 — 설정을 놓을 위치와 우선순위
부하 테스트를 어떻게 돌릴지는 options라는 설정으로 결정돼요. 그런데 k6는 옵션을 여러 곳에서 설정할 수 있어서, "어디에 두는 게 맞는지"가 처음에는 헷갈릴 수 있어요. 이번 글에서는 CLI 플래그·환경 변수·스크립트 options 객체·설정 파일이라는 네 가지 위치와, 값이 겹칠 때 어떤 게 이기는지를 정리해 볼게요.
출처: k6 공식 문서 — Options: How to use options 원본 URL: https://grafana.com/docs/k6/latest/using-k6/k6-options/how-to/
옵션을 설정할 수 있는 곳
k6는 옵션을 설정할 수 있는 자리가 여러 개예요.
- CLI 플래그
- 환경 변수
- 스크립트의
options객체 - 설정 파일(configuration file)
대부분의 경우, 특정 테스트의 어떤 옵션을 어디에 둘지는 사용 사례가 결정해 줍니다. 그리고 테스트가 실행되는 동안 옵션의 값을 읽어 갈 수도 있어요.
우선순위(Order of precedence)
같은 옵션을 여러 곳에 설정했다면 k6는 우선순위가 가장 높은 곳의 값을 써요.
- 먼저, 옵션의 기본값(default)을 사용합니다.
- 다음으로,
--config플래그로 지정한 설정 파일의 옵션을 사용해요. - 그다음, 스크립트 값(설정된 경우)을 사용합니다.
- 그 후에, 환경 변수(설정된 경우)를 사용해요.
- 마지막으로, CLI 플래그 값(설정된 경우)을 사용합니다.
즉, 명령줄 플래그가 가장 높은 우선순위를 가져요.
옵션을 어디에 두면 좋을까
자주 쓰는 세 가지 기준을 정리하면 이렇게 돼요.
- 스크립트의
options객체 — 버전 관리와 정리. 옵션을 버전 관리에 넣고 테스트를 깔끔하게 유지하고 싶다면, 스크립트의options객체가 일반적으로 가장 좋은 자리예요. 자동으로 버전 관리가 되고, 재사용이 쉽고, 스크립트를 모듈화할 수 있어요. - CLI 플래그 — 그때그때 빠르게. 빠른 테스트를 돌리고 싶을 때 명령줄 플래그가 편리해요. 우선순위에 따라 스크립트의 파일 설정을 덮어쓰는 것도 가능합니다. 예를 들어 스크립트에 테스트 시간이 60초로 설정돼 있다면,
--duration 30s플래그로 딱 절반 길이의 테스트를 돌릴 수 있어요. - 환경 변수 — 빌드 체인에서 설정하기. Docker 컨테이너 정의, CI UI, vault처럼 환경 변수를 선언하는 어디서든 옵션을 끌어올 수 있어요. 예를 들어
block hostnames옵션은 환경 변수와 잘 어울리는 케이스예요.
옵션 설정 예시
스크립트에서 설정하기
import http from 'k6/http';
export const options = {
hosts: { 'test.k6.io': '1.2.3.4' },
stages: [
{ duration: '1m', target: 10 },
{ duration: '1m', target: 20 },
{ duration: '1m', target: 0 },
],
thresholds: { http_req_duration: ['avg<100', 'p(95)<200'] },
noConnectionReuse: true,
userAgent: 'MyK6UserAgentString/1.0',
};
export default function () {
http.get('http://test.k6.io/');
}
환경 변수와 CLI 플래그로 설정하기
같은 옵션을 환경 변수나 명령줄 플래그로도 설정할 수 있어요.
K6_NO_CONNECTION_REUSE=true K6_USER_AGENT="MyK6UserAgentString/1.0" k6 run script.js
k6 run --no-connection-reuse --user-agent "MyK6UserAgentString/1.0" script.js
k6 변수로 옵션 값 채우기
--env 플래그로 k6 변수를 정의한 뒤, 스크립트 안에서 그 변수로 옵션 값을 동적으로 만들 수도 있어요.
k6 run script.js --env MY_USER_AGENT="hello"
import http from 'k6/http';
export const options = {
userAgent: __ENV.MY_USER_AGENT,
};
export default function () {
http.get('http://test.k6.io/');
}
참고 이 방법은
--env플래그를 쓰지만, 운영체제의 환경 변수를 쓰는 것과는 달라요. 자세한 건 환경 변수 문서를 확인하세요.
--config 플래그로 설정 파일 지정하기
k6에는 편집할 수 있는 기본 설정 파일이 있고, 새 파일을 만들어 CLI 플래그로 지정할 수도 있어요. --config 플래그로 설정한 옵션은 우선순위가 두 번째로 낮습니다(기본값 다음). 다른 곳에서 설정하면 --config 플래그의 옵션을 덮어써요.
k6 run --config options.json script.js
{
"hosts": {
"test.k6.io": "1.2.3.4"
},
"stages": [
{
"duration": "1m",
"target": 10
},
{
"duration": "1m",
"target": 30
},
{
"duration": "1m",
"target": 0
}
],
"thresholds": {
"http_req_duration": ["avg<100", "p(95)<200"]
},
"noConnectionReuse": true,
"userAgent": "MyK6UserAgentString/1.0"
}
설정을 로직에서 분리하는 또 다른 방법으로, 스크립트 안에서 JSON.parse()를 쓰는 것도 있어요.
// load test config, used to populate exported options object:
const testConfig = JSON.parse(open('./config/test.json'));
// combine the above with options set directly:
export const options = testConfig;
스크립트에서 옵션 값 읽어오기
k6/execution API의 test.options 객체로, 테스트가 실행되는 동안 병합·파생된 옵션 값을 읽을 수 있어요.
import exec from 'k6/execution';
export const options = {
stages: [
{ duration: '5s', target: 100 },
{ duration: '5s', target: 50 },
],
};
export default function () {
console.log(exec.test.options.scenarios.default.stages[0].target); // 100
}