モダンな負荷テストツールのk6を試してみた

負荷テストツールのk6を試す機会があったのでアウトプットしていく。

k6.io

k6は負荷テストサービスを提供するloadimpact社が開発する負荷テストツールでツール自体はgoでテストケースはES6で書く。

レポート出力はInfluxDB+Grafanaまたはloadimpact Insightsと連携する。連携方法はテスト実行時のコマンドにDB URLやTokenを加えるだけのシンプルな設計。

最近はgRPC通信の採用も増えているが今のところk6ではサポートされていない。ただ負荷テストサービスを提供するloadimpact社なので今後のサポートに期待できる。オープンソースだしgoだし自分で作りたい欲も出てくるのがモダンなk6の良いところ。

今回のエントリは簡易的なAPIサーバに負荷テストを実行するまでの流れをコードを交えてまとめていく。

k6をdockerで動かす

サクッと試せる環境を作りたかったのでAPIサーバとk6のコンテナをdocker-composeで構成管理した。k6はイメージが提供されているので簡単に動かせる。

docker pull loadimpact/k6

テストシナリオを書く

テストシナリオはEC6で書く。馴染みがあるJavascriptでシナリオを書けるのが良い。

テストシナリオの書き方で理解したかったのが次の2点。

上記、githubのリンクにあるとおり難しくなくドキュメントやサンプルも豊富ですぐに理解できた。

また、checkgroupthresholdsはテストシナリオを書く上で重要な要素となる。勿論、その他にも理解すべき要素はある。ドキュメントが豊富なので触っていきながら理解を深めていきたい。

docs.k6.io

k6 runオプションを理解する

テストの実行はk6 runのコマンドを実行する。どれくらいのユーザをアクセスさせるか、どれくらいテストを続けるかのオプションを理解する必要がある。今回使ったオプションは次の通り。

  • vus 同時接続ユーザ数の理解で良さそう。
  • iterations テストの実行回数。
k6 run --vus 5 --iterations 5 ./scripts/localhost.js

上記のコマンドだと5ユーザがアクセスしてテスト回数が5回行われる。iterationsは5ユーザが5回テストを実行するのではなく、全体のテスト回数が5回となる。そのため5ユーザが1回テストを実行するコマンドとなる。

またdurationstageも利用頻度が高いオプションになる。durationはテスト実行期間を指定できる、stageはJmeterのramp upのようなオプションである。

docs.k6.io

テスト結果をグラフに出力してみた

loadimpact Insightsにテスト結果を出力してみた。

docs.k6.io

連携方法もシンプル。loadimpact.comのアカウントをつくりダッシュボードからCLOUDトークンを発行してrunオプションに加えるだけである。連携した結果のイメージは次のとおり。

f:id:n_soushi:20171111221320p:plain

vusの数やテストシナリオの数でアカウントのグレードが異なり有料オプションとなる。継続的に負荷テストを実行するのであれば有料オプションを選択することを検討するのもありだし、InfluxDB+Grafanaの連携方法もある。標準のstdoutからもテスト結果は確認できるので、どのように負荷テストを運用するかでレポート運用方法の選択肢はこちらに委ねられている印象。

docs.k6.io

サクッと動かせるコードあります

githubに動かせるコードを置いたので興味ある人は参照ください。

github.com