시나리오

k6 시나리오 — 워크로드와 트래픽 패턴 설계하기

부하 테스트에서 "어떻게 트래픽을 흘려보낼지"는 전체 설계의 핵심이에요. k6의 시나리오(scenarios) 는 가상 사용자(VU)와 반복(iteration) 스케줄을 아주 세밀하게 설정할 수 있게 해줍니다. 한 스크립트 안에 여러 시나리오를 선언해서 서로 다른 워크로드를 동시에 흘려보낼 수도 있어요. 이번 글에서는 시나리오를 구성하고, executor(실행기)로 로드를 모델링하는 방법을 알아볼게요.

출처: k6 공식 문서 — Scenarios 원본 URL: https://grafana.com/docs/k6/latest/using-k6/scenarios/

시나리오의 장점

시나리오를 쓰면 부하 테스트 구성이 훨씬 유연해져요.

  • 테스트 조직이 쉽고 유연해요. 같은 스크립트에 여러 시나리오를 선언하고, 각각이 서로 다른 자바스크립트 함수를 독립적으로 실행하게 할 수 있어요.
  • 더 현실적인 트래픽을 흉내 내요. 시나리오마다 전용 executor가 제공하는 distinct한 VU·반복 스케줄링 패턴을 쓸 수 있습니다.

시나리오 구성하기

시나리오는 options 객체의 scenarios 키로 구성해요. 시나리오 이름은 스크립트 안에서 유일하면 아무 이름이나 쓸 수 있는데, 이 이름이 결과 요약이나 태그 등에 그대로 나타납니다.

export const options = {
  scenarios: {
    example_scenario: {
      // name of the executor to use
      executor: 'shared-iterations',

      // common scenario configuration
      startTime: '10s',
      gracefulStop: '5s',
      env: { EXAMPLEVAR: 'testing' },
      tags: { example_tag: 'testing' },

      // executor-specific configuration
      vus: 10,
      iterations: 200,
      maxDuration: '10s',
    },
    another_scenario: {
      /*...*/
    },
  },
};

시나리오 executor

각 k6 시나리오의 VU 워크로드는 executor 가 스케줄링해요. executor는 테스트가 얼마나 오래 실행되는지, 트래픽이 일정한지 변하는지, 워크로드를 VU 수 기준으로 모델링할지 도착률(arrival rate) 기준으로 모델링할지(즉 open/closed 모델) 결정합니다. 시나리오 객체에는 executor 속성에 미리 정의된 executor 이름 중 하나를 반드시 지정해야 해요. executor 선택에 따라 k6가 로드를 어떻게 모델링하는지가 달라져요.

  • 반복 횟수 기준으로.
    • shared-iterations: VU들이 반복을 나눠서 수행해요.
    • per-vu-iterations: VU마다 설정한 반복 횟수를 각자 수행해요.
  • VU 수 기준으로.
    • constant-VUs: VU를 일정한 수로 유지해요.
    • ramping-vus: 설정한 스테이지에 따라 VU 수를 늘리거나 줄여요.

시나리오 예제

아래 예제는 두 시나리오를 같은 스크립트에 둔 모습이에요. shared_iter_scenario는 10개의 VU가 100번의 반복을 나눠서 돌고, per_vu_scenario는 10초 후부터 VU당 10번씩 반복합니다.

import http from 'k6/http';

export const options = {
  scenarios: {
    shared_iter_scenario: {
      executor: 'shared-iterations',
      vus: 10,
      iterations: 100,
      startTime: '0s',
    },
    per_vu_scenario: {
      executor: 'per-vu-iterations',
      vus: 10,
      iterations: 10,
      startTime: '10s',
    },
  },
};

export default function () {
  http.get('https://test.k6.io/');
}

실행하면 요약 출력이 시나리오별로 쪼개져 보여요.

  execution: local
     script: scenario-example.js
     output: -

  scenarios: (100.00%) 2 scenarios, 20 max VUs, 10m40s max duration (incl. grace
ful stop):
           * shared_iter_scenario: 100 iterations shared among 10 VUs (maxDurati
on: 10m0s, gracefulStop: 30s)
           * per_vu_scenario: 10 iterations for each of 10 VUs (maxDuration: 10m
0s, startTime: 10s, gracefulStop: 30s)

전체 출력에는 기본 요약 메트릭도 함께 들어가요. 어떤 부하 패턴을 테스트해야 하는지에 따라 executor를 고르면, k6가 그 패턴을 정확히 스케줄링해 줍니다.

더 알아보기