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
#includeint 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が実行した行に印がついていくようですね。なので、どんなテストフレームワークでも、この方法でカバー率を算出することができそうです。