第8回 UnitTestをする理由(再び) - テスト講座

PHP基礎編

TOM先生のテスト講座

Lecutures on PHP

第8回 UnitTestをする理由(再び) (その1)

 このエントリーをはてなブックマークに追加

バグが見つかった!!!

TOM先生前回7桁の数字をチェックするValidatorクラスをDocTestを使いながら開発しましたが、以下のようなバグが発見されました。

7桁の数字の後ろに改行が入っていてもチェックを通ってしまう

これはテストのパターンが足りなかったということですね。ではテストパターンを追加してみましょう。

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

ではDocTestを実行してみましょう。

実行手順1 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:26
C:\usr\local\php5\PEAR\Maple4\DocTest\Runner.php:144
C:\usr\local\php5\PEAR\Maple4\DocTest.php:120
C:\Temp\phppro\doctest.php:18
 
FAILURES!
Tests: 1, Failures: 1.

やはり期待通りの動作をしませんね。では、正しくテストが通るようにコードを変更しましょう。

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

コードを修正したのでDocTestを実行してみましょう。

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

TOM先生コードの修正により無事テストが通りました。今回は次のような問題が発生していました。

正規表現の"$"はあくまでも行末を表しているものであり、文字列の末尾ではない。文字列の末尾ということを厳密にチェックする必要がある場合は"$"ではなく"\z"を使用する必要がある。

つまり、"$"では"\n"が含まれていてもマッチしてしまうため、今回のようなバグが出てしまったということになります。



Pick Up Q&A

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

>>続きを読む

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

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