はじめに
カバレッジの計測結果を視覚的にわかりやすく表示するツール locv を使用して関数テストをしている際、網羅していない分岐条件が判らなくなる。マニュアルやブログを探してもよくわからなかったので簡単なソースコードを作成して出力を確認をした。
環境
項目 | バージョン |
---|---|
OS | Ubuntu 22.04.4 LTS (WSL version 2) |
google test | Release v1.13.0 |
g++ | g++ 11.4.0 |
lcov | LCOV version 1.14 |
gcov | gcov 11.4.0 |
実行コマンド
以下のコマンドを実行して出力される HTML 形式のファイルを確認する。
g++ -fprofile-arcs -ftest-coverage main.cpp -pthread -lgtest_main -lgtest -lgmock
./a.out
gcov -b a-main.gcda
lcov -d . -c --rc lcov_branch_coverage=1 -o a-main.info
genhtml a-main.info --branch-coverage -o ./coverage
rm *.gcov *.gcda *.gcno *.info
実行結果
表示 | 意味 |
---|---|
+ | taken(条件を満たした) |
- | not taken(条件を満たしていない) |
# | not executed(実行されていない) |
条件が1個の場合
: bool A;
:
: A = true;
[ + - ]: if( A )
: {
: }
:
: A = false;
[ - + ]: if( A )
: {
: }
条件が2個の場合 (A && B)
条件文を単一行で記載した場合
: bool A, B;
:
: A = true; B = true;
[ + - + - ]: if( ( A ) && ( B ) )
: {
: }
:
: A = true; B = false;
[ + - - + ]: if( ( A ) && ( B ) )
: {
: }
:
: A = false; B = true;
[ - + - - ]: if( ( A ) && ( B ) )
: {
: }
:
: A = false; B = false;
[ - + - - ]: if( ( A ) && ( B ) )
: {
: }
条件文を複数行で記載した場合
: bool A, B;
:
: A = true; B = true;
[ + - ]: if( ( A )
[ + - ]: && ( B ) )
: {
: }
:
: A = true; B = false;
[ + - ]: if( ( A )
[ - + ]: && ( B ) )
: {
: }
:
: A = false; B = true;
[ - + ]: if( ( A )
[ # # ]: && ( B ) )
: {
: }
:
: A = false; B = false;
[ - + ]: if( ( A )
[ # # ]: && ( B ) )
: {
: }
条件が2個の場合 (A || B)
条件文を単一行で記載した場合
: bool A, B;
:
: A = true; B = true;
[ - + - - ]: if( ( A ) || ( B ) )
: {
: }
:
: A = true; B = false;
[ - + - - ]: if( ( A ) || ( B ) )
: {
: }
:
: A = false; B = true;
[ + - + - ]: if( ( A ) || ( B ) )
: {
: }
:
: A = false; B = false;
[ + - - + ]: if( ( A ) || ( B ) )
: {
: }
条件文を複数行で記載した場合
: bool A, B;
:
: A = true; B = true;
[ - + ]: if( ( A )
[ # # ]: || ( B ) )
: {
: }
:
: A = true; B = false;
[ - + ]: if( ( A )
[ # # ]: || ( B ) )
: {
: }
:
: A = false; B = true;
[ + - ]: if( ( A )
[ + - ]: || ( B ) )
: {
: }
:
: A = false; B = false;
[ + - ]: if( ( A )
[ - + ]: || ( B ) )
: {
: }
条件が3個の場合 (A && (B || C))
: bool A, B, C;
:
: A = true; B = true; C = true;
[ + - ]: if( ( A )
[ - + - - ]: && ( ( B ) || (C) ) )
: {
: }
:
: A = true; B = true; C = false;
[ + - ]: if( ( A )
[ - + - - ]: && ( ( B ) || (C) ) )
: {
: }
:
: A = true; B = false; C = true;
[ + - ]: if( ( A )
[ + - + - ]: && ( ( B ) || (C) ) )
: {
: }
:
: A = true; B = false; C = false;
[ + - ]: if( ( A )
[ + - - + ]: && ( ( B ) || (C) ) )
: {
: }
:
: A = false; B = true; C = true;
[ - + ]: if( ( A )
[ # # # # ]: && ( ( B ) || (C) ) )
: {
: }
:
: A = false; B = true; C = false;
[ - + ]: if( ( A )
[ # # # # ]: && ( ( B ) || (C) ) )
: {
: }
:
: A = false; B = false; C = true;
[ - + ]: if( ( A )
[ # # # # ]: && ( ( B ) || (C) ) )
: {
: }
:
: A = false; B = false; C = false;
[ - + ]: if( ( A )
[ # # # # ]: && ( ( B ) || (C) ) )
: {
: }
条件が3個の場合 (A || (B && C))
: bool A, B, C;
:
: A = true; B = true; C = true;
[ - + ]: if( ( A )
[ # # # # ]: || ( ( B ) && (C) ) )
: {
: }
:
: A = true; B = true; C = false;
[ - + ]: if( ( A )
[ # # # # ]: || ( ( B ) && (C) ) )
: {
: }
:
: A = true; B = false; C = true;
[ - + ]: if( ( A )
[ # # # # ]: || ( ( B ) && (C) ) )
: {
: }
:
: A = true; B = false; C = false;
[ - + ]: if( ( A )
[ # # # # ]: || ( ( B ) && (C) ) )
: {
: }
:
: A = false; B = true; C = true;
[ + - ]: if( ( A )
[ + - + - ]: || ( ( B ) && (C) ) )
: {
: }
:
: A = false; B = true; C = false;
[ + - ]: if( ( A )
[ + - - + ]: || ( ( B ) && (C) ) )
: {
: }
:
: A = false; B = false; C = true;
[ + - ]: if( ( A )
[ - + - - ]: || ( ( B ) && (C) ) )
: {
: }
:
: A = false; B = false; C = false;
[ + - ]: if( ( A )
[ - + - - ]: || ( ( B ) && (C) ) )
: {
: }
参考記事