テストを“いちばん重要な財産”と考えると見えるもの

第1回 テスト“だけ”を使ってコードを再現するのは難しい?

この記事を読むのに必要な時間:およそ 9 分

まずテストを書く

さて,先ほどは「コードを書く⁠⁠→⁠テストを書く⁠⁠→⁠テストを実行する」という順番で進めました。ここで,冒頭の「いちばん重要な財産はテストであり,万一コードをすべて失ってしまったとしても,テストが無事なら元と同じ品質のコードをもう一度書くことができる」を思い出してください。さっきのテストだけで,元のコードを書き直せるでしょうか。筆者なら,ほかにドキュメント類がほしいところです。

そこでテスト駆動開発では,コードを書く前にテストを書き,テストを実行してエラーになるのを確認します。本当にこれで効果があるのか,みなさん疑問だと思いますが,せっかくですからどんな感じになるのか,見ていきましょう。

練習として,さきほどのテスト用のpdfオブジェクトに,指定したページをまとめて追加する機能を用意してみます。pagelist()では"a b c"のような値が得られました。そこで"a b c"の文字列をコンストラクタに渡すと,最初からこれらのページが作られるようにしてみましょう。最初にテストを書きますリスト4⁠。

リスト4 ページの一括生成の機能のテスト(target.php)

class	dummy_pdf {

....

        function        test2() {
                $pdf =& new dummy_pdf("a b c");
                asserteq("a b c", $pdf->pagelist());
                $pdf->pages[] =& new dummy_pdfpage("d");
                asserteq("a b c d", $pdf->pagelist());
                $pdf->pages[] =& $pdf->newPage();
                asserteq("a b c d @", $pdf->pagelist());
        }
}

実行してみましょう。

$ php run.php
.....
Expected: "a b c"
Found: ""
----
test failed.
$

しっかりエラーになりました。期待通り,ページが生成されていないためエラーになっているのがわかります。

あとは,ページを生成する処理を追加するだけですリスト5⁠。

リスト5 ページの一括生成処理(target.php)

class	dummy_pdf {
        var     $pages;
        function        dummy_pdf($s = "") {
                $this->pages = array();
                foreach (explode(" ", $s) as $name)
                        $this->pages[] =& new dummy_pdfpage($name);
        }

....

}

実行すると,さっそくテストに失敗しています。しかも,今回のテストとは別のところです。

$ php run.php
.
Expected: "a"
Found: " a"
----
test failed.
$

"a"と比較しているテストは1ヵ所だけですから,すぐに見つかります。これはどういうことかというと,引数なしのときにはdummy_pdf("")として呼び出されますが,これによってページ名""のページが生成されてしまったのが原因です。筆者の凡ミスなのですが,こういう問題を早期に見つけ出せるのは,テスト駆動の楽なところです。修正しましょうリスト6⁠。

リスト6 ページの一括生成処理の修正(target.php)

class	dummy_pdf {
        var     $pages;
        function        dummy_pdf($s = "") {
                $this->pages = array();
                if ($s != "")
                        foreach (explode(" ", $s) as $name)
                                $this->pages[] =& new dummy_pdfpage($name);
        }

....

}

もう一度実行すると,8つのテストが全部成功したことがわかります。

$ php run.php
........
test successed.
$

著者プロフィール

木元峰之(きもとみねゆき)

独立系ソフトハウスに8年間勤務,パッケージソフトの開発や記事執筆などを行う。現在はフリーのコンサルタント。SWESTなどのワークショップで分科会のコーディネータを務める。デジタル回路設計歴30年,プログラミング歴27年。

きもと特急電子設計
URL:http://business.pa-i.org/