GDBとLCOVで自動テスト

ちょっと前に扱ったLCOVを使いつつ、代表的なデバッグツールであるGDBを組み合わせて効率的にテストを行う
LCOVはちょっと前に説明したので、今回はGDBを重点的に
前回の記事:gcovとlcov
GDBはここが非常に参考になりました
http://www.fireproject.jp/feature/gdb/advanced/auto-test.html


今回のテスト対象

#include<stdio.h>

int func1(int x)
{
  int result=-1;

  switch(x){
      case 0:{
        result=1;
        break;
      }
      case 1:{
        result=3;
        break;
      }
      case 2:{
        result=5;
        break;
      }
      default:{
        result=-1;
        break;
      }
  }
  return result;
}

int main()
{
  int res;

  res=func1(1);
  printf("%d\n",res);

  return 0;
}


今回はGDBとLCOV両方使うのでコンパイルのコマンドはこんな感じ

gcc -g -coverage -o hoge hoge.c

GDBで自動テストをする場合は、コマンドラインを並べたファイルを用意しておいて
-xオプションをつけてやればいい
今回用意したスクリプトファイル(test-pattern1)

set pagination 0
#ブレイクポイントの設定
break func1
#プログラムを走らせる
run
#ブレイクしたら値を書き換える(この場合、x=0に書き換える)
print x=0
#最後まで実行
continue
#頭文字だけでもコマンドは認識される
r
p x=1
c
r
p x=2
c
r
p x=3
c
quit

先頭の「set pagination 0」を付けないと「Type to continue, or q to quit」が出てきて
スクリプトが最後まで走らないことがある
参考:http://sourceware.org/gdb/wiki/FAQ

スクリプトを書いたら以下のコマンドを実行

gdb hoge -q -x test-pattern1

-qはロゴが出てこなくなるので、ログをとるときには便利


実行が終わったら、あとはLCOVを使うときと同じ

lcov -c -d . -o hoge.info
genhtml -o . hoge.info

これでHTMLにカバレッジ結果が出力される


GDBを使うことで手入力よりはるかに簡単にカバレッジ率100%を達成することができる
スクリプトを発展させて、返り値チェックを行うことも可能なので
2つのツールだけでソースコードを汚さず単体テストができるようになる
CUnitとかと組み合わせると更に効率的かも

GDBを使った実践的デバッグ手法

GDBを使った実践的デバッグ手法
¥2,310