ブログ
負荷テストツール『k6』の使い方
『k6』とは、JavaScriptでテストシナリオが記述できる、オープンソースの負荷テストツールです。
今回はk6の導入からテストの作成・実行手順のほか、テスト結果を見やすくする方法をご紹介します!
k6の使い方
k6は、Grafana Labs社が開発している負荷テストツールです。
JavaScriptで記述できるため導入ハードルが低いこと、インストールから実行までの流れがシンプルなこと、動作が軽量かつ高速なことが特徴です。
クラウド上からテストの実行が可能な『Grafana Cloud k6』というサービスもありますが、今回はローカル上での実行手順についてご説明します!
導入方法
公式ドキュメント(Install k6)に、各OSごとのインストール方法が記載されています。
macOSの場合、Homebrewからインストールが可能です。インストール後、k6 version のコマンドでバージョン情報が表示されれば導入完了です👍
% brew install k6
% k6 version
k6 v1.7.1テスト作成方法
k6 new ファイル名 コマンドで、サンプルコード付きのテストファイルが作成できます。
% k6 new k6test.js
New script created: k6test.js (minimal template).デフォルトのサンプルコードは「ピザ屋のデモサイトにアクセスし続ける負荷テスト」となっています🍕
import http from 'k6/http';
import { sleep, check } from 'k6';
export const options = {
vus: 10,
duration: '30s',
};
export default function() {
let res = http.get('https://quickpizza.grafana.com');
check(res, { "status is 200": (res) => res.status === 200 });
sleep(1);
}コード内の設定値やテスト内容の詳細は以下の通りです。
- 設定値(
options)vus:仮想ユーザー(Virtual Users)数の指定。サンプルのvus: 10は「同時に10人がアクセスする」設定duration:テスト実施時間の指定。サンプルのduration: '30s'は「30秒間テストをする」設定
- テスト内容(
default function)http.get:指定のURLにGETメソッドでアクセスするcheck:ステータスコードが200(成功レスポンス)であることを確認するsleep(1):次回アクセスまで1秒待機する
まとめると、「30秒間、10人のユーザーが、1秒おきにサイトにアクセスし続ける」といった内容の負荷テストになっています。URL・vus ・duration の設定を変更するだけでも、ある程度の負荷テストが可能な、使い勝手の良いコードだと思います!
テスト実行方法
k6 run ファイル名 コマンドで、テストを実行します。
実行後にテスト結果が表示されます。下記の例では、約30秒間で240回のアクセスに成功しています(checks_succeeded)。このように、人力では再現できない規模の負荷テストを、簡単に作成&実行することができます🎉
テスト結果の中で注目すべき点
- 失敗数・失敗率(
http_req_failed/checks_failed)
失敗数・失敗率が0以外の場合(0を超えている場合)、タイムアウトやサーバーの処理落ちが発生している可能性があります。ここがカウントされていると、負荷がかかりすぎてるのかも…? - レスポンスタイム(
http_req_duration)
「平均(avg)」のほか、「P95(データの中で最も遅い(最も待たされた)5%の値)」に注目します。ここの値がavgより遅すぎると、負荷がかかりすぎてるのかも…?
% k6 run k6test/k6test.js
/\ Grafana /‾‾/
/\ / \ |\ __ / /
/ \/ \ | |/ / / ‾‾\
/ \ | ( | (‾) |
/ __________ \ |_|\_\ \_____/
execution: local
script: k6test.js
output: -
scenarios: (100.00%) 1 scenario, 10 max VUs, 1m0s max duration (incl. graceful stop):
* default: 10 looping VUs for 30s (gracefulStop: 30s)
█ TOTAL RESULTS
checks_total.......: 240 7.850217/s
checks_succeeded...: 100.00% 240 out of 240
checks_failed......: 0.00% 0 out of 240
✓ status is 200
HTTP
http_req_duration..............: avg=235.14ms min=175.58ms med=215.33ms max=581.37ms p(90)=271.63ms p(95)=461.14ms
{ expected_response:true }...: avg=235.14ms min=175.58ms med=215.33ms max=581.37ms p(90)=271.63ms p(95)=461.14ms
http_req_failed................: 0.00% 0 out of 240
http_reqs......................: 240 7.850217/s
~~ 一部省略 ~~
running (0m30.6s), 00/10 VUs, 240 complete and 0 interrupted iterations
default ✓ [======================================] 10 VUs 30sおまけ:テスト結果をより見やすくする方法
テスト結果について、デフォルトではターミナルにテキスト出力されますが、「k6-reporter」を利用することで、HTMLファイルとして出力してくれます!
k6-reporterを使うには、テストコード内に以下の設定を追記します。
import { htmlReport } from 'https://raw.githubusercontent.com/benc-uk/k6-reporter/latest/dist/bundle.js'
export function handleSummary(data) {
return {
'summary.html': htmlReport(data),
}
}上記を記述してk6 runを実行すると、同ディレクトリ内にHTMLファイルが作られます。標準のテキスト出力でも事足りるとは思いますが、より見やすく!そしてより目も泳がなくなるので😂、個人的にはおすすめです!

おわりに
今回は、簡単に負荷テストが実行できる『k6』をご紹介しました。
JavaScriptはよく分からない…という方でも、公式のメソッドをコピーして数値を変えるだけで、簡単に実用的なテストコードが作成できます!導入から実行にいたるまでのコストが低めなツールなので、興味のある方はぜひ一度試してみてください!
ちなみに実際の環境で負荷テストをする際、テストのoptionsについては、まずは小さめの数値を指定して徐々に上げていくスタイルが、心臓に優しくて良いかと思います…👍
株式会社ウイングドアは福岡のシステム開発会社です。
現在、私達と一緒に"楽しく仕事が出来る仲間"として、新卒・中途採用を絶賛募集しています!
ウイングドアの仲間達となら楽しく仕事できるかも?と興味をもった方、
お気軽にお問い合わせ下さい!