ソフトウェアエンジニア現役続行

雑多なことを綴ります

gcovを使ってテストカバー率を測定する

gcovというツールを使ってC言語のテストカバー率を測定することができます。gcovはgccパッケージに同梱されています。

たとえば次のようにHoge.cをtestHoge.cでテストするとき↓


[Oswald@fedora14 tmp]$ cat Hoge.c
int plus1(int i)
{
return i+1;
}

int minus2(int i)
{
return i-2;
}


[Oswald@fedora14 tmp]$ cat Hoge.h
int plus1(int i);
int minus2(int i);


[Oswald@fedora14 tmp]$ cat testHoge.c
#include "Hoge.h"
#include
#include

int main(void)
{
assert(11 == plus1(10));
printf("Test Finished!\n");
return 0;
}

コンパイルオプションに-fprofile-arcs -ftest-coverageをつけて、gcovをリンクしてコンパイルします↓


[Oswald@fedora14 tmp]$ gcc -fprofile-arcs -ftest-coverage -lgcov -o testHoge Hoge.c testHoge.c

コンパイルしたテストプログラムを実行します↓


[Oswald@fedora14 tmp]$ ./testHoge
Test Finished!

gcovコマンドで、テストされたクラスを指定すると、「テスト対象のコードは4行で、そのうち50%がテストされた」と出力されます↓


[Oswald@fedora14 tmp]$ gcov Hoge
File 'Hoge.c'
Lines executed:50.00% of 4
Hoge.c:creating 'Hoge.c.gcov'

また、Hoge.c.gconvというファイルが作成されていて、ここでテストされたところ・されていないところが分かります↓


[Oswald@fedora14 tmp]$ cat Hoge.c.gcov
-: 0:Source:Hoge.c
-: 0:Programs:2
1: 1:int plus1(int i)
-: 2:{
1: 3: return i+1;
-: 4:}
-: 5:
#####: 6:int minus2(int i)
-: 7:{
#####: 8: return i-2;
-: 9:}

「#####」の部分がテストされていないところです。

単純にCPUが実行した行に印がついていくようですね。なので、どんなテストフレームワークでも、この方法でカバー率を算出することができそうです。