手軽に負荷テストができるツール「Taurus」がスゴい
はじめに
TaurusはBlazeMeter社が公開しているテスト自動化を支援するツールです。
JmeterやGatlingといった負荷ツールが持つ複雑さや難しさを排除することをコンセプトに作られたイケてるOSSだと思います。
今回はそんなTaurusの特徴やメリットを紹介しようと思います。
ちなみに...
発音は「タウロス」だと思ってましたが、動画を見る限り「トーラス」みたいです。
(アイコン的にはケンタウロスを連想したんですけど、おうし座って意味らしいです)
Taurusの特徴
DSLによるシンプルな記述
負荷テストのシナリオは以下のようなYAML(またはJSON)で表現することができます。
execution:
- concurrency: 100
ramp-up: 1m
hold-for: 5m
scenario: quick-test
scenarios:
quick-test:
requests:
- http://blazedemo.com
たったこれだけの記載で、
「ランプアップ 1分」「試験時間 5分」「同時接続数 100」「接続先 blazedemo.com」
のシナリオが完成します。
つまり、わざわざJmeterをインストールしたり、キャプチャをとったり、GUIから編集したりといった作業が不要なんですね。
また、Jmeterのバージョンやログ設定など、ツール自体の設定管理も可能です。
modules:
jmeter:
version: 5.4.1 # ここに書いてあるバージョンを勝手にダウンロードしてくれる
properties:
log_level.JMeter: WARN
log_level.JMeter.threads: WARN
system-properties:
org.apache.commons.logging.simplelog.log.org.apache.http: WARN
既存ツールのラッパーとして動作
デフォルトでは内部的にJmeterが実行されますが、以下のようなツールで作成されたスクリプトを流用することが可能です。
- JMeter
- Gatling
- Locust
- Selenium
- Vegeta
つまり、さきほどはYAMLでシナリオが記述可能とは言いましたが、もちろん既存のスクリプトを流用できるってことです。
いままで作り上げてきたスクリプトやテストコードを手放す必要がないのは大きなメリットだと思います。
レポーティング機能
Taurusを実行すると、コンソール上でリアルタイムに実行中のシナリオに関する
- ユーザ数
- レイテンシー
- エラー率
などをモニタリングすることができます。
また、-report
オプションをつけて実行すれば、自動的にブラウザが立ち上がり、よりリッチなレポートをリアルタイムに参照することも可能です。
Taurusが解決すること
上記の特徴があると何がすごいの?っと直感的には分からないポイントもあるかと思います。
Taurusが解決しようとしている課題を、自分が利用してみた所感も含めてご紹介します。
リアルタイムレポート
JmeterやGatlingでもレポート作成機能は提供されいますが、基本的には実行終了後のログから生成されるものです。
(Jmeterでもサンプラーの追加でモニタリング可能ですが、設定がめんどくさいのと動作が重いようです)
つまり、1時間の試験を流した後で、「期待通り負荷が上がってない」「実は最初からエラーがでてた」なんてことも。
そこで、軽量なリアルタイムレポートの仕組みを利用することで、「この試験はダメだ」と思えばすぐに停止することが可能です。
テストの動向を常に監視して結果効率があがる、そんな仕組みが標準搭載のツール。
それがTaurusです。
スクリプト作成に対する自由度
Jmeterで利用されるJMXは、
- GUIからしか編集できない
- 可読性がかなり低い
- ファイルのDiffが取りづらい
といったクセがあります。
従って、Gitで管理してPull Requestでコードレビューしよう、みたいな運用は実質不可能なので、チームでの運用に難がありそうです。
「じゃあJmeterを捨てて、GatlingやLocustに乗り換えよう」というのも学習コストがかなり高く、ハードルは高いと思います。
そこで、Taurus上でJmeterを使用する方法は以下のようなアプローチが用意されています。
- YAMLやJSONからスクラッチで作成
- 既存のJMXをYAMLにコンバート
- 既存のJMXを利用しつつ、一部のパラメータをYAMLやJSONで上書き
- 既存のJMXをそのまま利用
Jmeterで苦労していた人も、Jmeterを全く知らない人も、どうぞTarusを使ってください、というスタンスが最高です。
実行環境の再現性
負荷テストを実行するといっても、以下のようにばらつきが生じることも多いと思います。
- シナリオを準備する環境 (Windows)
- 実際にテストを実行する環境 (Ubuntu EC2)
- 自動化環境(Jenkins)
- 他のチームメンバーの環境 (Mac)
その場合、Jmeterセットアップの手順書を各OSごとに用意したり、バージョンを統一したりと無駄なタスクが増えてしまいます。
Jmeterだけならまだしも、プラグインやJVMやWebDriverなども対象となると、それらの管理コストは爆上がりです。
そこでTaurusを使えば、Jmeterやプラグインは実行前に勝手にダウンロードしてくれます。
つまり、誰でもどこでも同じ実行環境が用意できるってことです。しかもお手軽に。
また、公式でDocker Imageも提供されているため、限りなく同じ環境が再現可能です。
docker run -it --rm -v /tmp/my-test:/bzt-configs blazemeter/taurus my-config.yml
いろんな実行方法
Taurusには様々なユースケースがありますが、実際の実行例をご紹介します。
YAMLファイルを指定
bzt quick_test.yml
指定されたYAMLファイル内でシナリオが定義されている必要があります。
JMXファイルを指定
bzt jmeter.jxm
既存のJMXファイルをそのまま指定することが可能です。
コマンドオプションによる上書き
bzt -o scenarios.sample.data-sources.0=data.csv config.yaml
シナリオファイルの一部を書き換えることが可能です。
Aliasの指定
cli-aliases:
scenario1:
scenarios:
my-scen:
script: jmx1.jmx
scenario2:
scenarios:
my-scen:
script: jmx2.jmx
bzt scenario.yaml -scenario1
コマンドラインからどのシナリオを実行するか選択することが可能です。
まとめ
- いままでJmeterで疲弊していた人
- Jmeterが難しそうで一歩踏み出せなかった人
- GatlingやLocustを使っている人
- 負荷テストをはじめようと検討している人
どんな人でもまず
pip install bzt
をしてみれば良いんじゃない?と思えるようなツールなので、興味があれば使ってみてください。
Discussion
まとめに記載がある枠組みでいうと「Jmeterが難しそうで一歩踏み出せなかった人」です。
2点質問があり伺いたいのですが、
①基本的には、インストールした環境下でYAMLファイルを指定してあげれば、テストを実施できるという認識で大丈夫でしょうか・・?
②今回アクセス先は、blazedemo.comとされていますが、オンプレのサーバ等にテストを実施する場合、IPアドレスを指定してあげればよいのでしょうか・・?
無知でyoutubeなどを調べてみたのですが、参考資料がなく教えていただけるととても助かります。
@Qoo321111 さん
はい、pipまたはbrew経由でインストールした環境下において、YAMLファイルを指定するだけで実行可能です。
http以外のプロトコルでは検証したことがないのですが、httpであれば
http://<IPアドレス>:<ポート番号>/
といった形でアクセス先を指定することが可能です。