きちんと準備しなきゃ機能テストツールを使ったってテスト自動化は楽になりませんよ

Javaで作られたWebアプリケーションをテストする際に、MVCモデルで言うところの、「M」部分はJUnitでテストクラスを作成して、継続的にテストし続けると幸せになれるよ、というのは一般的になってきていると思います。

「V」「C」部分もMockフレームワークを使用することである程度テストクラスは書けますが、結局ブラウザからの打鍵でやらないと最終的に確認できないことが多いわけです。

ブラウザからの打鍵テストを手動で実施する場合、画面に変更がある度に実施しなければならないことから非常に効率が悪く思われがちです。ある機能を変更した際に、他の機能にも影響を及ぼしていないかを確認する回帰テストだって、そのシステムで取りうる全てのパターンを手動でテストするには手間がかかりすぎますし、不毛な作業のように思われます。というわけで、影響がありそうな箇所を経験と感で洗い出してテストするのですが、洗い出し項目や確認事項自体に漏れがあり、以降のテストやリリース後にデグレが発見されてしまった際には、「影響ありそうなところはテストしてたんですけどね」という言い訳は通用しないでしょう。*1


テスト仕様書を見なくても体が覚えているくらい同じテストを行っていると、モチベーションも下がる一方。「自分は機械じゃないんだけどな」と思うようになります。「こんなことPCに任せられないのかな」とも思うようになります。そんな悩みを持つ人が多かったのでしょうか、世の中にはこの辺りの単純作業を軽減してくれる「機能テストツール(キャプチャ/リプレイツール)」なるものが存在します。平たく言えば、一度Webブラウザに対して手動で行った操作を記録し、後は記録した通りに実行してくれるテストツールです。


また、

  • xUnitを導入しようにもいまいちテストしづらいフレームワークを使用しているシステム
  • 工数が不足していて、xUnitを導入できなかったシステム

ような開発に携わっている人たちなどは、「xUnitの代わりに機能テストツール使えばCIできるんじゃね?」という「一発逆転」を夢見てしまうことが多いのではないでしょうか?

ですが、「1回の手動操作で後は自動的にテストし続けてくれる」ことを実現するには超えなければならないハードルがあるのです。

機能テストツールの現実

一般的にテストというものは、

  1. 事前データ準備
  2. テストケース実行
  3. 結果の検証

を繰り返すものです。xUnitを使用しようが、機能テストツールを使用しようが、手動で頑張ろうが同じことをするはずです。そして、継続してテストを行い続ける為には、いつ、いかなる時でも同じ結果を返せるようにならなければいけません。


機能テストを実行する時には

  1. テストシナリオの設計&検証内容の定義
  2. テストシナリオが動作するデータ準備
  3. テストシナリオの実行
  4. テストシナリオの結果検証

の手順で行います。機能テストツールを使用しても、上記全てやってくれるわけではありません。(テストシナリオを1度記録させておく必要はありますが)3と4を繰り返し行う場合に威力を発揮します。結局、どのようなテストシナリオ/データが必要か設計することと、実際にテストデータを準備することはこちらで実施しなければならないのです。

例えば、ある画面機能のテストを行うときには、一連の画面操作の流れを考えながらテスト対象の画面にたどり着いていなければなりません。何はなくとも、テスト対象の画面にたどり着くまでのデータが無ければ、テストケースの実行すらできないのです。

データの準備のことを考えてみましょう。入力された検索条件を元に検索処理を行い、一覧表示し、指定行を選択した際に表示される詳細画面に対してテストしようとした場合、まずは一覧に表示されるような検索結果のデータをDBに格納しなければなりません。複数のテーブルを参照して一覧を作成するような複雑なSQLを発行している場合、参照するテーブル全てにデータが格納されていなければなりません。
さらにDBの値だけでなく、「システム日付/時刻」も意識しながらSQLを発行しているとしたら、『昨日までは一覧に結果が出てたけど今日は出なくなった』という事態になりかねません。動的に変わる要素(システム日付/時刻)も意識しながら『いつ実行しても同じ結果になるように事前データの値を準備する』にはとても骨が折れるのです。

このように、機能テストを自動で行うところの難しさは、処理を実行するのに外部要因が多すぎることにあります。単体テストレベルのパターンまで網羅しようと思ったら、これを解決しなければ十分なテストパターンが作れません。この作業は非常に時間のかかるものなので、単体テストをする時間が無かったプロジェクトにおいては、機能テストに必要なデータの準備においても時間が無くて中途半端に終わることが多いでしょう。

プロジェクトがどうにもならなくなってからツール導入したって、うまくいきませんよ。ツールは万能じゃないので、あまり過剰な期待は持たないほうが良いかと。

*1:下手すると、変更が発生する度に毎回手動で何千何百とあるテストケース全てを実施させられることになりかねません