第7回 DocTestを使ってUnitTestをやってみよう - テスト講座

PHP基礎編

TOM先生のテスト講座

Lecutures on PHP

第7回 DocTestを使ってUnitTestをやってみよう (その3)

 このエントリーをはてなブックマークに追加
実行手順11 DocTestの実行
C:\Temp\phppro>php doctest.php classes
PHPUnit 3.2.21 by Sebastian Bergmann.
 
F

Time: 0 seconds
 
There was 1 failure:
 
1) testValidate(Maple4_DocTest_NumberValidatorTest)
Failed asserting that <boolean:true> is false.
C:\Temp\phppro\tests_c\Maple4_DocTest_NumberValidatorTest.php:22
C:\usr\local\php5\PEAR\Maple\DocTest\Runner.php:142
C:\usr\local\php5\PEAR\Maple\DocTest.php:128
C:\Temp\phppro\doctest.php:18
 
FAILURES!
Tests: 1, Failures: 1.

これが郵便番号7桁のチェックだとしたら大問題ですね。なぜ今回期待通りに動作しなかったかというと、is_numericは数値として正しいかをチェックする関数だからです。-123456や123.456は数値としては正しい値で、しかも7桁になってしまったので、本来falseを返してほしいのに、今回validateメソッドはtrueを返してしまったわけです。

「回りくどいコードを書いているなぁ」と思われた方がたくさんいたと思いますので、最後に簡潔に書いてみましょう。

コード7 正しく数字7桁をチェックするようにする
<?php
class NumberValidator
{
    /**
     * 7桁の数字かどうかをチェックする
     *
     * #test
     * <code>
     * #true(#f(1234567));
     * #false(#f(123456));
     * #false(#f(12345678));
     * #false(#f(-123456));
     * #false(#f(123.456));
     * </code>
     *
     * @param integer $value チェックしたい文字列
     * @return boolean チェック結果
     * @access public
     */
    public function validate($value)
    {
        if (preg_match('/^\d{7}$/', $value)) {
            return true;
        } else {
            return false;
        }
    }
}

ではDocTestを実行してみましょう。無事全てのテストが通りますね。

実行手順12 DocTestの実行
C:\Temp\phppro>php doctest.php classes
PHPUnit 3.2.21 by Sebastian Bergmann.
 
.
 
Time: 0 seconds
 
 
OK (1 test)

TOM先生最後に正規表現でチェックをするところに落ち着きましたが、今回は比較的簡単な正規表現なので、それほど不安はありませんが、複雑な正規表現を書く必要があった場合、「その正規表現が本当にあってるのかな?」と不安になりますよね?

DocTestを使ってテストを書きながら開発を進めれば、その不安がかなり軽減されます。思いつくパターンをテストとして書いておいてDocTestを実行すれば正しく動作するかはいつでも確かめることができます。また、将来的にコードを変更する必要が出た場合にも以前書いたテストがその変更で影響が出てないかを教えてくれます。つまり安心して大胆な変更ができるようになります。

ここまでの手順をMacで実行したムービーが次のものになります。残念ながらWindowsのコマンドプロンプトでは実行結果に色がつかないのですが、*nix環境やMacでは色をつけることができるので、より成功失敗が実感できますよ。



可能であればここまでの手順はご自分で実行してみてください。DocTestを使った開発フローが今までとは少し違うことを体感いただけると思います。

より楽しくするために

今回はDocTestのインストールからDocTestを使った簡単な開発フローを解説しました。DocTestには開発をより楽しくするための仕掛けが入っていますので、それは次回説明したいと思います。

次回説明するものを導入すると次のような動作になりますよ。


今回のまとめ

  • PHPUnitやSimpleTestを使ったUnitTestはそれを行うために別ファイルを作る必要がある。(最初は少し面倒に感じる)
  • 面倒だと思うことは長続きしないため、UnitTestもなかなか習慣にならない。
  • 面倒さを軽減しようと開発しているのがDocTest。
  • テストを書くと不安がかなり軽減される。
  • 不安が解消されると開発は楽しくなる。

次回は?

TOM先生次回はDocTestのもう少し詳細なルールの紹介と、Growlを使ってテスト結果を見やすくする方法などを解説します。併せてUnitTestの効果をさらに説明します。




  • TOM先生

本名:小林智樹

ソリッド・ブルー株式会社 代表取締役CTO http://solidblue.jp/
Mapleプロジェクト コミッター http://kunit.jp/maple/

SI企業にて、運用保守担当として大手企業や各省庁の大規模システムを支える。
その後、起業・独立し、現在はソリッド・ブルー株式会社のCTOとして、PHPを中心とした技術戦略の立案などを行っている。また、PHPフレームワークMapleプロジェクトの一員として、RESTfulやTDDについて普及活動を展開している。

ご意見・感想フォーム

今回の「TOM先生のテスト講座」への評価・ご意見があればご記入下さい。

評価:
ご意見・感想:



Pick Up Q&A

Q
動的なURLを静的に見せる方法
 このエントリーをはてなブックマークに追加 
A
普通に考えて、mod_rewrite でしょうね。 http://www.nishishi.com/blog/2006/01/mod_rewrite_url.html...

>>続きを読む

GETのままでは検索エンジンのロボットが拾ってくれなかったためにSEO対策として有効だと言われていますね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)