부하 옵션 다루기

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는 우선순위가 가장 높은 곳의 값을 써요.

  1. 먼저, 옵션의 기본값(default)을 사용합니다.
  2. 다음으로, --config 플래그로 지정한 설정 파일의 옵션을 사용해요.
  3. 그다음, 스크립트 값(설정된 경우)을 사용합니다.
  4. 그 후에, 환경 변수(설정된 경우)를 사용해요.
  5. 마지막으로, 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
}

더 알아보기