なんだこれは

はてなダイアリーから移転しました。

シンプルに Cutter を実行してカバレッジをとる

Cutter という単体テストフレームワークがあるけれど、autoconf を駆使するようでよくわからない。というわけで、素で実行してみる。

準備

cutter をインストール

sudo port install cutter

テスト対象と、テスト関数をわけた方がいいけれど、これはテストだから
ひとつにまとめたファイルを用意した。

#include <cutter.h>

int add(int a, int b);
int sub(int a, int b);
void test_add(void);
void test_sub(void);

int add(int a, int b){ return a+b; }
int sub(int a, int b){ return a-b; }

void test_add(void){
	    cut_assert_equal_int(3, add(1,2));
}

void test_sub(void){
	    cut_assert_equal_int(5, sub(9,4));
}

を cutter.c とする。

cutter 用の ライブラリをおく場所をつくる。

mkdir lib

cutter でインストールされている、ライブラリやヘッダの場所を確認しておく

コンパイル

先に調べた、ライブラリやヘッダの場所にあわせて、コンパイルオプションを設定する。

gcc -shared -coverage cutter.c -o ./lib/test.so -I/opt/local/include/cutter -L/opt/local/lib -lcutter

テスト実行

cutter lib

これでテストが実行できる。

..

Finished in 0.039805 seconds (total: 0.000218 seconds)

2 test(s), 2 assertion(s), 0 failure(s), 0 error(s), 0 pending(s), 0 omission(s), 0 notification(s)
100% passed

この.は成功したテストである。

カバレッジをみる

この時点で、cutter.gcda, cutter.gcno ができているので、

gcov cutter.gcda

とすれば、

File 'cutter.c'
Lines executed:100.00% of 6
cutter.c:creating 'cutter.c.gcov'

と表示されて、cutter.c.gcov ができる。
cutter.c.gcovをlcovでみればいいかもしれないが、とりあえず開くと。

        -:    0:Source:cutter.c
        -:    0:Graph:cutter.gcno
        -:    0:Data:cutter.gcda
        -:    0:Runs:1
        -:    0:Programs:1
        -:    1:#include <cutter.h>
        -:    2:
        -:    3:int add(int a, int b);
        -:    4:int sub(int a, int b);
        -:    5:void test_add(void);
        -:    6:void test_sub(void);
        -:    7:
        1:    8:int add(int a, int b){ return a+b; }
        1:    9:int sub(int a, int b){ return a-b; }
        -:   10:
        -:   11:void test_add(void){
       13:   12:	    cut_assert_equal_int(3, add(1,2));
        1:   13:}
        -:   14:
        -:   15:void test_sub(void){
       13:   16:	    cut_assert_equal_int(5, sub(9,4));
        1:   17:}

とりあえず、カバレッジがとれていることがわかった。
でもどうして、13回も実行されているのかはさっぱりわからない。