ソフトウェア開発におけるテストの種類
ソフトウェアの品質を支える上で欠かせないのが開発時の「テスト」です。
ソフトウェアのテストは一般的に、開発段階に応じて、単体テスト、結合テスト、システムテスト、受け入れテストという流れで実施されます。
その中で目的別に、機能テスト、性能テスト、セキュリティテストといった各種テストがおこなわれ、さらに、テストの手法には、ホワイトボックステストとブラックボックステストの2つがあります。
本記事では、開発段階ごとのテストの役割や中身を整理し、後半では組み込みソフト特有のテストについてもポイントを紹介します。
ソフトウェアテストの種類|開発段階別の4つのテスト
ソフトウェアのテストには、開発の段階に応じていくつかの種類があります。一般的に開発の流れに沿って、まずはモジュール単位または関数単位でおこなう単体テスト、次に複数のモジュールをつなげて動作確認をするための結合テスト、最後に成果物全体の最終的な確認のためのシステムテスト(または総合テスト)が実施されます。そしてそれらをクリアした後に、開発者以外の担当者またはユーザー(利用者または発注者)によって、製品の合否を判断するための受け入れテスト(または妥当性確認テスト)がおこなわれます。以下、この開発段階別の4つのテストについて紹介します。
単体テスト(ユニットテスト)とは
単体テストは、関数やモジュール単位でおこなわれるテストです。各関数やモジュールが単体ごとに仕様通り正しく動くか、異常入力に耐えられるか、といった点を確認します。具体的には、センサの値を処理する関数に想定した入力を与えた時に期待した出力が返ってくるか。また、想定範囲外の値を入れた時にも異常な動作をしないか。さらに、境界値(しきい値の前後、最大値、最小値、0など)における出力が正しいか、といった点を確かめることになります。実行方法としては、プログラムを動かさずにおこなう静的テストと、プログラムを実際に動かしておこなう動的テストがあり、前者では論理ミスなどがないかを確認し、後者では実行時にしか起きないような不具合がないかを確認します。単体テストに限らず、下記の結合テスト、システムテストにおいても、一般的に静的・動的の両テストをおこないます。
結合テスト(インテグレーションテスト)の役割
結合テストは、単体テストを終えた複数のモジュールをつなげて、それらが「組み合わせたときに正しく動くか」を確かめるためのテストです。つまり、モジュール間のインターフェースで不整合が起きていないか、あるいはデータの受け渡しミスが起きていないか、といったことを確認します。
システムテスト(統合テスト)のポイント
上記の単体テスト、結合テストを経た上でおこなわれるのがシステムテスト(または総合テスト)です。このテストによって、完成したシステム全体が要求仕様を満たしているかを確認します。機能面のみならず、パフォーマンスやセキュリティの面が要件を満たしているか、といったことも総合的に確認します。一般的にこれが、システム開発側がおこなう最後のテストであり、開発側にとっての最終確認にあたります。
受け入れテスト(ユーザーテスト)の進め方
システムテストを経て開発側の最終確認が終わった後に、ユーザー側または開発者以外の担当者が製品の合否を判断するためにおこなうのが、受け入れテスト(または妥当性確認テスト)です。実際の利用環境またはそれに準ずる環境で動作を確認し、性能や使いやすさなどを含め、ユーザーが満足できる品質になっているかを確認します。
ソフトウェアテストの手法|目的別・方式別の分類
機能テスト・パフォーマンステスト・セキュリティテストなど目的別のテスト
上記の各開発段階のテストにおいて、目的に応じてさまざまなテストがおこなわれます。その中には、機能テスト(仕様書通りに動作するかを確認)、パフォーマンステスト(処理速度や負荷耐性を調べる)、 セキュリティテスト(脆弱性の検出、安全性の確認)などさまざまなテストがあります。単体、結合、システムのどの段階でどのテストがおこなわれるかはケースバイケースですが、一般的には特にシステムテストにおいて、これらの各種テストを幅広くおこなうことが必要になります。
ホワイトボックステストとブラックボックステストの違い
一方、テスト手法の分類としては、ホワイトボックステストとブラックボックステストがあります。前者は、ソースコードや内部構造を意識しながらおこなわれるテスト、つまり、ソフトウェアが設計の意図通りに作られ、動作しているかを確認するためのテストです。後者のブラックボックステストは、内部構造は意識せずに外部から見た時の機能や仕様だけに着目するテストで、ソフトウェアが正しく機能するかを確認するテストと言えます。
回帰テスト(リグレッションテスト)の重要性
さらに、回帰テスト(またはリグレッションテスト)もソフトウェア開発においては重要です。これは、開発工程でソフトウェアに修正や変更を加えた時に、「以前できていたことが変わらずにできるか、修正や変更をしていない部分のソフトウェアの動作に変化がないか」を確認するためのテストです(単体、結合、システムの各テストにおいておこなわれます)。そのため、修正・変更のたびにできる限りおこなうことが理想的ですが、回数が多くなるため、効果的かつ、実施コストに見合う方法でおこなえるようにすることが重要になります。
組み込みソフトウェアテストの特徴と重要ポイント
組み込みソフトにおけるテストの重要性
組み込みソフトにおけるテストも基本的な流れは同じで、上記の各点はすべて同様におこなわれます。ただ、組み込みシステムはソフトウェアと協調してハードウェアが存在しているため、PC向けのソフト以上に高い安全性や信頼性が求められる場合が多く、製品の出荷後に問題が見つかると修正には大きな手間やコストがかかります。それゆえ、各段階のテストは特に丁寧におこなう必要があると同時に、汎用ソフトとは異なった観点のテストが必要であると言えます。
実機を用いたホワイトボックステストと性能確認
組み込みシステムは、ソフトウェアとハードウェアが連携して動作するため、両者が正しく連携できているかを確認するテストが必須となるのも特徴です。多くの場合、機能を実装して単体テストをおこなった後(または同時)に、そのソフトウェアを実際のターゲットCPU(マイコンなど)で動かして実機での動作確認をおこなうことになります。実際のマイコン上での動作はPCのそれと異なることが多いため、実機での動作をホワイトボックステストにて確認をおこないます。重要な部分が実装された後では、早い段階でパフォーマンステストをおこない、実際のハードウェアで性能が出るかを確認すると良いでしょう。
複数CPUの協調動作・通信確認とリアルタイム性
また、複雑なシステムになるとCPUが1つではなく複数あり、それぞれのCPUが協調して1つのシステムを動作させるような製品も多く存在します。例えば、1台の自動車では数十個~100個程度のCPUが積まれ、協調して動作しています。それらが正しく通信(CPU同士のコミュニケーション)しながら製品全体の仕様を満足する動作をするか、という点の確認も組み込み機器のシステムテストでは重要で難しいポイントです。また、リアルタイム性が求められるのも、汎用ソフトに対して組み込みソフトの際立った特徴です。その点を確認するテスト(タイミングテスト)も、組み込みソフトの開発において特に重要であると言えます。
早期のパフォーマンス検証の重要性
このように、組み込みソフトウェアのテストは、システムで協調して動くハードウェアを意識し、それらが合わさって仕様を満たすことを確認する必要があります。また、機能面だけではなく、タイミング検証や、リアルタイム性(処理速度)、負荷耐性といったパフォーマンス面を確認する必要があります。パフォーマンス面はハードウェアの動作とも関わるため、ひとたび問題が出るとハードウェアの再設計にもつながり、開発期間を遅延させる可能性があります。また、パフォーマンス系の不具合は再現頻度が低かったり、再現させることが難しかったりします。そのため、これらが開発後半で起きると修正や変更の影響範囲が大きくなります。このような事態を避けるため、開発フェーズのなるべく早い段階で、ソフトウェアが正しく動作し、その性能が設計されたハードウェアで出ることの確認をすることが望ましいと言えます。

