PHPプロジェクトのテスト
PHPのテストによく使われているのはPHPUnitとPHPSpecです。基本的にPHPUnitはすべてのテストをカバーできますが、自分はPHPSpecを優先にして、PHPUnitがバックアップっていう感じで使ってます。PHPSpecはオブジェクトの挙動を検証するには得意だが、サイトのリスポンスなどのテストはちょっと苦手です。
Laravel5のテスト
LaravelではすでにUnitテスト実装済みです。PHPUnitについては公式サイトを参考してください: http://laravel.com/docs/5.0/testing
PHPSpecを使う
LaravelのEloquentモデルはちょっと特殊で、PHPSpecを使うには面倒なセッティングが必要なので、phpspec-laravelを使うのをおすすめします: https://github.com/BenConstable/phpspec-laravel
phpspec-laravelを使う
composer.json
ファイルに
{
"require-dev": {
"benconstable/phpspec-laravel": "~2.0@dev"
}
}
を追記します。
phpspec.yml
に
extensions:
- PhpSpec\Laravel\Extension\LaravelExtension
laravel_extension:
migrate_db: true
を追記します。composer update
を忘れずに!
すると、./vendor/bin/phpspec
からPHPSpecコマンドが実行できます。
PHPSpecを書いてみる
下記のコマンドでモデルを作成します。
php artisan make:model Node
すると、app/Node.php
が作成されます。次に、
./vendor/bin/phpspec describe App/Node
を叩いて、App\Node
のテストファイルを作成します。spec/NodeSpec.php
を開いて、
use PhpSpec\ObjectBehavior;
use Prophecy\Argument;
を
use PhpSpec\Laravel\EloquentModelBehavior;
にして、ObjectBehavior
のかわりにEloquentModelBehavior
を継承します:
class NodeSpec extends EloquentModelBehavior
そして、下記のコードを追加します:
public function it_has_type_of_node()
{
$this->getType()->shouldBe('node');
}
./vendor/bin/phpspec run
します。
下記の情報が表示されます(PHPSpecのバージョンによって若干変わることがあります)
- it has type of node
method App\Node::getType not found.
App\Node
にはgetType()
メソードがないってPHPSpecが
Do you want me to create `App\Node::getType()` for you?
// `App\Node::getType()`を作成してもよろしいですか?
聞いてくるので、Y
で返答すれば、app\Node.php
に下記のコードが追加されます。
public function getType()
{
// TODO: write logic here
}
// TODO: write logic here
をreturn 'node';
に書き換えます。
public function getType()
{
return 'node';
}
もう一度./vendor/bin/phpspec run
すると:
通りました!こんな感じでPHPSpecでモデルやモジュールをデザインしながらコーディングすれば,より信頼性の高いコードが書けるようになります。