第8回 UnitTestをする理由(再び) - テスト講座
TOM先生のテスト講座
Lecutures on PHP
第8回 UnitTestをする理由(再び) (その1)
バグが見つかった!!!
前回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)
コードの修正により無事テストが通りました。今回は次のような問題が発生していました。
正規表現の"$"はあくまでも行末を表しているものであり、文字列の末尾ではない。文字列の末尾ということを厳密にチェックする必要がある場合は"$"ではなく"\z"を使用する必要がある。
つまり、"$"では"\n"が含まれていてもマッチしてしまうため、今回のようなバグが出てしまったということになります。




ページのトップへ


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