PHPUnitのバージョン確認(もし必要なら)
下記コードをLaravelのプロジェクトルートで実行すれば良い。
# ./vendor/bin/phpunit -v
テストの作成
新しいテストケースを作成するには、次のコマンドを実行する。
デフォルトではテストはtests/Featureディレクトリへ配置される。
// テストはtests/Featureディレクトリへ配置される。
# php artisan make:test テスト名
// テストはtests/Unitディレクトリへ配置される。
# php artisan make:test テスト名 --unit
FeatureディレクトリとUnitディレクトリの違い
下記のように継承するTestCaseクラスが違う。
- Feature
Tests\TestCase を継承するので、ファサード等のLaravelの機能が利用できる。 - Unit
PHPUnit\Framework\TestCase を継承するので、ファサード等のLaravelの機能が利用できない。
規則
- クラス名は最後にTestをつける。
- メソッドはpublicにする。
- メソッド名はtestではじめる。(Laravelはスネークケースを利用している)
データプロバイダ
結論
注意点を考えると、Laravelでは使うメリットが見つからなかった。
概要
メソッド単位で作成できるし、クラス単位でも作成できる。
下記例のように、テストクラス内にデータプロバイダを作成した場合は、DataProviderクラスを利用する。
テストクラスとは別のデータプロバイダ用クラスを作成した場合は、DataProviderExternalクラスを利用する。
注意点
データプロバイダ内でファサードを利用すると、下記内容が表示され、テストが実行されない。
他にもbcryptメソッドを利用すると同じ現象が発生する。
DataProviderはPHPUnit\Framework\Attributes\DataProviderが担っているので、
おそらくLaravelの機能を利用するとテストが実行されなくなる。
INFO No tests found.
規則
- データプロバイダメソッドはpublic でstaticにする。
- メソッドの戻り値はiterableにする。(foreachでループできるものにする)
使用例
namespace Tests\Feature;
use PHPUnit\Framework\Attributes\DataProvider;
use Tests\TestCase;
class AuthServiceTest extends TestCase
{
public static function temp_provider(): array
{
return [
'first' => [1, 2, 3],
'second' => [4, 5, 6],
'third' => [7, 8, 9],
];
}
#[DataProvider('temp_provider')]
public function test_temp(int $a, int $b, int $c): void
{
echo $a.' : '.$b.' : '.$c."\n";
}
}
上記クラスが存在する状態で、下記コマンドを実行する。
# php artisan test tests/Feature/AuthServiceTest.php --filter 'test_temp'
下記の結果が表示される。
1 : 2 : 3
4 : 5 : 6
7 : 8 : 9
WARN Tests\Feature\AuthServiceTest
! temp with data set "first" → This test did not perform any assertions 0.25s
! temp with data set "second" → This test did not perform any assertions 0.12s
! temp with data set "third" → This test did not perform any assertions 0.11s
Tests: 3 risky (0 assertions)
Duration: 0.62s
setUpメソッド
テストケースの各テスト用メソッドを実行する前に実行されるメソッド。
事前準備を記述すると良い。
tearDownメソッド
テストケースの各テスト用メソッドを実行後に実行されるメソッド。
(テストが成功しても失敗しても実行される)
後片付け的なものを記述すると良い。
RefreshDatabaseトレイト
テスト用のデータベースを準備した方が開発環境を汚さずに済む。
(DBコンテナを追加し、.env.testingに記載するやり方もある)
テストケースの各テスト用メソッドを実行後に毎回DBをリセットしてくれる。
注意点
- テストケースのテスト用メソッド全てが完了後、DBのシーケンスはリセットされるが、
テストケースのテスト用メソッドごとにシーケンスはリセットされないので注意。
(テストデータにidを指定するのが無難) - このトレイトを利用すると、データベースをリセットすることができるが、
既存のデータも削除されてしまう。