GAIO CLUB

2025年01月24日

カバレッジ比較 – Google Testのカバレッジ計測を試してみた #8 / 最終回

Google Test
Google Testのカバレジ計測を試してみた
今回は、LCOVとQTE(Quality Town for Embedded grade)のカバレッジを比べてみます。
前回少し触れたLCOVのブランチカバレッジについても説明します。

サンプルプログラム

評価に使用したのはC言語関数で、年月日を入力して曜日を返すものです。内容にはあまり意味がありませんが、3つの引数を受けて曜日を示す値を返します。
Google Testを使用して20件のテストデータを流し、この関数のカバレッジを計測してみました。

LCOVによる計測値

こちらは、LCOVによる計測情報です。
LCOVによる計測値
右上にあるLinesの情報がステートメントカバレッジと考えて良いでしょう。
Functions情報は関数が動いたかどうかを示しています。関数は1つしかありません。Branchesはブランチカバレッジを指しています。
いずれも100%です。

QTEによる計測値

こちらは、QTEによる計測情報です。
QTEによる計測値
最左列の行番号の隣にStatement・Branch・MC/DCの情報があります。網羅率は以下の通りです。
網羅率

計測方法の違いとLCOVの特徴

どちらも網羅率は100%なのですが、違いがあります。
計測方法の違いとLCOVの特徴
LCOV(Lines)とQTE(Statement)を比較すると、LCOVが33/33、QTEは29/29です。これは、関数の入口部分(関数定義部とオート変数定義部)を行数に入れているかどうかの違いです。
LCOV(Branches)とQTE(Branch)の比較では、LCOVが40/40、QTEは26/26です。この大きな差はブランチカバレッジの考え方の違いにあります。QTEだけが計測したMC/DCが40/40になっているのですが、実はLCOVのブランチカバレッジは一般的なC1基準ではなく、MC/DC基準で分岐を計測しています。

前回、例に示した条件文で説明します。

if ( ( a && b ) || c )
 x = y;


C1のブランチカバレッジ計測は、左のフローチャートで枝分かれする部分をどれだけ通ったか計測します。対してLCOVのブランチカバレッジは右のフローチャートの枝分かれを計測します。
つまり、C1の場合は2/2で100%、LCOVの場合は6/6で100%になります。
通過数/枝分かれ数 を計測 (枝分かれ数を分母、通過数を分子として計測)
そして、LCOVの分岐基準は変数毎に真偽値を判定するので、前回お見せしたMC/DC網羅の要素表に近づくことになります。このテストデータを使用すると、LCOVのブランチカバレッジもMC/DCも100%になります。
計測方法の違いとLCOVの特徴
しかし、2つの計測方法は異なるので、LCOVのブランチカバレッジが100%で、MC/DCが100%に満たない場合もあります。たとえば、下のテストデータです。

このテストデータでは、上の表のように a b c 個々の真偽違いによる条件式全体の真偽判定ができません。
計測方法の違いとLCOVの特徴
LCOVのブランチカバレッジはMC/DCのように条件式全体の真偽値や他の要素との関係を評価することはありませんが、条件式全体の真偽値だけを評価するC1カバレッジに比べれば内容の濃いカバレッジ計測であると言えそうです。


今回の連続コラムではGoogle TestとGoogle Mockの使い方、LOCV/QTEによるカバレッジについてお話しいたしました。お付き合いいただき、ありがとうございました。

この記事を読んだ人はこんなページを読んでいます。

筆者紹介

浅野 昌尚(あさの まさなお)

ガイオ・テクノロジー株式会社

開発1部 QTXグループ

1980年代から30年以上にわたり汎用構造のCコンパイラ開発に従事し、その間に8ビットマイコンからRISC・VLIW・画像処理プロセッサまで、さまざまなCPU向けのクロスCコンパイラを開発。

人気のコラム

最新のコラム