k6の基本
はじめに
このページでは負荷試験ツールである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にはさまざまなオプションが用意されており、テストのシナリオやパラメータを細かく調整できます。
vus
とduration
1. -
vus
: 仮想ユーザーの数を指定します。 -
duration
: テストの継続時間を指定します。
export const options = {
vus: 50, // 50人の仮想ユーザー
duration: '1m', // 1分間テストを実行
};
Thresholds
の設定
2. 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ファイルには以下の項目が含まれます:
-
metric_name
: メトリクスの名前(例:http_req_duration
) -
timestamp
: タイムスタンプ(エポック形式) -
value
: メトリクスの値(例: リクエスト時間) -
tags
: テスト実行時のタグ情報(例:method=GET
) -
trend
: 値の種類(例:avg
- 平均値、p(90)
- 90パーセンタイル) -
iteration
: 現在のイテレーション番号 -
vu
: 仮想ユーザーのID(__VU
) -
status
: HTTPレスポンスのステータスコード -
url
: リクエストのURL -
リクエストの応答時間に関する項目
-
http_req_waiting
: サーバーがリクエストを処理するまでの時間(ミリ秒) -
http_req_connecting
: クライアントからサーバーへの接続が確立されるまでの時間(ミリ秒) -
http_req_receiving
: レスポンスデータを受信するまでの時間(ミリ秒) -
http_req_sending
: リクエストデータが送信されるまでの時間(ミリ秒) -
http_req_duration
: 全体のリクエスト持続時間(送信、接続、待機を含む)
-
詳細な出力のカスタマイズ方法については、k6の結果出力に関する公式ドキュメントを参照してください。
まとめ
k6は、柔軟で強力な負荷試験ツールであり、さまざまなオプションと設定によって、リアルなユーザー負荷をシミュレートできます。Thresholds
によるテスト基準の設定や、group
と__VU
を用いた詳細なシナリオ作成が可能です。また、テスト結果をCSVファイルに出力して詳細な分析を行うことも容易です。
Discussion