LaravelでのPHPUnit関連の個人的まとめ

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を指定するのが無難)
  • このトレイトを利用すると、データベースをリセットすることができるが、
    既存のデータも削除されてしまう。

コメント

タイトルとURLをコピーしました