デスクトップアプリのテスト自動化の必要性 プロジェクト成否の鍵とは?
業務システムに適したアプリ開発では、Windows向けにデスクトップアプリを開発することが多々あります(単にWindowsアプリと呼ばれる場合もあります)。Webアプリケーションでは難しいキー操作、USBデバイスやプリンターなどとの連携が必要な場合にOSのAPIを直接呼び出す必要があるためです。
そして、多くのソフトウェア開発プロジェクトと同様に、デスクトップアプリにおいてもテストは重要な要素です。デスクトップアプリではGUIが主要なインタフェースであり、ユーザビリティや品質の確保が特に重視されます。
今回はデスクトップアプリの品質を向上、担保するために欠かせないテストの自動化について解説いたします。
なぜテストの自動化が重要なのか
テストは、大きく分けて以下の2種類で行われます。
- 手動(マンパワー)テスト
- 自動テスト
前者の手動テストは、開発チームや専属チームにより、人の手で行われます。メリットはもちろん幾つかありますが、一番大きなデメリットは時間とコストがかかる点でしょう。また、ちょっとした修正に対して、再度同じだけの工数をかけてテストするのは困難です。そのため、初期リリースやメジャーアップデートなどのタイミングで採用されます。
自動テストは、テストケースの実行を自動化することで、テストを繰り返し何度でも行えます。自動化によって、CI/CDのような継続的インテグレーションや継続的デプロイメントにも対応できます。これにより、品質を担保しつつ、開発速度を向上させられます。
自動テストが重要な理由は、以下の通りです。
・修正時の再テストが容易
先述の通り、手動テストは再テスト時のコストがとても大きい点がデメリットです。システムは修正部分以外にも影響が及ぶケースも多く、自分たちの考えている以外の場所で不具合につながることもあります。自動テストを導入すれば修正時の再テストが容易になり、予測していなかった部分の不具合にも早く気づけます。
・テストの網羅率が向上
手動テストは人の手で行われるため、時間とコストの兼ね合いでテストケースの網羅率が低くなりがちです。それに対して自動テストはテストケースを自動化するため、網羅率が向上します。これにより、開発者はテスト漏れを気にせず品質を担保できます。たとえばテキスト入力一つとっても、さまざまな文字列を自動入力してテストできます。ファイルアップロードに対する不正なファイルや大容量ファイルのアップロードなど、人では気付きづらいテストケースも自動テストなら網羅できます。
・テストの再現性が向上
テストにおいて大事なポイントが再現性です。手動テストの場合、そのエラーが一時的なものなのか再現性あるものなのか判断できないことがあります。しかし、自動テストはテストケースを自動化するため記録が残しやすく、再現性が向上します。そのため、エラーが発生した際に、環境(データベースなど)を戻して、再度エラーが発生する条件を特定しやすくなります。
・プロダクトの品質向上
デスクトップアプリの場合、Webアプリケーション以上に環境が複雑です。端末ごとに環境差違があり、まったく同じ環境を作るのは困難です。また、依存するライブラリや関連アプリケーションのバージョンが端末によって異なる場合もあるでしょう。そうした環境差違によるテストも、自動化するスクリプトがあれば共通した内容でテストを行えます。結果として、アプリケーションの品質を担保しながら、開発速度を向上させられるでしょう。
プロジェクトの課題とテスト自動化の役割
開発プロジェクトにおいて、テストは後工程に回されやすく、またリソースの割り当てを減らされやすいという課題があります。プロジェクトの進捗によりますが、プロジェクト遅延の影響を受けやすく、結果としてテストによる品質担保が犠牲にされやすいです。
これはウォーターフォール型の開発プロセスにおいて特に顕著ですが、アジャイル型の開発プロセスでも、イテレーションの中でテスト工程が圧縮されてしまう問題は常に発生します。
自動テストは、これらの課題を解決する上で有効な手段になります。自動テストを導入してテスト工程の効率化を図れば、開発プロジェクトの成功に貢献できるでしょう。
一般的なプロジェクトにおける課題と、テストを自動化させることがどのように解決するかを以下に示します。
・時間
自動テストは、一度テストケースを作成すれば、同じテストを繰り返し実行できます。これにより、テスト工程の時間を大幅に短縮します。また、CI/CDの導入により、自動テストを継続的に実行し、開発プロセス全体の効率化が図れます。
なお、注意点はテストケースの定期的な見直しが必要で、最新の仕様に合わせる必要があるという点です。つまり、初期段階からテストを作り込みすぎると、後々のメンテナンス工数が大きくなります。
それを防ぐためには、テストケースの作り込みのバランス、そして必須であるテストケースから順番に自動化へ取り組むのがお勧めです。
・コスト
人がテストを行う場合でも、一定のコスト(工数)はかかります。テストケースを作る場合、その作成コストが捻出できないという課題もあるでしょう。しかし自動テストは、一度作成すれば何度も実行できるため、結果としてプロジェクト全体のコストを削減できます。
プロジェクトで最大のコストにつながりやすいのが、終盤になった時の不具合発生とその修正工数です。最終工程はもちろん、リリース後の不具合発生による対応コストは、決して無視できるものではありません。そうしたリスクを軽減するためにも、自動テストは有効な手段です。
・品質
手動テストはとても柔軟です。大雑把なテスト仕様書であっても、人であれば柔軟に解釈して実行します。ただし人依存が強く、テストに慣れている人員かどうかでテスト品質が大きく変わります。また、人であるために何度も同じようなテストを実行すると、次第に緊張感がなくなってテスト品質が低下するという課題があります。
テスト自動化により、プロジェクトの成果物であるアプリケーションの品質を担保できます。もちろん、人が行うべきテストはありますが、それは決して多くありません。まず最低限の品質を自動テストによって担保しましょう。その上で手動テストの比率を下げる、テストの網羅率を向上させるといった施策に進めていきましょう。
デスクトップアプリにおけるテスト自動化の基本
今回はデスクトップアプリ(GUIアプリ)に特化したテスト自動化の基本について解説します。もちろん幾つかのトピックはWebアプリケーションやサーバーサイドのテストでも利用できます。
デスクトップアプリケーションのテストとしては、UI操作を伴うテストやパフォーマンス、ユーザビリティテストが重視されます。この中で、使いやすさを評価するユーザビリティテストは自動化が難しい部分になります。
・UI操作を伴うテスト
デスクトップアプリケーションを自動操作できれば、UI周りのテストを自動化できます。ボタンや入力を行い、その結果を確認するテストがこれに該当します。テストツールによっては、画面のスクリーンショットを取得して、画像認識によるテストも可能です。
デスクトップアプリケーションでは、操作時のデータの状態によって表示内容が違う、さらに結果が変わることが多々あります。そうした複雑な操作も考慮した上で、仕様に合わせたテストケースの作成が必要です。
・パフォーマンステスト
入力した結果が反映されるまでにかかる時間や、データ取得にかかる時間を計測します。体感ではなく、数値としてパフォーマンスを評価できるため、品質担保に有効です。
サーバーサイドとの連携を前提としている場合には、サーバー側での処理結果がパフォーマンスに影響を与える要素が大きくなります。ただし、アプリケーション側に複雑なロジックがあると、少なからずパフォーマンスに影響を与えるので注意が必要です。
・手動と自動化のバランス
テスト自動化を導入する際に、常に問題になるのが手動・自動のバランスになります。テスト自動化を推進する人たちにとっては、すべてのテストを自動化したくなるでしょう。しかし、それは現実的ではありません。
テストケースの作成にも一定のコストがかかり、そしてメンテナンスが必要だという点を忘れてはいけません。UI変更がアプリケーションへ与える影響は小さくないため、それに関連するテストケースの修正範囲は大きくなります。その結果、テストケースの修正コストばかり大きくなってしまうことは避けたいでしょう。
テスト自動化を導入する際には、まずは必須であるテストケースの実行から自動化しましょう。また、テストケースの作成とメンテナンスにかかるコストを考慮し、バランスを取るのも重要です。
チームでの自動テスト文化の醸成
テスト自動化を成功させるためには、チーム内での自動テスト文化の熟成が鍵になります。限られたメンバーだけ自動テストをする、テストのメンテナンスをしているのではプロジェクトの成功はおぼつかないでしょう。
・自動テストをチームの日常に組み込むには
自動テストをチームの日常に組み込むためには、以下のポイントが重要です。
- テストコードを書く文化の醸成
- ツールの低い学習コスト
- テストカバレッジの可視化
自動化する以前の段階として、まずチーム全体にテストコードを書く文化を作りましょう。テストコードを書くのが当たり前になれば、自動テストの導入がスムーズに進むようになります。
テストされていないリポジトリがあると、イチからテストコードを書いていくのは大変な作業です。そこを乗り越えるためにも、効果的なテストから順番に取り組みましょう。また、学習・導入コストの低いツールの選定が鍵になります。
効果的なテストとは、高カバレッジ率につながるテストになります。たとえば認証プロセスは、多くの機能が必要とするでしょう。また、テストカバレッジ率を可視化すれば、テストの効果をグラフ化できます。さらに、どの部分がテストされていないのか明確になります。
学習・導入コストの低いツールを選定するのも重要です。学習コストが高いと、多忙な開発チームでは導入が難しいでしょう。また、導入コストが高いツールは、導入後のメンテナンスが困難になる可能性があります。なるべく学習コストが低く、すぐに導入できるものを選択しましょう。
・知見を共有する
自動テストを導入する際には、知見の共有が重要です。チーム内で知見を共有することで、テストコードの品質を向上できます。これはテストだけでなく、普段のコードを書く際にも必要ですし、チームでのコード品質向上にもつながります。
知見共有の方法としては、以下のようなものがあります。
- ペアプログラミング
- コードレビュー
- ドキュメントの作成
- 社内勉強会
テストを書いた知見や実際のコードを共有すれば、他のメンバーもテストコードを書くのに抵抗がなくなります。また、コードレビューやペアプログラミングを導入すれば、チーム全体のコード品質向上にも役立ちます。
まとめ
本記事では、テスト自動化がプロジェクトの成否に不可欠である点を紹介しました。デスクトップアプリ開発プロジェクトでは実行される環境が多数あり、アプリケーションの品質を高めるためにもテストの自動化が重要になります。
また、テスト自動化をチームに導入するためには、ツールの選定やチームの文化が重要である点も紹介しました。特にテスト自動化を担うツールは、なるべく手軽かつ低学習コストで導入できるものを選んでください。
誰でもカンタンにテスト自動化ができる時代は、すぐそこまできています。当サイトでは、テスト自動化ツールに興味のある方へ、「テスト自動化 推進ガイドブック」と「テスト自動化ツールT-DASH 基本ガイドブック」のダウンロード資料をご用意しております。ぜひダウンロードいただき、資料をご覧ください。