Diff of UNIX/便利な技/テストの自動化


TITLE:テストの自動化 - テストの自動化とデバッグのコツ
#navi(UNIX/便利な技)
//ページの軽い説明
#contentsx
テストの自動化(テストケースの手入力の省略)と、デバッグのコツを解説します。

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

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


#navi(UNIX/便利な技,,footer)
xrea