このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
back-to-back 等価性テスト
この例では、ノーマル モード シミュレーションとソフトウェアインザループ (SIL) シミュレーションの結果を比較するために、back-to-back テストを作成してモデル全体で実行する方法を示します。back-to-back テスト (等価性テスト) では、生成コードでモデルのシミュレーションと同じ結果が得られるかどうかをテストします。このタイプのテストにより、カバレッジ ギャップも明らかになり、生成コードが想定どおりに動作する信頼性が高まります。機能要件を実装してテストし、モデルから生成されるコードを検証し、モデルとコードの 100% のカバレッジを達成することは、ISO 26262 や IEC 61508 などのソフトウェア規格や安全規格と認定への準拠のための重要な部分になります。
この例では、モデル テストと SIL テストのみを示します。SIL シミュレーションでは、開発用コンピューターで生成コードをコンパイルして実行します。プロセッサインザループ (PIL) シミュレーションでは、開発用コンピューターでソース コードをクロスコンパイルしてから、ターゲット プロセッサまたは同等の命令セット シミュレーターでオブジェクト コードをダウンロードして実行します。完全な準拠のためには、PIL テストも実施する必要があります。詳細については、PIL シミュレーションの構成と実行 (Embedded Coder)およびSIL and PIL Limitations (Embedded Coder)を参照してください。
ノーマル モード シミュレーションと生成コードのテスト結果には、浮動小数点値を比較する際の許容誤差の違いなど、数値的な差による差異が生じることがあります。また、時間遅延やコンパイラの問題によってコードとシミュレーションの間に差異が生じることもあります。back-to-back テストの一致しない結果から、1 つ以上の既存の問題が明らかになり、モデルと生成コードが該当する業界標準や認定に準拠するように修正できます。
この例の sf_boilerController モデルには、ボイラーの温度制御器をモデル化した Stateflow チャートが含まれています。このモデルはバンバン温度制御システムのモデル化 (Stateflow)の例から派生したものです。
モデルとテスト マネージャーを開く
モデルを開きます。その後、テスト マネージャーを開き、前に読み込まれていたテスト ファイルと結果をクリアします。
Model = "sf_boilerController";
open_system(Model)
sltest.testmanager.view
sltest.testmanager.clear
sltest.testmanager.clearResults[モデル コンポーネントのテストの作成] ウィザードを開く
テスト マネージャーで、[新規]、[モデル コンポーネントのテスト] を選択して [モデル コンポーネントのテストの作成] ウィザードを開きます。
テストするモデルとコンポーネントの指定
1.[システム] タブで、[現在のモデルを使用] ボタン
をクリックして [最上位モデル] フィールドにモデルを追加します。
2.左側のペインで、最上位モデル sf_boilerController を選択してモデル全体を選択します。
3.[追加] ボタン
をクリックして [選択したコンポーネント] ペインにモデルを追加します。
4.[次へ] をクリックします。

テスト入力の指定
[テスト入力] タブで、既定の設定の [最上位モデルからのコンポーネント入力をテスト入力として使用] を使用します。その後、[次へ] をクリックします。

コンポーネントのテスト方法の指定
[検証手法] タブで、back-to-back テストを作成するように指定します。
1.[back-to-back テストを実行する] を選択します。
2.[シミュレーション 1] が [Normal] に設定され、[シミュレーション 2] が [Software-in-the-Loop (SIL)] に設定されていることを確認します。その後、[次へ] をクリックします。

入力、ファイル形式、ファイルの場所の指定
[生成されたテスト] タブで、入力ソース、ファイル形式、テスト データと生成されたテストの保存場所を指定します。
1.[テスト ハーネスの入力ソースの選択] が [Inports] になっていることを確認します。
2.[ファイル形式を指定] を [Excel] に変更します。入力を Excel に保存することで、ファイルの内容を Simulink の外部で確認して手動で編集できるようになります。
3.テスト データと生成されたテストを保存する場所については既定値を使用します。
4.[完了] をクリックします。
[モデル コンポーネントのテストの作成] ウィザードで、チャートからの出力に対して信号のログが設定され、モデルがシミュレートされて信号が取得され、テスト ハーネスとテスト ケースが作成されます。さらに、Excel 入力ファイル sltest_sf_boilerController.xlsx とテスト ファイル sltest_sf_boilerController_tests.mldatx が作成されます。

シミュレーション モードの確認
1.テスト マネージャーの [テスト ブラウザー] ペインで、ウィザードで作成したテスト ケース sf_boilerController_Harness1 を選択します。テスト ケースの名前は、ウィザードで自動的に "model name_associated test harness name" に設定されます。
2.右側のペインで、[シミュレーション 1] セクションを展開し、[シミュレーション設定とリリースのオーバーライド] を展開します。[シミュレーション モード] パラメーターが [Normal] になっていることを確認します。

3.[シミュレーション 2] セクションとその [シミュレーション設定とリリースのオーバーライド] を展開します。その [シミュレーション モード] パラメーターが [Software-in-the-Loop (SIL)] になっていることを確認します。

収集するカバレッジの設定
1.[テスト ブラウザー] ペインで、テスト ファイル sltest_sf_boilerController_tests を選択します。
2.右側のペインで、[カバレッジの設定] を展開します。カバレッジはテスト ファイル レベルでのみ設定できます。そのカバレッジ設定がファイル内のテスト ケースに伝播されます。
3.[テスト対象システムのカバレッジを記録] と [参照モデルのカバレッジを記録] を選択してカバレッジの収集を有効にします。
4.[カバレッジ メトリクス] で、[判定]、[条件]、および [MCDC] を選択します。これらのメトリクスは、ISO 26262 を含むほとんどの認定規格で必要になります。
判定カバレッジでは、モデルの判定点が解析されます。判定は、1 つ以上の入力信号でブロックの出力信号を判定するモデル内の場所です。判定カバレッジにより、すべての判定がテストされるかどうかが特定されます。
条件カバレッジでは、入力と Stateflow 遷移の論理的組み合わせを出力するブロックが解析されます。この例の場合、テスト ケースで完全なカバレッジが得られるのは、Stateflow 遷移の各条件がシミュレーション中に少なくとも 1 回 true になり、かつ少なくとも 1 回 false になる場合です。
MCDC (改良条件判定カバレッジ) は、判定カバレッジと条件カバレッジを拡張したものです。判定内の各条件について、判定結果に個々に影響するかどうか、起こり得るすべての結果に対して少なくとも 1 回評価されているかどうかが解析されます。この例の場合、Stateflow 遷移が MCDC で解析されます。
カバレッジとカバレッジ メトリクスの詳細については、それぞれモデル カバレッジ (Simulink Coverage)とモデル カバレッジの種類 (Simulink Coverage)を参照してください。

テスト ケースの実行と結果の表示
1.テスト ケース sf_boilerController_Harness1 を選択し、ツール バーの [実行] ボタンをクリックします。テストを実行すると、左側のペインに [結果とアーティファクト] ペインが表示されます。
2.テストが完了したら、[結果とアーティファクト] ペインで [Results] をクリックして右側のペインを更新します。
[カバレッジの結果の集計] セクションに、SIL モード シミュレーションについてのコード カバレッジと、ノーマル モード シミュレーションについてのモデル内の機能要素のカバレッジが表示されます。ノーマルと SIL のどちらのシミュレーション モードもカバレッジが 100% に満たず、テスト中にコードとモデルのすべての経路は実行されなかったことを示しています。関数のカバレッジ メトリクスはノーマル シミュレーション モードには適用されません。

カバレッジの拡大
Simulink Design Verifier を使用してカバレッジを拡大できます。テストを実行してカバレッジを収集した後、Simulink Design Verifier で別の入力を使用して新しいテスト ケースを生成し、モデルのテストされていない部分をテストできます。
1.[カバレッジの結果の集計] テーブルの [Sim モード] 列で [Normal] をクリックします。
2.テーブルの下にある [未達カバレッジのテストを追加] をクリックします。
3.[未達カバレッジのテストを追加] ダイアログ ボックスで、[テスト ケース] を [<Create a new test case>] に設定します。
4.[テスト タイプ] を [Equivalence Test] に設定します。

5.その他のフィールドは既定値のままにします。[OK] をクリックします。Simulink Design Verifier で、新しいテスト スイート、テスト ケース、テスト反復が作成されます。新しいテスト スイートとテスト ケース New Test Case 1 が [テスト ブラウザー] に表示されます。
6.New Test Case 1 を選択し、New Test Case 1 の [反復] セクションを展開して反復を確認します。
シミュレーション モードの設定、新しいテスト ケースの実行、更新されたカバレッジの確認
1.[シミュレーション 1] と [シミュレーション設定とリリースのオーバーライド] を展開します。[シミュレーション モード] を [Normal] に変更します。
2.[シミュレーション 2] と [シミュレーション設定とリリースのオーバーライド] を展開します。[シミュレーション モード] を [Software-in-the-Loop (SIL)] に変更します。
3.ツール バーの [実行] ボタンをクリックします。
4.テストの実行が完了したら、[結果とアーティファクト] パネルで最新の [Results] をクリックして右側のペインを更新します。
5.[カバレッジの結果の集計] を確認します。ノーマル モードについては 100% ですが、SIL モードについては [判定] メトリクスの結果が 94% しかありません。このモデルの未達の [判定] カバレッジは、値が指定の範囲外である場合の偽条件を評価するコードによるものです。コード ジェネレーターは、整数オーバーフロー保護を追加することで、テスト ケースですべての false 値を評価するために必要になる時間を大幅に削減します。

未達カバレッジの正当化とフィルター処理
達成されないカバレッジとしてマークするコード行またはモデル要素について、正当化の根拠を提供できます。カバレッジが 100% に満たない可能性があるカバレッジ結果を正当化する理由としては、コード生成最適化、コード置換ライブラリ、エラー条件、防御的コードがあります。
1.SIL シミュレーションの [レポート] 列で [カバレッジ レポートの集計を作成します] 矢印をクリックして、SIL カバレッジ概要レポートを作成します。

2.sf_boilerController の SIL カバレッジ概要レポートで、[5.1 判定 localDW->temporalCounter_i1 < 31U (行 90)] の節に移動します。これは、[判定] カバレッジの結果の低下に寄与している 2 行のコードのうちの 1 行です。"true" の結果については、指定の範囲に整数値の数の制限があるためカバレッジが 100% になりますが、"false" の結果については、取り得る値の数に制限がないためテストに非常に長い時間がかかり、"false" の結果のカバレッジを 100% と見なすことはできません。
3.[正当化または排除] リンク、または強調表示された [false] の結果の横にある [正当化規則を追加] アイコンをクリックして、フィルター エクスプローラーを開きます。

4.フィルター エクスプローラーの [フィルター規則] セクションで、表示されたコード行の [モード] を [Justified] に変更します。正当化の [根拠] として、「Integer overflow protection in generated code can only be exercised by unrealistically long test case」を追加します。カバレッジのフィルターの詳細については、カバレッジのフィルター (Simulink Coverage)およびカバレッジ フィルターの規則とファイル (Simulink Coverage)を参照してください。

5.[適用] をクリックし、[フィルター ファイルの保存] ダイアログ ボックスで、カバレッジ フィルター (.cvf) ファイルの名前として「boilerController_covfilter」と入力して [保存] をクリックします。
6.sf_boilerController の SIL カバレッジ概要レポートで、節 [5.1] が [正当化済み] になり、その [カバレッジ] が 100% になっていること、およびテーブルの [false] の行が薄い青で強調表示されていることに注目してください。

7.レポートの [5.2 判定 localDW->temporalCounter_i2 < 63U (行 94)] の節に移動し、その [false] の判定について、手順 3 と 4 を繰り返して未達カバレッジを正当化します。節 [5.1] に使用した同じ根拠を使用します。
8.[適用] をクリックして、boilerController_covfilter.cvf カバレッジ フィルター ファイルと SIL カバレッジ レポートを更新します。レポートの [概要] 節で、カバレッジ率のバーの正当化されたカバレッジを示す部分が薄い青になり、カバレッジが 100% であることが示されます。テスト マネージャーで、[カバレッジの結果の集計] テーブルに更新されたカバレッジが表示され、[カバレッジ フィルター] セクションにカバレッジ フィルター ファイルがリストされます。

9.[カバレッジ フィルター] ペインの下部にある [テスト ファイルの更新] をクリックして、カバレッジ フィルターをテスト ファイルに追加します。
等価性のシミュレーション出力結果の確認
[結果]、[新規テスト ケース 1]、[反復 1] の順に展開し、[等価性基準の結果] を選択します。その後、組み込みのシミュレーション データ インスペクターの [比較] タブで [Outport:1] 信号を選択します。

上のプロットにノーマル モードと SIL モードの両方の出力が表示され、両者はオーバーラップしています。下のプロットは、出力信号間の差がゼロであり、ノーマル モードと SIL モードのシミュレーションが一致していることを示しています。

クリーンアップ
以下のコマンドを使用して、モデルを閉じ、テスト マネージャーを閉じてクリアします。
close_system(Model,0)
sltest.testmanager.clear
sltest.testmanager.clearResults
sltest.testmanager.close
参考
sltest.testmanager.TestFile | sltest.testmanager.TestCase | Simulink テスト マネージャー