テストの自動化 - テストの自動化とデバッグのコツ
テストの自動化(テストケースの手入力の省略)と、デバッグのコツを解説します。
プログラミングの演習において、大量のテストケースを手入力するのは大変です。そこで、標準入力の代わりにファイルからテストケースを読み込み、手入力の負担を減らす方法を解説します。
まず最初に、各演習で示されている入力ケースを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