Laravelでは、PHPUnitとPHPSpecの両方が最初から使えるようになっている。
Compose.jsonを見ると、
"require-dev": {
"phpunit/phpunit": "~4.0",
"phpspec/phpspec": "~2.1"
},
となっている。
###最初のテスト
####テストファイルの場所
Laraveでは、testはtestsディレクトリに置く。これは、phpunit.xmlの中で定義されているので必要に応じて変えることもできる。
####テストファイルの命名規則
・テストファイルはファイル名を、xxxTest.phpとすることでテスト対象となる。
・メソッドは、testXXXXX()とするか、@testコメントをつけておくとtestと認識される。
####テストの書き方
testsフォルダの中には、
・ExampleTest.php
・TestCase.php
の2つのファイルがあり、ExampleTest.phpは、
<?php
class ExampleTest extends TestCase {
/**
* A basic functional test example.
*
* @return void
*/
public function testBasicExample()
{
$response = $this->call('GET', '/');
$this->assertEquals(200, $response->getStatusCode());
}
}
となっており、TestCase.phpを継承しているのがわかる。Laravelにおける全てのテストはこのTestCase.phpを継承する。
####テストの実行
テストは、
アプリフォルダにおいて、./vendor/bin/phpunit
とすることで、testsフォルダ内のテストが実行される。ファイル別に実行したい場合は、
./vendor/bin/phpunit ExampleText.php
などとする。
###簡単なWebAPIのテスト
個人的に最もよく利用するWebAPIのテストを行ってみる。まず、サンプルとして、ルートに、
Route::get('apis/echo',function(){
$res['status'] = "OK";
$res['message'] = "No problem";
return Response::json($res);
});
と書いてみる。statusとしてOK。messageとしてNo problemを返す。
{"status":"OK","message":"No problem"}
SimpleApiTest.phpを作る。artisanコマンド等はないみたい。ExampleTest.phpをコピーするのが早い。
<?php
class SimpleApiTest extends TestCase {
public function testEchoApi()
{
//call $this->clientは5から廃止された?
$response = $this->call('GET', '/apis/echo');
$this->assertEquals(200, $response->getStatusCode());
$obj = $response->getData();
//response->getContent()もある
//$decode = $response->getData(true);とするとarrayで返る
$this->assertEquals("OK",$obj->status);
$this->assertEquals("No problem",$obj->message);
}
}
こんな感じで書ける。callするURLの頭は/をつけたほうがいいらしい。
responseのメソッドは
・getStatusCode()
・getContent()
・getData()
などが最低限、assertは、
・assertEquals()
があればなんとかなる!?
・assertTrue
・assertFalse
・assertNull($var)
・assertRegExp($pattern,$str)
なども。詳しくはPHPUnitのページへ。
###前処理の実行
テストに先立ち、実行したい処理があればsetUp()に書く。なお、その時は必ずparent::setUPを呼べと。
public function setUp(){
//必要らしい
parent::setUp();
//artisanコマンドの実行
Artisan::call('migrate:refresh');
Artisan::call('db:seed');
//filterが無くなったので使えない(代わりに何かある?)
//Route::enableFilters();
}
migrateなど、artisanコメンド等も実行できる。
###その他調べ物
・testの際に自動的にtest dbにする機構(laravel5からは変わった)
・Route::enableFilters()相当機能のがどうなったか