🍣

キーワード駆動っぽいテストができるツールを開発した話

2022/09/07に公開

Keydriver

今回開発したツールは以下です。

https://github.com/eyasuyuki/keydriver

そもそもキーワード駆動テストとは

キーワード駆動テストとはシステムテストの技法の一つで、アクションキーワードとデータからなる表を書いて行うテストのことです。例えばこんな表を記述します。

No キーワード データ1 データ2 備考
1 open url[https://www.google.com] URLをブラウズする
2 input テキストボックス サルゲッチュ テキストボックスへの入力
3 click ボタン[Google 検索] ボタンをクリックする
4 assert タイトル is[サルゲッチュ - Google 検索] 検索結果ページのタイトル検証

openとかinputとかclickとかassertがキーワード(アクション)、urlや画面要素名、テキストや検証用の式がデータです。

これらキーワード表から実際のHTML要素に変換してWebDriverを動かすドライバーを書けばキーワード駆動テストが自動化できるわけです。

キーワード駆動テストについては以下の書籍で知りました。

キーワード駆動テストのメリット

一般的に言われているキーワード駆動テストのメリットは以下です。

  • データ駆動テストと比較して、データだけでなくテストに必要な情報を全て表形式にしているので一覧性が良くメンテナンスも容易
  • キャプチャー・リプレイ型のシステムテストの自動化と比べメンテナンス性に優れている

データ駆動テストとはテストデータの一覧を読み込んでシステムテストを自動化します。データ表にはアクションキーワードは含まれません。

キャプチャー・リプレイ型とは例えばSelenium IDEを使って、ユーザーの操作を記録して再現する自動テストのことです。これのデメリットは画面を変更したら再現性がなくなることです。

それに対してキーワード駆動テストはテストに必要な情報がキーワード表にまとめられているのでデータ駆動テストやキャプチャー・リプレイテストよりも優れているとされています。(前述書より)

上記以外に、筆者が考えるキーワード駆動テストのメリットは以下です。

  • テストに必要な全てが人間可読なキーワード表にまとめられるため、システムテスト記述の標準化に役立つ

システムテスト仕様書はSIer各社の秘伝のタレと化して仕様がまちまちになりがちですが、キーワード表の形式で統一するのはたいへんなメリットだと思っています。

https://twitter.com/eyasuyuki/status/1562708740243337216

キーワード駆動テストのダメな点

  • ドライバーを書くのが面倒
  • ドライバーのメンテナンスが大変

キーワード駆動テストの自動化の要はキーワード表と実際の画面をつなぐ存在であるドライバーですが、そのドライバーを記述するのは容易ではありません。また、ドライバーはキーワード表と別々に管理されるためそのメンテナンスは大変です。

ではどうしたら良いか?

これを頓知で解決しようとした試みがKeydriverなのです。

キーワード表を頓知で改良する

ドライバーのメンテナンスが大変なら、キーワード表の外側にドライバー相当の情報をくっつけてしまったらどうだろう? というのが今回の試みです。いわば頓知のようなアイデアです。

前掲のキーワード表は以下の形式に拡張されます。

No キーワード データ1 データ2 備考 拡張1 拡張2
1 open url[https://www.google.com] URLをブラウズする
2 input テキストボックス サルゲッチュ テキストボックスへの入力 name[q]
3 click ボタン[Google 検索] ボタンをクリックする name[btnK]
4 assert タイトル is[サルゲッチュ - Google 検索] 検索結果ページのタイトル検証 xpath[/html/head/title]

画面を変更したとしてもキーワード表の部分はメンテナンスが必要なく、拡張した画面依存の部分だけを変更すれば済みます。

idやnameやxpathで画面要素を特定します。name属性で特定した画面要素は最初の1つだけが使われます。

記述方式は以下の形式を採用しています。

tag[value]

画面要素の属性値やxpathは、ブラウザの開発者ツールを使えば容易に取得できます。

この頓知により拡張キーワード表さえ記述すればドライバーがなくても自動テストが実現できます。

属性値に対応しました(2022/09/10追記)

tag[value#attribute]

上記の形式で属性値に対応しました。(区切り文字の#は設定で変更できます)

ex.

id[save_button#enabled]

例えば上記の例ではボタンのenabled属性値のテストができます。

属性値を省略した場合のデフォルト値はinnerTextです。

displayed, enabled, selectedは特別な属性値です。これらの値はSeleniumのWebElement#getAttributeでは取得できないので内部ではそれぞれisDisplayed, isEnabled, isSelectedを呼び出しています。

テスト結果を出力できるようになりました(2022/10/12追記)

テスト結果をExcel表として出力できるようになりました。

既存のキーワード駆動テストフレームワーク

既存のキーワード駆動テストフレームワークには以下のような実装があります。

これらは機能が多すぎて、筆者のやりたい目的には過剰な道具でした。でも大いに参考にさせてもらいました。

改良のための意見をください

まだまだ機能が足りないツールですが、改良のための意見やプルリクエストをお待ちしております。

例えばこんなキーワードが足りないとか、テスト結果はこういうフォーマットにしろとか。

GitHubでお待ちしています。

https://github.com/eyasuyuki/keydriver

GitHubで編集を提案

Discussion