More Related Content More from Hiromu Shioya (20) PHPによるユニットテスト入門6. 1-2.具体的にどうする
• 現在は何らかのツール(テスティングフレーム
ワーク)を利用してテストケースを作成して行うの
が主流。
• ここで言うテストケースとは
– テストを行う際に、プログラムにどのような入力を与え、
その結果としてどのような出力が得られるべきかを記
述したもの(Wikipedia「テスト自動化」より)。
– 後述のPHPUnitであれば、それをクラスとして実装す
る。
9. • PHPUnit
– xUnitファミリーに分類される代表的なフレームワーク。
• xUnitはSmalltalk用のSUnitから派生した。
• 中でもJAVA用のJUnitがおそらく一番有名。
– バージョン2.3以降はPHP5専用(現在の安定版は3.3)
– 現在も活発に開発されている(次期バージョンは4.0)
– 今回扱うのはこれ!
• SimpleTest
– こちらも同じxUnit系。
– PHPUnitと何が違う?
• こめんなさい、まだ試してません・・・。
– PHP4でも動作するらしい。
– 2008年4月以降、リリースが滞っているようです。
10. • lime
– WEBアプリケーションフレームワーク「Symfony」に
同梱されている。
– PHPUnitやSimpleTestより単純なテストを前提とし
ており、導入コストが低いらしい。
• ごめんなさい、これもちゃんと調べてないので・・・
– 詳しくはSymfonyユーザーに聞こう。
11. • DocTest(Maple4_DocTest)
– テストケースをソースコードのコメントに特殊な記法で
記述するという形式。
– Pythonでは標準のフレームワークで、それを移植し
た物。
– 幾つか実装があるようだが、 Maple4_DocTestが有
力。実は裏ではPHPUnitを利用している。
– 少しだけ試してみた所、複雑なテストケースは記述し
づらいと思ったが、ソースコードと同じファイルに直接
書ける手軽さは魅力に感じた。
– 反面、ソースコード中にテストコードが混在するのと等
しいので、ソースの可読性は落ちる。トレードオフをよく
考えるべき。
13. 3-1.インストール
• PEARを利用する
– PEARチャネルの変更
# pear channel-discover pear.phpunit.de
– PEARコマンドでインストール
# pear install phpunit/PHPUnit
• 簡単!
※Windowsの場合はPEAR自体の準備もしないといけ
ないですが・・・
14. 3-2.テストケースの作成
• 実装する(あるいは既にしてある)クラスの仕様に合わせ
てテストクラスを作成する。
– 例えば「Class」という名前のクラスのテストは、「ClassTest」とい
う名前のクラスに記述する。
– テストクラスはほとんどの場合、
PHPUnit_Framework_TestCaseクラスを継承して作成
– テストは、「test****()」という名前のpublicメソッドとして実装す
るか、メソッドのコメントにアノテーション「@test」 を宣言する。
– テストメソッドの中で「assert****()」のようなアサーションメソッ
ドを使用して、出力が期待通りであるか確かめる。
15. 3-3.まずは書き方
• テスト対象は以下のクラス
<?php
class Counter
{
private $count = 0;
// $count を1増加させる(はずだが見てのとおり実際は何もしてない)
public function increment() {
;
}
// 現在のカウントを返す
public function count() {
return $this->count;
}
}
?>
16. • テストクラスは以下のとおり
<?php
require_once ‘PHPUnit/Framework.php’; ①
require_once ‘Counter.php’; ②
class CounterTest extends PHPUnit_Framework_TestCase ③
{
// カウントが0である事を検証するテストメソッド
public function testCountIsZero() ④
{
$counter = new counter();
$this->assertEquals(0, $counter->count()); ⑤
}
}
?>
18. 3-4.テストの実行
• テストはphpunitコマンドで実行
– テストクラスのファイル名が「クラス名.php」の場合はク
ラス名だけを引数として渡す。
$ phpunit CounterTest
– テストクラス名とファイル名が異なる場合はファイル名
も指定する。
$ phpunit CounterTest CounterTest1.php
20. 3-6.テストケースの追加
• 仕様通りなら以下のケースを追加しても成功する
はず
// カウントが1だけ増加した事を検証するテストメソッド
public function testCountIncrementOnce()
{
$counter = new counter();
$counter->increment();
$this->assertEquals(1, $counter->count()) ;
}
21. 3-7.テスト結果2
• 失敗した場合の結果
PHPUnit 3.3.15 by Sebastian Bergmann.
.F
Time: 0 seconds
There was 1 failure:
1) testCountIncrementOnce(CounterTest)
Failed asserting that <integer:0> matches expected value <integer:1>.
/home/katsumi/div3-sys_workshop/ex/CounterTest2.php:22
FAILURES!
Tests: 2, Assertions: 2, Failures: 1.
22. 3-8.バグ修正
• なぜ失敗したかと言えば
– 見ての通り、incrementメソッドの不備が原因
• 以下のように実装すればもちろん解決
// $count を1増加させる
public function increment () {
$this->count++;
}
25. 本日のまとめ
• テスティングフレームワークを利用するとテスト
ケースの作成も楽になり、ユニットテストを容易に
できる。
• PHPUnitもごく簡単なテストケースならすぐに作
成できる。
• ただし、実際に活用するなら開発の前に仕様をで
きるだけ明確化しておくことが望ましい。
• そうすれば最初から多くのテストケースを準備す
る事ができる → テスト駆動開発へ。
27. 参考資料
• PHPUnit公式サイトマニュアル
– http://www.phpunit.de/manual/3.3/ja/index
.html
• PHPプロ!の記事
– http://www.phppro.jp/school/test/
• gihyo.jpの記事
– http://gihyo.jp/dev/feature/01/php-test