🌊

k6の基本

2024/09/04に公開

はじめに

このページでは負荷試験ツールであるk6の基本と使用例について記述します。

k6とは?

k6は、パフォーマンスおよび負荷テストのためのオープンソースツールで、スクリプトベースでのテストシナリオ作成をサポートします。開発者やQAエンジニアが、アプリケーションやAPIのパフォーマンスを効果的にテスト・検証するのに役立ちます。JavaScriptでテストシナリオを記述できるため、柔軟で直感的な操作が可能です。

k6の特徴

  • 軽量で高速: Go言語で開発されており、低リソースで高いパフォーマンスを発揮します。
  • スクリプトベース: JavaScriptでシナリオを作成可能、開発者にとって使いやすい。
  • CLIベース: コマンドラインから簡単にテストを実行できます。
  • 豊富なレポート機能: 詳細なレポートやメトリクスを生成可能。
  • しきい値(Thresholds): パフォーマンス基準を設定してテストの成否を評価できます。

k6のインストール方法

k6のインストールは非常に簡単です。公式ドキュメントに記載されている方法に従い、各OSごとにインストールすることができます。詳細はk6の公式インストールガイドを参照してください。

macOSの場合

Homebrewを使用してインストールします。

brew install k6

Ubuntuの場合

APTを使用してインストールします。

sudo apt update
sudo apt install k6

Windowsの場合

Chocolateyを使用してインストールします。

choco install k6

インストールが完了したら、以下のコマンドでk6のバージョンを確認し、正常にインストールされたことを確認します。

k6 version

k6の基本的な使い方

k6を使った負荷テストは、JavaScriptファイルにシナリオを記述し、それをk6コマンドで実行するという流れになります。以下に基本的な使用例を示します。

基本的なテストスクリプトの作成

まず、test.jsという名前のファイルを作成し、以下の内容を記述します。

import http from 'k6/http';
import { check, sleep, group } from 'k6';

export const options = {
  vus: 10, // 仮想ユーザー数
  duration: '30s', // テスト実行時間
  thresholds: {
    http_req_duration: ['p(95)<500'], // 95%のリクエストが500ms未満であること
  },
};

export default function () {
  group('API performance test', () => {
    const url = 'https://test-api.example.com';
    const response = http.get(url);
    
    check(response, {
      'status is 200': (r) => r.status === 200,
      'response time is less than 500ms': (r) => r.timings.duration < 500,
    });
    
    console.log(`Virtual user: ${__VU}`); // 現在の仮想ユーザーを表示
    sleep(1); // 1秒の待機
  });
}

スクリプトの説明

  • group: コードをグループ化するために使用され、テスト結果を見やすく整理します。
  • __VU: 現在の仮想ユーザー(Virtual User)を示す特殊変数。各仮想ユーザーのインデックスをログに出力できます。
  • thresholds: テストの成否を決定するためのパフォーマンス基準を設定するオプション。ここでは、95%のリクエストが500ms未満で完了することを求めています。

テストの実行

上記のスクリプトを作成したら、以下のコマンドでテストを実行します。

k6 run test.js

実行すると、コンソールにテスト結果が表示され、リクエスト数、エラーレート、平均応答時間などのパフォーマンスデータが確認できます。

k6のオプション

k6にはさまざまなオプションが用意されており、テストのシナリオやパラメータを細かく調整できます。

1. vusduration

  • vus: 仮想ユーザーの数を指定します。
  • duration: テストの継続時間を指定します。
export const options = {
  vus: 50, // 50人の仮想ユーザー
  duration: '1m', // 1分間テストを実行
};

2. Thresholdsの設定

thresholdsオプションを使用することで、テストの成否を評価する基準(しきい値)を設定できます。以下の例では、95%のリクエストが500ms以内に完了することを条件としています。

export const options = {
  thresholds: {
    http_req_duration: ['p(95)<500'], // 95%のリクエストが500ms未満であること
    checks: ['rate>0.99'], // 99%以上のチェックが成功すること
  },
};
  • http_req_duration: HTTPリクエストの持続時間。
  • checks: チェックの成功率。

詳細はk6公式のドキュメントを参照してください。

テスト結果の出力

k6はデフォルトでコンソールにテスト結果を表示しますが、結果をCSVファイルとして出力することも可能です。

テスト結果をCSVに出力する

以下のコマンドでテスト結果をCSV形式でファイルに出力できます。

k6 run --out csv=results.csv test.js

CSVファイルの項目

CSVファイルには以下の項目が含まれます:

  1. metric_name: メトリクスの名前(例: http_req_duration
  2. timestamp: タイムスタンプ(エポック形式)
  3. value: メトリクスの値(例: リクエスト時間)
  4. tags: テスト実行時のタグ情報(例: method=GET
  5. trend: 値の種類(例: avg - 平均値、p(90) - 90パーセンタイル)
  6. iteration: 現在のイテレーション番号
  7. vu: 仮想ユーザーのID(__VU
  8. status: HTTPレスポンスのステータスコード
  9. url: リクエストのURL
  10. リクエストの応答時間に関する項目
    • http_req_waiting: サーバーがリクエストを処理するまでの時間(ミリ秒)
    • http_req_connecting: クライアントからサーバーへの接続が確立されるまでの時間(ミリ秒)
    • http_req_receiving: レスポンスデータを受信するまでの時間(ミリ秒)
    • http_req_sending: リクエストデータが送信されるまでの時間(ミリ秒)
    • http_req_duration: 全体のリクエスト持続時間(送信、接続、待機を含む)

詳細な出力のカスタマイズ方法については、k6の結果出力に関する公式ドキュメントを参照してください。

まとめ

k6は、柔軟で強力な負荷試験ツールであり、さまざまなオプションと設定によって、リアルなユーザー負荷をシミュレートできます。Thresholdsによるテスト基準の設定や、group__VUを用いた詳細なシナリオ作成が可能です。また、テスト結果をCSVファイルに出力して詳細な分析を行うことも容易です。

Discussion