mablでデータ駆動テストを実装する #mabljapan

データ駆動テスト(Data-driven testing)は Parameterized testingやTable-driven testingとも呼ばれる方法です。mablではテストデータを活用したテストをデータ駆動テストと呼んでいます。今回はDatatableを使ったテストの紹介です。

データ駆動テストの動きとその恩恵

データ駆動テストは以下のような動きをします。

  1. データソースからテストデータを取り出します
  2. アプリケーションのフォームに取り出したデータを入力します
  3. 実行結果を予測していた結果と比較して確認します
  4. 次に使いたい入力データをつかってテストを繰り返し実行します

データ駆動テストからは様々な恩恵を受けられます。

  • 再利用性: どんなテストでも、何回でも、異なった入力値を使ってテスト実行できます
  • 多重性: データ駆動テストは通常ひとつのケースやその実行で使いますが、データを変えることで様々なバリエーションのテストケース実行ができるようになります
  • 効率性: データ駆動テストは、少ないコードでたくさんのケースを生成できます
  • ロジックの分離: テストケースのロジックと実際のテストデータを明確に分離できます
  • テストカバレッジの向上: 継続的に入力データを増やしていくことで、テストの網羅性も高めていけます

データテーブル(DataTable)の作成

データテーブルはConfiguration > DataTablesから作成します。CSVをアップロードしたり、スプレッドシートやエクセルからコピーして作ることもできます。

ここでは、ログイン画面で使うEメールアドレス、パスワードをデータとして定義しました。それぞれ「ログイン成功」と「ログイン失敗」というシナリオを想定しています。

データテーブルの設定

データテーブルを読み込む方法はいくつかあります。まず、テストを作成する際に上記のようにデータテーブルを設定できます。データテーブルは複数設定可能です。

データテーブルがテストに紐付いている場合、上記のようにPlanのStage設定に表記されます。右上の鉛筆マークをクリックし・・・

データテーブルを設定も可能だし・・・

上記のように「Ignore DataTables」を選べば、特定のPlanでデータテーブルをはずして実行も可能です。

データテーブルの利用

テストにデータテーブルを設定すると自動的にデータが読み込まれます。変数({x}) > Viewを開くと上記のようにemailとpasswordが読み込まれているのがわかるはずです。

データテーブルの初期値(デフォルト値)は、トレーナーの変数({x}) > Createから設定します。DetaTableではなく「Data source」を選択するのがポイントです。

変数({x}) > Viewを開くと、Data-driven scenarioに変数が追加されているのがわかります。データもデフォルト値になっています。

テストの詳細画面を見てみます。Data-driven variablesにデフォルト値の設定が入っていました。またDataTablesに上記のようなメッセージが表示されています。

データテーブルにない変数(Column)が追加されています。テスト実行するとデフォルト値(ここではadmin)が全テスト実行で使われます。

つまり、このRole変数やそのデフォルト値の設定はConfiguration > DataTablesに保存されません

さらに、変数のManageを開いてみましょう。デフォルト値が「Default value」とだけ表示されています。emailとpassword にはデータテーブル1行目のデータが入っていますが、デフォルト値をここから設定することも可能です。

データテーブルはその列データで変数を自動的に作成し、行ごとのデータを上書きしていきます。もし、特定の列データが設定されていない場合は、デフォルト値が設定されていればそれが使われます。

ちょっとややこしいですが、データの一元管理を考えると、全データはデータテーブルで管理すべきでしょう。さらにデフォルト値がある場合は、上記のように設定するのも手ですが、データテーブル内で指定すればわかりやすそうです。

取得したデータは様々な場所で利用可能です。

  • アサーションでの利用
  • 今回のように入力値として利用
  • 遷移先のURLとして利用
  • 他の変数を生成する時に利用
  • カスタムJavascriptで利用

データテーブルのシナリオ名

データテーブルでテスト実行すると、どれがどのシナリオかわからなくなるため、上記のように「Invalid case data-driven variables」とシナリオ名を表示してくれます。

データテーブルで乱数を設定する

データテーブルでは乱数も設定可能です。

まとめ

データテーブルで網羅性を高めるのは利点ですが、実行回数が増えるという欠点もあります。データテーブルを使うと実行回数が劇的に増加します。例えば以下のケースで考えてみましょう。

  • テストは3ケース
    • ケースA: データテーブルなし
    • ケースB: データテーブルあり(7行)
    • ケースC: データテーブルあり(11行)
  • ブラウザはChromeとFirefoxの2つ

実行回数は (1+7+11) x 2 = 38 となり、1回の実行で38 test runになります。mablは実行回数ベースの金額設定なのでご利用は計画的に。

また、テストで共通して使うデータをテーブルに1行で設定すれば、変数を完結に管理できます。ただし、やりすぎるとたくさんのデータテーブルができてしまい管理が煩雑になるため注意が必要です。