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両方使うのでコンパイルのコマンドはこんな感じ
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
スクリプトが最後まで走らないことがある
参考:http://sourceware.org/gdb/wiki/FAQ
スクリプトを書いたら以下のコマンドを実行
-qはロゴが出てこなくなるので、ログをとるときには便利
実行が終わったら、あとはLCOVを使うときと同じ
これでHTMLにカバレッジ結果が出力される
GDBを使うことで手入力よりはるかに簡単にカバレッジ率100%を達成することができる
スクリプトを発展させて、返り値チェックを行うことも可能なので
2つのツールだけでソースコードを汚さず単体テストができるようになる
CUnitとかと組み合わせると更に効率的かも
GDBを使った実践的デバッグ手法
¥2,310