動的検証:単体テスト
動的検証では、定義されたテストケースに基づいてソフトウェアを実行し、実際のランタイム挙動を測定します。これにより、通常の条件、境界ケース、およびエラー状態において、関数が正しい結果を返すことを確認するとともに、ISO 26262、DO-178C、IEC 61508、およびIEC 62304で検証の証拠として要求される構造的カバレッジデータを生成します。
そのプロセスは、ユニットテストから始まります。統合が始まる前に、各関数、モジュール、クラス、およびコンポーネントが、その仕様に基づいて個別に検証されます。この段階で発見された不具合は、統合段階やフィールドで発見される不具合に比べてコストがごくわずかであり、ここで生成されるトレーサビリティレコードは、コンプライアンスの根拠となる基礎を形成します。
テストのワークフロー
安全上重要な開発における動的検証ワークフローは、定義された順序に従って進められます。テスト開始前に、要件をインポートしてテストケースと関連付け、該当する標準が要求するトレーサビリティのベースラインを確立します。テスト環境では、利用できない依存関係をスタブやモックで置き換えることで、テスト対象ソフトウェアを隔離します。テストはホスト、ターゲット、あるいはその両方で実行され、その全過程を通じてカバレッジが測定されます。結果は要件管理システムにフィードバックされ、監査人が確認する双方向のレコードが完成します。
ユニットテストで検証される内容
徹底したユニットテストスイートは、想定される入力だけでなく、それ以上の項目を検証します。各テストケースは特定の要件に基づいて作成され、以下の項目を網羅しています:
- 通常の入力と期待される出力
- 境界条件およびオフ・バイ・ワンケース
- エラー入力および無効な状態
- 関連するデータ型におけるオーバーフローおよびアンダーフローの条件
依存関係が予期しない値を返した場合の挙動
安全性が極めて重要な開発においては、各テストケースは、検証対象として設計された特定の要件に遡及します。要件からテストケース、そして結果に至る双方向のトレーサビリティは、DO-178CおよびISO 26262において必須の証拠とされています。
要件のトレーサビリティ
ISO 26262、DO-178C、IEC 61508、およびIEC 62304では、要件ベースのテストが義務付けられています。各テストケースは、検証対象として設計された特定の要件に遡及可能でなければならず、テスト結果はそれらの要件と双方向に関連付けられていなければなりません。このレコードは、すべての要件がテスト済みであり、対応する要件のないテストが存在しないことを示しています。
VectorCASTの「Requirements Gateway」は、外部の要件データベースに接続し、要件をテスト環境にインポートすることで、テストケースをそれらの要件に直接リンクさせることができます。実行後、結果およびカバレッジ指標は要件管理ツールにエクスポートされます。テストカバレッジのない要件や、リンクされた要件のないテストケースは、即座に確認できます。
テスト環境の構築
テスト対象の組込みソフトウェアは、通常、ハードウェアインターフェース、オペレーティングシステムのサービス、あるいはその他のソフトウェアコンポーネントに依存していますが、ユニットテストの実施中にこれらを利用できない場合や、呼び出すことが現実的でない場合があります。スタブはこれらの依存関係を置き換え、各依存関係が返す値を完全にコントロールしながら、テスト対象のユニットを独立した環境で実行できるようにします。
VectorCASTは、テスト環境の構築時に、すべての依存関係に対してスタブを自動的に生成します。スタブは、テストケースごとに有効化、無効化、または特定の値を返すように設定することができます。 プローブポイントはこのコントロールをさらに拡張し、テスト対象のユニットの任意の箇所に値を注入することで、通常は特定のハードウェア条件や障害状態を必要とするコードパスに到達できるようにします。また、VectorCASTは、テンプレート関数のインスタンス化(テンプレートクラスメンバーの明示的および暗黙的なインスタンス化を含む)のスタブ化もサポートしています。これは、このパターンが一般的なC++コードベースにおいて重要な機能です。
コードカバレッジ
コードカバレッジ測定とは、テストスイートによって実行される実行可能コードの割合を測定するものです。安全標準では、開発中のソフトウェアの重要度に基づいて、最低限のカバレッジレベルが規定されています。
- 命令カバレッジは、実行可能なすべてのラインが少なくとも一度は実行されたことを保証します
- 分岐カバレッジは、すべての分岐点において、考えられるすべての結果が実行されたことを確認します
- MC/DC(修正条件/判定カバレッジ)は、決定における各Boolean条件が結果に独立して影響を与えることを証明するものであり、最も厳格な構造的基準であると同時に、DO-178C レベルAおよびISO 26262 ASIL Dソフトウェアの要件でもあります
VectorCASTは、これらすべてのカバレッジタイプを測定し、特定の標準や安全度水準に応じて適切なカバレッジ基準を自動的に選択する「Industry Modes」を搭載しています。カバレッジの結果はTÜVによって認証されています。
ホストおよびターゲットのテスト
ユニットテストは通常、速度と制御の観点から、まずホストマシン上で開発・実行されます。迅速な反復、即時のフィードバック、そして容易なデバッグが可能であるため、ホストはテストスイートを構築・改良するのに最適な環境となります。ホスト上でテストを行う場合、ターゲットコンパイラは使用されないため、コンパイラ固有の挙動については、ターゲット上で別途検証する必要があります。
VectorCAST を使用すれば、ターゲットハードウェア上で同じテストケースを簡単に実行できます。テスト環境はホスト上で開発され、多くのクロスコンパイラやリアルタイムオペレーティングシステムで利用可能なランタイムサポートパッケージ(RSP)を使用して、ターゲット上で実行されます。カバレッジ測定、トレーサビリティ、およびレポート作成は、どちらの環境でも同様に適用されます。
自動テスト生成
大規模な組み込みコードベースに対してテストケースを手作業で作成するのは時間がかかり、抜けが生じやすいものです。VectorCASTの自動テスト生成(ATG)機能は、ソースコードから直接初期のテストケースセットを生成し、手作業での作成では見落とされがちな境界条件やコードパスを対象とします。エンジニアは、テストをゼロから作成するのではなく、生成されたテストを確認・拡張します。
テストコードを直接記述することを好むチームは、「Coded Tests」を使用できます。これは、GoogleTest互換の構文を用いたxUnitスタイルのテスト作成機能を提供すると同時に、VectorCASTのコードカバレッジ測定、トレーサビリティ、およびCI/CD統合へのアクセスも維持します。
VectorCAST
VectorCASTは、組込みC、C++、およびAdaソフトウェア向けの、Vector社が提供する動的テストおよびテスト自動化プラットフォームです。テスト環境の構築を自動化し、テストケースを生成・管理し、ホストおよびターゲット上でテストを実行し、構造カバレッジを測定し、監査可能なレポートを作成します。
主な機能は以下の通りです:
- 生成されたスタブ、モック、およびテストハーネスを用いたテスト環境の自動セットアップ
- ソースコードから直接初期テストケースを生成する自動テスト生成(ATG)
- GoogleTestの構文と互換性のある、xUnitスタイルのテスト作成のための「Coded Tests」
- 外部要件データベースとの双方向トレーサビリティを実現する要件ゲートウェイ
- コードの変更の影響を受けるテストのみを再実行する「変更ベーステスト」
- Visual Studio Code用VectorCAST Test Explorer拡張機能
- Jenkins、Azure DevOps、GitLab を含む CI/CD 統合