ソフトウェアテストにおける選択肢の一つとして候補に挙がるのが「テスト自動化」だ。本連載では、テスト自動化に取り組みたいけれどノウハウがない、過去に導入していたがうまくいかなくてやめた人に向けて、テスト自動化の「あるある」な失敗事例とともにどうすればうまく取り入れられるのかを解説する。第1回は「テスト自動化とは何か」と「導入時に注意すべきポイント」について。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
ソフトウェア開発が高度化、複雑化していく中で、テストをいかに効率的に、効果的に実施していくかという問題はどんどん重要度を増しています。また、短期間のうちに多くのフィーチャーを実装していく必要性も増し、どこまでテストするのか、どうやってテストするのかというテスト技術の向上も、開発にとってもはや必須といえるでしょう。
本連載では、そんな課題の解決策の一つであるテスト自動化についてのポイントや注意点について解説していきます。テスト自動化は近年普及が進む一方、導入が「できている」企業と「できていない」企業に差が生じがちです。
なぜ導入に差が生じてしまうのでしょうか。それはテスト自動化が極端にいうと「もろ刃の剣」という側面があるからです。できること、できないことをきちんと見極め、計画的に導入、推進していく必要があります。そうしない場合、ただ単にコストばかりかかってしまって思ったような効果が発揮できず、逆にこれまで見つけられていたバグを見逃してしまう結果につながりかねません。
まずは、テスト自動化とは何をすることなのか、テストの「何」を自動化するのかを解説していきます。一言でいうと、テスト自動化はテストの「実行」を自動化します。当たり前のことを言っているように思われるかもしれませんが、「テスト」という業務はただ単にプログラムを動かしてみる、という作業だけではなく、その前後にさまざまなプロセスが必要となります。
一般的なテストプロセスとして、ここでは国際的なソフトウェアテスト技術者資格の認証組織である、ISTQB(国際ソフトウェアテスト資格認定委員会)が定義するものを紹介します。テストプロセスには、以下のようなものがあります。
意識的に行う、行わないという差や、ドキュメント化の程度がプロジェクトによって異なることはありますが、テストを行う場合は必ずこれらを実施しています。
各項目をもう少し詳しく解説します。
テスト計画とは、テストの目的とリソースに応じたアプローチを定義することです。テストスケジュールの作成や、必要な人員、機材などの洗い出しなどを行います。そのベースとなるのが、何を、どこまでテストするのかといったことを決め、方針を定める「テスト戦略」と呼ばれるものです。それらを明確にしておくことで、テストの方向性が定まり、不測の事態にも的確に対処できるようになります。
テスト分析ではテスト対象を分析し、何をテストするのかを定めます。テスト対象の機能を分類、整理したり、仕様を確認したりして、どのようなテストが必要なのかを見極めます。そして、「テスト条件」という形で明確に設定します。
テスト設計では、テスト分析で定めたテスト条件を具体化し、どうテストするのかを定めます。テストに必要なパラメーターを設定したり、どのような順番で実施するのかといったことを決めたりします。
テスト実装では実際に使用するテストデータやテスト環境、テストケースなどを作成します。テストを実施するためには具体的な実施手順や実施の期待結果を押さえておく必要があります。
テスト実行ではテストを実施し、テスト結果や欠陥を記録します。
テスト完了では、テスト結果の考察や報告を行います。テストを実施した結果何がいえるのか、きちんと計画で定めた目標を達成できたのか、追加テストなどが必要か、といったことをまとめて、ステークホルダーに報告します。
テストのモニタリングとコントロールは、ここまでのテストプロセスの中で横断的に実施し、プロジェクトを円滑に進められるように管理することです。進捗(しんちょく)管理などを実施し、問題があれば対処します。
それぞれのプロセスを解説してきましたが、テスト自動化で行える範囲は、この中のテスト実行プロセスのみです。とはいえ、最も実施工数がかかるのがこのテスト実行プロセスですので、効果的に導入することによってコストを大きく改善することができます。
テスト実行作業を省力化できるのがテスト自動化ですが、それ以外にもメリットがあります。まず、プログラムで実施するため、テスト実施に人為的なミスがなくなり、操作自体も高速になります。場合によっては、手動のテストよりも何十倍、何百倍のスピードでテストすることも可能になります。もちろん、用意したテストプログラムの正確さは前提となりますので、テストに誤りがないか、仕様変更などがきちんと反映されているかといった確認作業は必須です。この辺りは、次回、テスト自動化の具体的な手順を説明する際に詳述します。
さらに、事前にテストプログラムが準備されていれば、テストをしたいときにいつでも実行することができます。テスト対象システムの実装や修正後すぐにテストを実施することができますし、夜間や休日などにテストを実行させておくことも可能になります。
また、テストを実行するコンピュータを増やすことにより、並列実行が比較的容易に実施できます。テストケースを自動化する際に、並列に実行できるように工夫しておく必要がありますが、手動テストの場合、テスト実施人員を増やすことは簡単にいかないことが多く、テストのスキルにも個人差があるため、全く同じ効果になるかどうかは確実ではありません。そういった点のメリットも大きいものがあります。
いろいろと良い点を並べてきましたが、もちろん注意しなければいけないところもあります。まず最も大きな特徴は、自動化テストは「事前に定義したことしかしない」ということです。テスト自動化は「言われたことはきちんとこなすが、言われたことしかやらない」という人間がテストをするようなものです。事前に、どの部分をどのような観点でテストをするのか、しっかりと押さえておかないとテスト漏れが発生してしまいます。
ここまで解説したテスト自動化の特徴をしっかりと押さえておくことが、テスト自動化成功への1つのカギとなります。そして、もう1つのカギは、テスト自動化に関するコストをきちんと見極めることです。
テスト自動化では実行時のコストを削減することが大きな目的となります。ただし、何も考えずにただ導入してもその効果は得られず、かえってコストが増してしまう、ということにもつながりかねません。
テスト自動化は、導入時にコストがかかります。このコストとは、ツールの導入にかかる金銭的な費用もありますが、導入に当たってのツール検討や環境構築、そしてテストプログラムの作成といった作業コストというものも含めます。そういったコストは手動テストにはかからないので、テスト自動化を導入する段階で余分にコストを抱えることになります。しかし、テスト実行時のコストは減少するので、どこかの時点で手動テストと自動テストのコストを逆転させることができるようになります。
つまり、複数回のテスト実行を経て、負債となる初期コストを返済して元を取る、ということです。労力、工数も含めたコスト意識を明確にしておくことこそが、テスト自動化成功において最も重要であるといっても過言ではありません。
ここで、テスト自動化失敗のよくあるパターンを2つ紹介します。
1つ目のパターンは、テストを自動化したはいいものの、自動テストをメンテナンスできるエンジニアが、他の開発業務と掛け持ちしているパターンです。
テスト自動化ツールは、必要となる知識が属人化してしまいがちです。自然な成り行きとして、開発業務に携わるプログラマーがテスト自動化の構築やテストプログラムの作成に携わるというケースが多くなります。その人の業務があまり多忙はでないときにテスト自動化を導入し、初期の構築が問題なく進んでいったとしても、開発作業の方が忙しくなってしまうと、テスト自動化のメンテナンスに時間を割くことができなくなってしまいます。
メンテナンスができないと自動テストが動かない領域がどんどん広がっていき、いつの間にかテスト自動化ツールが使われなくなってしまいます。そして残ったのは初期投資したコストだけ、ということになってしまうのが最悪のパターンです。
次のパターンはテスト自動化を担当しているエンジニアが退職や部署移動で交代してしまうという場合です。こちらはテスト自動化にかけられるコストが減るというわけではありませんが、十分な引き継ぎができていない場合、交代したエンジニアの得意なツールや言語でテスト自動化をやり直してしまう、という状況が発生する場合があります。そうなってしまうと、いくら順調にテスト自動化を進められていたとしても追加のコストがかかってしまうため、損益分岐点が遠ざかってしまいます。
このような状況に陥らないようにするためには、次の点に注意する必要があります。
属人化を防ぐために、可能な限りプロジェクトメンバーが扱いやすいものを選ぶ必要があります。また、使用方法を適切に引き継げるか、長く使用できるようなツール側のサポート体制が整っているかなども選定のポイントとなります。
何度も実行するようなテストケースから自動化することも有効です。例えば、仕様変更の多い機能とそうでない機能であれば仕様変更の多い機能を先に自動化します。他にも、バグが発生した部分の周辺を確認する際に行うリグレッションテストは、類似のバグ発生時に迅速に対処できるため、自動化の効果が発揮しやすいといえるでしょう。
テストの実行回数が多いということは、それだけ修正の必要性も高くなります。その工数をなるべく低く抑えるために工夫する必要があります。例えば、小まめにリファクタリングを行ってテストプログラムの保守性を向上させる、メンテナンスが容易な単体テストから中心に自動化を進めるなどの方針が有効です。
ここまで、テスト自動化とは何かということと、どのようなことに注意する必要があるのか、という点を解説してきました。次回は、どのような手順でテスト自動化を行うのかをより具体的に紹介していきます。
クロス・ファンクショナル事業部 R&C部 マネージャー
Web系、エンタープライズ系、医療系などさまざまな開発業務にプログラマー、システムエンジニア、プロジェクトリーダーとして携わった後、バルテスにてテストエンジニア、コンサルタント業務に従事。現在は、主にテスト業務に関する研究開発および人材育成を担当。Scrum Alliance認定スクラムマスター、ディープラーニング検定(G資格)、ネットワークスペシャリスト、データベーススペシャリスト、JSTQB Advanced Level(テストマネージャ、テストアナリスト)など、ソフトウェアの開発およびテストに関する資格を多数取得。JaSST Kansai 実行委員。同社が運営するソフトウェア品質向上プラットフォーム「Qbook」の執筆を担当するなど、ソフトウェア開発に携わるエンジニアに対しての情報発信を積極的に行う。
Copyright © ITmedia, Inc. All Rights Reserved.