第7回 DocTestを使ってUnitTestをやってみよう - テスト講座
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)
最後に正規表現でチェックをするところに落ち着きましたが、今回は比較的簡単な正規表現なので、それほど不安はありませんが、複雑な正規表現を書く必要があった場合、「その正規表現が本当にあってるのかな?」と不安になりますよね?
DocTestを使ってテストを書きながら開発を進めれば、その不安がかなり軽減されます。思いつくパターンをテストとして書いておいてDocTestを実行すれば正しく動作するかはいつでも確かめることができます。また、将来的にコードを変更する必要が出た場合にも以前書いたテストがその変更で影響が出てないかを教えてくれます。つまり安心して大胆な変更ができるようになります。
ここまでの手順をMacで実行したムービーが次のものになります。残念ながらWindowsのコマンドプロンプトでは実行結果に色がつかないのですが、*nix環境やMacでは色をつけることができるので、より成功失敗が実感できますよ。
可能であればここまでの手順はご自分で実行してみてください。DocTestを使った開発フローが今までとは少し違うことを体感いただけると思います。
より楽しくするために
今回はDocTestのインストールからDocTestを使った簡単な開発フローを解説しました。DocTestには開発をより楽しくするための仕掛けが入っていますので、それは次回説明したいと思います。
次回説明するものを導入すると次のような動作になりますよ。
今回のまとめ
- PHPUnitやSimpleTestを使ったUnitTestはそれを行うために別ファイルを作る必要がある。(最初は少し面倒に感じる)
- 面倒だと思うことは長続きしないため、UnitTestもなかなか習慣にならない。
- 面倒さを軽減しようと開発しているのがDocTest。
- テストを書くと不安がかなり軽減される。
- 不安が解消されると開発は楽しくなる。
次回は?
次回はDocTestのもう少し詳細なルールの紹介と、Growlを使ってテスト結果を見やすくする方法などを解説します。併せてUnitTestの効果をさらに説明します。
その他の記事も見る
- 第1回 "テスト"ってどんなイメージ?
- 第2回 テストの目的と種類
- 第3回 結合テストをする理由
- 第4回 Seleniumの実行環境を作ってみよう
- 第5回 Seleniumでのテストの記述方法
- 第6回 UnitTestをする理由
- 第7回 DocTestを使ってUnitTestをやってみよう
- 第8回 UnitTestをする理由(再び)
- >>「TOM先生のテスト講座」一覧ページに戻る
- TOM先生
本名:小林智樹
ソリッド・ブルー株式会社 代表取締役CTO http://solidblue.jp/
Mapleプロジェクト コミッター http://kunit.jp/maple/
SI企業にて、運用保守担当として大手企業や各省庁の大規模システムを支える。
その後、起業・独立し、現在はソリッド・ブルー株式会社のCTOとして、PHPを中心とした技術戦略の立案などを行っている。また、PHPフレームワークMapleプロジェクトの一員として、RESTfulやTDDについて普及活動を展開している。





ページのトップへ


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