PHPSpecでユニットテスト
こんにちは、牧野です。
今回は、PHPでユニットテストを行う際に便利なユニットテスト用フレームワーク、PHPSpecの紹介です。
PHPSpecは、phpで振舞駆動開発ができるようにと作られたものです。
PHPSpecの詳細はこちら
http://dev.phpspec.org/manual/ja/
日本語マニュアルが大変充実しています。
振舞駆動開発について簡単に説明すると、テストありきの開発手法であるテスト駆動開発を発展させたような開発手法で、このプログラムはこんな動作をするべきだ、という要求仕様(スペック)を、そのままテストコードとして記述しながら開発を進めていく、という感じのものです。PHPSpecのような振舞駆動開発用フレームワークでは、要求仕様がすぐわかるようなテストコードの書き方をするようになっているので開発効率が上がるようです。
ではさっそく、まずはインストールについてですが、pearコマンドを使うとすごく簡単にインストールできます。
ルートユーザで
pear channel-discover pear.phpspec.org
pear install phpspec/PHPSpec
を実行すればOKです。
使い方、というか振舞駆動開発の流れですが、
1.要求仕様を文章に直し(it should ... の形式で)、それに沿ったテストコード(スペックファイル)を作成。
2.作ったスペックファイルで正しい結果が出てくるようなプログラムを作成。
3.スペックファイルを完成させてテストを実行して、正しい結果になることを確認。
1から3の繰り返しになります。
マニュアルにわかりやすい例がいろいろ載っているので、ぜひぜひそちらを見てみて下さい。
一応、やってみると、、、
MyStringクラスという、渡した文字列をどんどんつなげていくクラスを作ることにします。
まずはスペックファイルの作成です。
DescribeMyString.php
<?php
class DescribeMyString extends PHPSpec_Context {
public function itShouldBeEmptyIfNoArgs() {
$str = new MyString();
$this->spec($str->body)->should->beNull();
}
public function itShouldBeCorrectString() {
$str = new MyString('aaa');
$str->add('bbb');
$this->spec($str->body)->should->beEqualTo('aaabbb');
}
}
?>
とりあえずこんな感じで要求仕様を表すスペックファイルを作ります。
ファイル名はDescribe~.phpに、クラス名はDescribe~にして、PHPSpec_Contextを継承させます。
メソッド名はit should ... の形式にします。これで、メソッド名を見ただけで何となく要求仕様がわかるようになります。
というか、要求仕様がわかるようなメソッド名をつけるようにします。…2つ目のメソッド名はあまりよくないかもしれません。
次に、実際にMyStringクラスを作ります。
MyString.php
<?php
class MyString {
public $body;
function MyString($string = null) {
$this->body = $string;
}
function add($string) {