Retty Tech Blog

実名口コミグルメサービスRettyのエンジニアによるTech Blogです。プロダクト開発にまつわるナレッジをアウトプットして、世の中がHappyになっていくようなコンテンツを発信します。

負荷テストフレームワークのTaurusはいいぞ

はじめに

RettyでtoB(飲食店)向けのWebエンジニアをしている渡辺です。 業務でTaurusという負荷テストフレームワークを使用したところかなり良かったので、熱く紹介します。

Taurusを使うと負荷試験結果がこんなにみやすく確認できます。やばくないですか?(語彙力)

コンソール上のレポート

Web上のレポート

※ この記事はRetty AdventCalendarPart2の9日目の記事です。

Taurusとは

Taurusのチュートリアルサイトでは以下のように紹介されています。

Taurus is an open source automation framework for running various open source load testing tools and functional testing tools. Taurus supports Apache JMeter, the most popular open source load testing tool, Selenium, Gatling, The Grinder, and others
出典:Introduction to Taurus

Taurusは、BlazeMeterが公開しているオープンソースのテスト自動化フレームワークです。 JSON または YAML でテストシナリオを定義でき、Apache JMeterSelenium、Gatling、The Grinderなどの他のテストツールをラッパーとして実行することができます。

Taurusはこんなところが良い

TaurusではYAMLでテストシナリオを定義できます。 まず、Taurusの公式ページにあるサンプルの設定ファイルを参考にして、YAMLファイルを作成します。

execution:
  concurrency: 100
  ramp-up: 1m
  hold-for: 5m
  scenario: quick-test

scenarios:
  quick-test:
    requests:
      - http://blazedemo.com

reporting:
  - module: console
  - module: blazemeter

CLIbzt example.yaml を実行するとApache JMeterが起動して先ほどのレポートが出力されます。

使ってみた感想としては、レポートがWebで見れるのでURLをチームに共有して簡単に確認できるのが便利でした。 いろいろなテストツールをサポートしているのも嬉しく、普段使っているテストツールの設定ファイルをTaurusで実行することでWeb上でレポートを出力して確認できると導入しやすいかなと感じました。
ただ、個人的には公式ドキュメントが少し読みづらかったです...

実際にインストールしてから負荷試験をするまでは以下で詳細に説明しようと思います。 これから負荷試験を行う方やTaurusが気になっていた方に参考になればと思います。

Taurusを使って負荷試験をするまで

インストール

インストール方法はTaurusのインストールページで各OS環境のインストール方法やDockerでの実行方法が確認できます。
私はMac OSで開発しているのでbrewコマンドでインストールしました。
brew install bzt

設定ファイルの準備

サンプルファイルをもとにYAMLでの設定ファイル作成を説明していきます。

execution:
  concurrency: 20
  ramp-up: 3m
  hold-for: 15m
  throughput: 15
  scenario: sample-request
scenarios:
  sample-request:
    requests:
    - http://blazedemo.com
reporting:
  - module: console
  - module: final-stats
  - module: blazemeter

最上位のキーは、execution、scenarios、reporting、settings、provisioningになります。

主要な実行設定のexecutionとscenarios、reportingについて説明していきます。
executionは、実行中に実行されるツール、使用するシナリオなどを宣言します。
利用可能な設定は以下です。

  • concurrency: 同時接続する仮想ユーザーの数
  • hold-for:設定した concurrency を保持する時間
  • ramp-up :設定した concurrency に達するまでの時間
  • iterations:シナリオの反復回数を制限する
  • throughput:最大秒間リクエストを制限する
  • scenario:実行するscenariosに設定されているシナリオ名

参考:Execution Settings

scenariosでは、APIリクエストの設定ができます。 API 呼び出し設定をrequestsキーで設定できます。
デフォルトでGETメソッドでの呼び出しになりますが、HTTPメソッドやリクエストヘッダー、リクエストボディの設定をする場合は以下のよう記述する必要があります。

scenarios:
  sample-post-request:
    requests:
      - url: https://api.example.com/stocks/GetReservableDateTime
        method: POST
        headers:
          Content-Type: application/json
          Authorization: <type> <credentials>
        body:
          restaurant_id: 1

reportingは、レポートの出力設定です。
console: 実行中の性能統計データをリアルタイムでコンソールに表示する
final-stats: サマリを表示する
blazemeter: オンラインレポートを作成する

参考:Generating Test Reports

リクエストボディやURL、クエリ文字列をランダムに変更して負荷をかけたい場合があると思います。 その場合、以下のように properties を指定してJMeterのランダム関数 ${__Random()} を使用しました。

scenarios:
  sample-post-request:
    requests:
      - url: https://api.example.com/stocks/GetReservableDateTime
        method: POST
        headers:
          Content-Type: application/json
        body:
          restaurant_id: ${__P(restaurant_id_${__Random(1,5)})}
    properties:
      restaurant_id:
      restaurant_id_1: 1111
      restaurant_id_2: 1112
      restaurant_id_3: 1113
      restaurant_id_4: 1114
      restaurant_id_5: 1115

確認できていないですが、デフォルトで実行するテストツールがApache JMeterだったのでJMXファイルの記法が使えたのかもです。 実行するテストツールはsettingsのdefault-executorキーで指定できます

settings:
  default-executor: gatling

参考:Execution Settings

実行

YAMLファイルを指定した実行
bzt example.yaml

Apache JMeterJMXファイルを指定した実行
bzt example.jmx

コマンドラインによる上書き実行
bzt -o scenario.sample.data-sources.0=data.csv config.yaml
参考:Command-Line Tool

実行結果レポート

Taurusの公式ページのサンプル設定ファイルquick_test.ymlに以下のレポート出力設定をして説明します。

execution:
  concurrency: 100
  ramp-up: 1m
  hold-for: 5m
  scenario: quick-test

scenarios:
  quick-test:
    requests:
      - http://blazedemo.com

reporting:
  - module: console # 実行中の性能統計データをリアルタイムでコンソールに表示する
  - module: blazemeter # オンラインレポートを作成

Console Reporter

実行中の性能統計データがリアルタイムでコンソールに表示されるため、エラーが多発する場合やうまく負荷がかかっていない場合にすぐにテストを止めて原因調査することができます。 reportingキーに module: consoleを指定すると設定できます。

reporting:
  - module: console

Blaze Meter Reporter

Web上でより見やすい状態で実行結果のレポートが出力されます。そして、URLを共有することで簡単に実行結果を共有できます。
無料で使うことができて、Taurusのアカウントを作成していればそのアカウントに紐付けて管理できます。
アカウントがなくとも使用することができますが、その場合はURLの有効期限は7日間になります。
reportingキーに module: blazemeterを指定すると設定できます。

reporting:
  - module: blazemeter

参考:BlazeMeter Reporting Service

参考文献

https://gettaurus.org/

zenn.dev

qiita.com