テストでは各テスト(テストメソッド)それぞれが独立している必要があります。言い換えると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 が面倒を見切れないケースも幾つかあり、何でもかんでも独立している訳では無いのですが、それについてはまた改めて見ていきたいと思います。