アプリ開発やサイト制作のスマホ端末実機検証・テスト-Remote TestKit

テスト自動化の基本原則

自動テストと手動テストとの違いを正しく理解し、どういったテストを自動化すると効果的か、どういうふうに導入していけばよいかを学習します。

自動テストへの誤った認識

現在のソフトウエア開発において、自動テストを上手に活用できるかどうかは、プロジェクト生産性を左右します。つまり、どれだけ上手に自動テストを活用できるかが、開発組織としての競合力に直結するのです。

しかしながら、自動テストという言葉が独り歩きして、まるでテストにおける「銀の弾丸」かのように思われている場合も見受けられます。

自動テストは、本当にテストにおける「銀の弾丸」でしょうか? 自動テストについて、よくある勘違いや間違いとして以下のような例があります。

  • すべてのテストを自動テストで実施することができる。
  • 自動テストを導入することで、テストにかかるコストが削減される。
  • 人手でテストを行うより、早くテストができる。

この認識は本当に正しいでしょうか?

ある特定の状況においては、成り立つケースも存在すると思いますが、一般的なシステム開発においては、上記のようなことがすべて成り立つケースはほとんどありません。 逆に、無理矢理自動テストを行うよりも、手動でテストを行ったほうが効率よくできるテストも多数存在します。

また、よくある間違った例として、今まで手動で行ってきたテストケースを、そのまま自動テストに置き換えようとしている場合があります。新しくテストツールを導入するときにそういうケースが多いのではないでしょうか?

しかし、本当にそんなことができるのでしょうか?

手動から自動への直接変換は、多くの場合に、どこかに無理が生じてしまい、最終的に自動テストは使えない、という結論に陥る危険性があります。

どうしてこういうことが起こるのでしょうか?

それは、自動テストと今まで人手で行ってきた手動テストの違いを、正しく把握していないために発生していると言えるでしょう。

手動テストと自動テストは何が違うのか?

自動テストと手動テストの根本的な違い

自動テストと手動テストは何が違うのでしょうか?

自動テストと一般に呼びますが、何もないところから、勝手に自動的にテストができるようになるのではないことはご存知だと思います。 当然、テストケースを設計し、それを自動テストの形で実装して、初めて自動テストが実行できるようになります。 そして、自動テストを実装するということは、多かれ少なかれプログラムもしくはスクリプトなどを記述する必要があります。同時に、入力と期待値をちゃんと定義できなければ、実行結果が正しいかどうかをコンピュータが判断することはできません。

注:モデルベースドテストでは、システムの振る舞いを定義することで自動的にテストの実行を可能としますが、振る舞い自体は人間が正しく記述する必要があります。

自動テストの実現には、さまざまなフレームワークやテストツールを使用するかと思います。それは、これらのフレームワークやテストツールの対応していない入力形式や、出力結果取得方法が、自動的にテストをすることができないということを意味しています。これが、人手によるテストと決定的に異なる点です。

人間がテストするのであれば、自分の手を使って入力し、出力された結果を自分の目で見て、判断することができます。

例えば、プリンターの出力結果が正しいことを自動的にテストするにはどうすればよいでしょう? プリントアウトされた結果を、カメラを使い画像処理をすれば、理屈ではできるかもしれませんが、本当にそれがベストの解でしょうか? プリンターのトレイからカメラの前までプリントアウトされた紙をどうやって運びますか? 明らかに、人間がトレイからプリントアウトされた紙を取ってきて目視チェックしたほうが早いのではないでしょうか?

注:出力結果のチェックする回数が多くなると、何らかの方法で、自動化するメリットが出る場合もあります。

そして、手動テストでは、対象システムに関する知識があるために、チェック項目以外に暗黙的に確認している項目がありますが、自動テストでは、チェック項目以外に間違いがあってもわかりません。 つまり、自動テストでは、手作業によるテストとは違って、暗黙知を用いたテストは一切行われないということです。指示されたコンピュータが認識できるチェック項目が、期待値と同じかどうかのみをテストすることになります。

手動テスト・自動テストの特徴

また、もう一つ人手動と自動のテストには根本的に違うことがあります。

人手によるテストでは、どんなに注意してテストを行っても、ヒューマンエラーが発生する可能性があります。ヒューマンエラーを少なくするためには、どうしても、一人あたりのテストの実施時間を集中力の持続する時間内に制限する必要があります。このため、一定期間あたりにできるテストの量には制限が付きます。同時に、システムに対してある程度以上の知識を持っていないと、テストを正しく行うこともできません。このため、やみくもに人を投入して、単位時間当たりのテスト消化数を増やすのは限界があります。

これに対して、自動テストはコンピュータが行います。コンピュータは、あらかじめ決められた動作を何度でも間違えずに繰り返してくれます。また、24時間休みなしでも、エラーを起こすことはありません。さらに、自動化ができているのですから、同じ環境を用意して並列にコンピュータを稼働させれば、用意したコンピュータの数だけ、単位時間当たりのテスト消化数は増大します。

これが、自動テストと手動テストの根本的な違いの二つ目です。

自動テストで効果の上がるテスト

自動テストと手動テストの根本的な違いをちゃんと考えると、おのずと自動で行うべきテストと、手動で行うべきテストは分かれてくるのではないでしょうか?

  • 自動テストとしてテストを実行するためには、対象プログラムに対して、フレームワークやツールを通して、
    入力データを投入でき、プログラムの処理を実行させ、その結果を取得することができること。
  • 同じ入力データを投入した場合には、必ず、結果が一意になること。
  • 当然ですが、入力に対する期待値は明確に定義されること。

この条件が満たされるならば、自動テスト化することは可能です。

とはいえ、自動化するために、スクリプトやプログラムの作成は必要なわけですから、その工数を無視して、可能なものをむやみやたらと自動化することは得策ではありません。同時に、テスト対象に変更が発生した場合には、自動化のためのスクリプトやプログラムの修正も必要になることも考慮する必要があります。そう考えた場合に、自動化すると効果が上がるテストはどういうテストでしょうか?

自動テストと手動テストの根本的な違いの2つ目を思い出してください。
自動テストは、単調で、同じようなテストの繰り返しであっても、文句を言わずに黙々とかつ、確実に繰り返して実行してくれます。また、適切なツールと手法を選択すれば、人間が手作業するより、短い時間で一回のテストを実行することも可能です。

このことから言えるのは、自動テストのためのスクリプトやプログラムの作成工数まで考慮に入れた場合は、データパターンだけを変えて、同じテストを何度も繰り返すようなテストが最も効果的だということがわかると思います。

例えば、今までは人手で行っていたために、時間の制限からデータパターンの網羅率が低かったテストなどは、自動化することで、網羅率の向上が図れるため、バグの検出率があがり、結果、システムの品質を向上させることができます。 同時に、いままでテスト実行のために拘束されていたテスト技術者の時間を、もっと人間が得意なテスト領域に振り分けることで、さらにシステムの品質の向上が期待できます。
また、手動で行うことが現実的でない大量の同時アクセステストなどは、すでに各種ツールが存在することからもわかるように、自動テストにとって最適なテスト分野です。

つまり、コンピュータパワーを発揮できるようなテストから自動化するのが最も効果的だということです。

自動テストの導入の進め方

自動テストの導入を避けることは、今後のシステム開発においては、競合力の低下を招くことは想像できるかと思いますが、過度の期待は禁物であり、適切な導入を行うことが重要です。

どのような場合でも言えることですが、現在のプロジェクトの状況、組織の成熟度などを勘案して、できるところから一歩ずつ自動テストを導入していく必要があります。 これを間違えると、現場が混乱し、開発コストの上昇やスケジュール遅延、品質の低下を招く可能性があります。 これを避けるためには、自動テストと手動テストの違いをちゃんと理解して、今の自分たちにとって、自動化することで効果のあるテストは何かを考えて導入する必要があります。もちろん、自動テストに関してのスキル獲得がなければ、自動テストの実現はできません。新しいスキルですので、当然習熟するには時間とコストがかかります。

今までは人手で行っていたために、時間的、リソース的な制限からテストの網羅率を上げることができないようなテストがどのようなシステムでも必ずあると思います。 機械にできることは機械に任せるという視点で、既存のテストを見直してみて、その中から、機械でできそうなところで、かつ、自分たちのスキルで自動化できそうなところから、優先度をつけて、順々に自動テストを導入することが最も確実な方法です。また、手動テストを直接自動テストに変換するのではなく、自動テスト向けにテストケースを組み直すことも必要になるケースもあります。

いきなり高い目標を設定すると、絶対に失敗します。地道に、少しずつ進めることが自動テストの導入にあたって最も必要なことです。

執筆者プロフィール  吉村 好廣

外資系コンピュータメーカーに入社し、ハードウエアからソフトウエアまで幅広く開発の経験を積む。その中で様々なレベルのテストを経験する。独立後、テストをキーワードにプロジェクトを渡り歩くフリーランスのエンジニア。Androidテスト部、自動化テスト研究会等の活動の中でさらに切磋琢磨し腕を磨き続ける。