PHPUnitはテストツールです。よくGitHub Actionなどの自動フックと合わせて使用されていますが手動でも実行できます。自分の場合、作るべき機能をリストアップしてテストと併せて実装する時があり、そのような時には頻繁に手動でPHPUnitを実行します。
PHPUnitの動作として assert で失敗するとその時点でそのテストメソッドが終わる、というものがあります。例えば次のようになります。
public function test特定のユーザーを取得する()
{
/**
* このようなユーザー情報が取得されるとする
* $user = [
* 'userId' => 1,
* 'name' => '浜松次郎',
* 'email' => 'hamamatsu-taro@example.com',
* 'comment' => 'よろしくお願いします',
* ]
*/
$user = UserShowService::whereUserId(1)->first();
// 結果が期待した通りか検証する
$this->assertEquals(1, $user['userId']);
// ここで浜松次郎と浜松太郎が違うので止まる
$this->assertEquals('浜松太郎', $user['name']);
// ↑で止まるのでここから先のコードは実行されない
$this->assertEquals('hamamatsu-taro@example.com', $user['email']);
$this->assertEquals('よろしくお願いいたします', $user['comment']);
}
失敗が分かり切っているテストをこれ以上続けても無駄だと言わんばかりに打ち切ってきます。これはこれで便利なのですが、どの程度期待通りに動いているかわかりにくくなる時もあります。上記例では name が違った時点で止まったため、email と comment の検証ができず、正しいのか誤っているのかわかりません。このテストコードでは name についての修正が完了し、再度テストを実行してようやくわかる形です。こういった検証できるのに検証されない、といった状況を避けるちょっとした書き方を紹介します。
まとめて検証をするためのテストコード例が次です。
public function test特定のユーザーを取得するwithまとめて検証()
{
/**
* このようなユーザー情報が取得されるとする
* $user = [
* 'userId' => 1,
* 'name' => '浜松次郎',
* 'email' => 'hamamatsu-taro@example.com',
* 'comment' => 'よろしくお願いします',
* ]
*/
$user = UserShowService::whereUserId(1)->first();
// 配列としてまとめて検証するとと結果が一括でわかる
$this->assertEquals([
'userId' => 1,
'name' => '浜松太郎',
'email' => 'hamamatsu-taro@example.com',
'comment' => 'よろしくお願いいたします',
], $user);
// プロダクトコードの返り値がオブジェクトの場合は次のように書けます。
$this->assertEquals([
'userId' => 1,
'name' => '浜松太郎',
'email' => 'hamamatsu-taro@example.com',
'comment' => 'よろしくお願いいたします',
], [
'userId' => $user->userId,
'name' => $user->name,
'email' => $user->email,
'comment' => $user->comment,
]);
}
配列にまとめて期待する値を書き、配列にまとめて実際の値を書き、それらを比較することによって間違っているか合っているか判定できるのに不明のままテストが終わるのを防げます。PhpStormでこれを実行すると次のスクリーンショットのように一目で結果が分かり特に便利です。
