ホーム > ユーザーサポート > FAQ カバレッジマスターwinAMS
【質問】
#pragmaやinlineキーワードによってインライン展開される関数や、マクロ定義された関数を単体テストしたいのですが、どのようにすれば良いですか?
【回答】
カバレッジマスターでテスト対象関数とするためには、デバッグ情報シンボルを持つ関数オブジェクトとしてコードが生成されている必要があります。直接関数名を指定してテストを行う(スタブを作成する場合も同様)ためには、インライン展開の指定やマクロ定義の形式を外して、通常の関数としてオブジェクト化する必要があります。ただし、この場合は、実際のオブジェクト構造とは異なったコードになってしまいます。
<テストの考え方について>
インライン関数やマクロ定義されたサブ関数は、テスト対象の関数にコードが埋め込まれて1つの関数オブジェクトになっています。そのため、インライン関数やマクロ定義されたサブ関数を別の関数とはしないで、このままの状態でテストを行えば、実際のコードに最も忠実なテストになります。
インライン関数やマクロ定義されたサブ関数をテストする場合、各々のテストの考え方を示します。
■マクロ記述された関数
マクロ定義されたサブ関数部分は、テスト対象の関数の中では1つの処理(1行の実行文)として扱われ、内部のカバレッジを測定することはできません。マクロ記述された関数のカバレッジを測定したり、テスト対象関数として直接CSVからデータを与えてテストを行いたい場合は、マクロ定義を外して、通常の関数としてコンパイルして頂くしか有りません。
1つの方法としては、テスト対象関数に埋め込まれた状態でテストを行った上で、追加テストとして、マクロ定義の形式を外して関数オブジェクト化し、マクロ定義された関数のみの単体テスト、カバレッジ計測を行う方法を推奨致します。
testfunc() // テスト対象関数
{
subfunc(); // マクロ定義された関数 ←subfunc()内部のカバレッジは計測できない
}
subfunc()
{
:
}
を単独でテストしたりカバレッジ計測をするためには、マクロ定義を外す必要がある
マクロ定義の形式を外したことにより、テスト対象関数全体の機能に変化が無いことを確認する必要があれば、マクロ化の有無でのテスト対象関数のテスト結果(出力値)が一致していることを確認することを推奨致します。
testfunc() // テスト対象関数
{
subfunc(); // マクロ定義された関数
}
testfunc() // テスト対象関数
{
subfunc(); // マクロ定義を外した関数
}
上記2つのtestfunc()テスト結果が同じであることを確認することで、マクロ化の有無の影響が無いことを確認できる
■インライン化された関数
コンパイラの最適化やインライン指定によりインライン化されたサブ関数は、テスト対象の関数から駆動された場合は、埋め込みコードによるC0カバレッジ測定を適用した場合に限り、その内部のカバレッジが同時に測定されます。
ただし、この場合のサブ関数は、関数オブジェクトが生成されていないため、スタブ化したり、CSVファイルから直接データを与えてテストを行う事はできません。
埋め込みコードを適用しない場合は、上記のマクロ関数と同様にカバレッジの測定は行えません。
これらを行うためには、インライン化を外して、通常の関数としてコンパイルして頂くしか有りません。
testfunc() // テスト対象の関数
{
subfunc(); // インライン化された関数 ←subfunc()内部のカバレッジも計測される
}
ただし、
subfunc()
{
:
}
を単独でテストするためには、インライン化を外す必要がある
インライン化を外したことにより、呼び出し関数全体の機能に変化が無いことを確認する必要があれば、インライン化の有無でのテスト対象関数のテスト結果(出力値)が一致していることを確認することを推奨致します。
testfunc() // テスト対象関数
{
subfunc(); //インライン化された関数
}
testfunc() // テスト対象関数
{
subfunc(); // インライン化を外した関数
}
上記2つのtestfunc()テスト結果が同じであることを確認することで、インライン化の有無の影響が無いことを確認できる