Chapter 11無料公開

各テストは Laravel 的には独立している

nshiro
nshiro
2024.07.03に更新

テストでは各テスト(テストメソッド)それぞれが独立している必要があります。言い換えると1つのテストが、後の別のテストに影響を与えるようではいけません。ですが、あまり心配する必要はありません。基本的には Laravel が面倒の見てくれる範囲内では、独立しています。

簡易ですが、以下の例で確認してみましょう。Feature/ExampleTest.php を書き換えます。

    public function test_sample1(): void
    {
        $response = $this->get('/');

        dump(config('session.lifetime'));   // 現在のセッション時間を出力
        config(['session.lifetime' => 10]); // セッション時間を10分に変更
        dump(config('session.lifetime'));   // 変更後のセッション時間を出力

        $response->assertStatus(200);
    }

    public function test_sample2(): void
    {
        $response = $this->get('/');

        dump(config('session.lifetime'));  // 現在のセッション時間を出力

        $response->assertStatus(200);
    }

以下のようにして2つのテストを実行してみましょう。

php artisan test --filter sample

すると以下のように出力されます。

"120" // tests/Feature/ExampleTest.php:14
10 // tests/Feature/ExampleTest.php:16
"120" // tests/Feature/ExampleTest.php:25  ← ★ ここ。また戻っている。

   PASS  Tests\Feature\ExampleTest
  ✓ sample1                               0.06s
  ✓ sample2                               0.01s

  Tests:    2 passed (2 assertions)
  Duration: 0.09s

もし sample1 のテストの実行が sample2 でも引きずっているなら、最後は、10 と表示される所ですが、"120" と表示されています。つまり元の設定に戻っており、sample1 の実行は、sample2 には影響を与えていない事が分かります。

このように、テスト毎では各テストが独立している事が分かります。特に機能テストにおいては、各テスト毎に Laravel の世界が構築されます(ブラウザからリクエストがあった時と同じように)。機能テストは、毎回 Laravel の世界が構築されますので、単体テストに比べて、実行速度は遙かに遅くなります。

さて、基本的にはテスト間では世界が独立していると書きましたが、それは、Laravel が面倒を見てくれる範囲内に限ってです(特に機能テスト)。

Laravel が面倒を見切れないケースも幾つかあり、何でもかんでも独立している訳では無いのですが、それについてはまた改めて見ていきたいと思います。