テストの自動化 - テストの自動化とデバッグのコツ

Top > UNIX > 便利な技 > テストの自動化

テストの自動化(テストケースの手入力の省略)と、デバッグのコツを解説します。

プログラミングの演習において、大量のテストケースを手入力するのは大変です。そこで、標準入力の代わりにファイルからテストケースを読み込み、手入力の負担を減らす方法を解説します。

まず最初に、各演習で示されている入力ケースをemacsなどでファイルにコピーアンドペーストしておきます。例えば、以下のようなファイルを作っておきます。

% cat b1in.txt
5 100
p1 150
p2 80
p3 200
p4 350
p5 20

そして、事前にコンパイルして生成した実行可能ファイル(a.out)に、以下のようにリダイレクトしてファイルを読み込ませます。

% ./a.out < b1in.txt
p2 180
p5 400
p1 450
p3 550
p4 800

このようにして、テストケースの手入力の負担を減らすことができます。

さらに、出力結果の確認も、以下のように自動化できます。まず、出力例をファイルにemacs経由でコピーアンドペーストします。具体的には、以下のようのファイルを作っておきます。

% cat b1out.txt
p2 180
p5 400
p1 450
p3 550
p4 800

そして、以下のコマンドを実行してプログラムの出力結果とb1out.txtのファイルの差分をチェックします。差分がなければ(何も出力されなければ)、出力結果が期待通りであることを意味します。

% diff <(./a.out < b1in.txt) <(cat b1out.txt)

最後に、デバッグのコツ(アサーション)を解説します。以下のように、fprintf文を指定すると、行番号と確認したい変数を出力することができます。

void enqueue(P x){
  fprintf(stderr, "%d: tail=%d x.name=%s  x.t=%d \n"
     ,__LINE__ ,tail   ,x.name    ,x.t);

出力例は以下のようになります。__LINE__が行番号を示しており、複数のアサーションがある場合も検索しやすくなります。

% ./a.out < b1in.txt 
15: tail=5 x.name=p1  x.t=50 
p2 180
15: tail=6 x.name=p3  x.t=100 
15: tail=7 x.name=p4  x.t=250 
p5 400
p1 450
p3 550
15: tail=8 x.name=p4  x.t=150 
15: tail=9 x.name=p4  x.t=50 
p4 800

xrea