組み込みソフトウェアの開発を行う多くの組織において、テストは検証プロセスの大部分を占める要素となっています。調査によれば、開発時間の約 25 ~ 30% がテストに割り当てられ、場合によっては 50% にも上ると推定されています [1]。

検証には大きく分けて以下の 2 つの目的があります。

  • 機能の正確性を確認し、ソフトウェアが要件を満たしていることを検証する
  • ランタイムの正確性を確認し、実装が正しく、ロバストであることを検証する

これらの検証目標には相関関係がなく、従来は機能テスト、パフォーマンステスト、境界値テスト、ロバスト性テスト、乱数テスト、ステートメント カバレッジ テスト、判定カバレッジテストなどで対応していました。こうしたテスト手法は、すべて以下の 2 つのグループに分けることができます。

  • 機能の正確性を確認するための要件ベースのテスト手法
  • ランタイムの正確性を確認するためのカバレッジベースのテスト手法

しかし、このようにして組み込みソフトウェアをテストすることが、組み込みソフトウェア検証の最適な進め方なのでしょうか。以下は、組み込みソフトウェアのテストに関する記事からの抜粋です [2]。

「理想的には、プログラム内で想定されるあらゆる動作をテストしたいところです。つまり、想定されるすべての入力の組み合わせや、想定されるあらゆる決定パスを少なくとも一度はテストするということです。

目指したい目標ではありますが、かなり非現実的です。たとえば、Glen Ford Myers は、『The Art of Software Testing』の中で、たった 5 つの決定事項をもつ小さなプログラムに、10 ~ 14 通りの実行パスがあると説明しています。仮に 5 分ごとに 1 つのテストケースを記述し、実行し、検証したとして、このプログラムの徹底したテストには 10 億年かかるとも指摘しています。

もちろん、このような理想的な状態は実現できないため、この理想に近い状態を用意する必要があります。後述のとおり、機能テストとカバレッジテストの組み合わせは、合理的な次善の選択肢です。基本的なアプローチは、エラーを発見する確率が最も高い機能テストとカバレッジテストを選択することです。」

機能テストとカバレッジベースのテストのみを使用した場合に生じる脆弱性の最も顕著な例は、最近、大手航空機メーカーが報告したソフトウェアの問題です。DO 178 のガイドラインでは、膨大な量のテストと手作業によるレビューを求める厳しい検証要件と安全要件が課されているにもかかわらず、納品後のオーバーフローエラーを防ぐことができませんでした [3]。

テストのみに頼る検証では、明らかに不十分です。幸いにも、Polyspace 製品のようなツールが登場したことで、この問題を解消し、想定されるあらゆる入力の組み合わせと想定されるあらゆる決定パスを検証できるようになりました。

Polyspace 静的解析ソリューションは、抽象解釈と呼ばれる形式的手法の技術を使用しています。この技術は、ソフトウェア アプリケーションの動的プロパティをコンパイル時に検証することで、従来の静的解析技術と動的テストとのギャップを埋めるものです。

抽象解釈は、プログラムそのものを実行することなく、プログラムの想定されるすべての動作、すなわち想定されるすべての入力の組み合わせと想定されるすべての実行順序を一度に調べ、プログラムがどのように、また、どのような条件で失敗する可能性があるかを判定します。詳細については、Polyspace 静的解析ソリューションのホワイトペーパーをご覧ください。

プログラムで想定されるあらゆる動作を解析してソフトウェアを完全に検証できるだけでなく、ソフトウェアテストに費やす労力や開発期間を大幅に削減できます。Polyspace ツールが提供する動的なランタイム動作を活用して、以下を行うことができます。

  • ロバスト性テストの置き換えや削減
  • デッド コード カバレッジの実行
  • テストサイクル回数の削減
  • 関連するテストベクトルの特定

今後の投稿で、Polyspace がこれらの各タスクにどのように役立つかを説明します。このように、Polyspace の静的解析とテストを組み合わせて使用すると、労力を削減し、開発期間全体を短縮できるというメリットがあります。ある大手自動車部品サプライヤーでは、ロバスト性テストの置き換えとテストサイクル回数の削減を中心に、テストサイクルを最大 50% 短縮できました。Polyspace で生成される成果物により、必要とされるレベルの品質を達成する方法が示されます。Polyspace ツールは、以下のようなテストプロセスのさまざまな段階で活用できます。

  • ユニットテスト
  • 統合テスト
  • 受入テスト

ビデオ

参考文献