Laravel 今後は、use RefreshDatabase; の呼び出しが不要へ(と思いきや、リバートされました…)

2021/10/01に公開

本題

(執筆時点では、まだ正式リリースではないですが、ほぼ確定という事で、無事来週(10/4~)、そのままリリースされると)

(2021.10.06 時点でこの機能(Uses LazilyRefreshDatabase by default)はリバートされました。実装はされませんでした。その前提で以下お読み下さい)

テストを書く際、DBを使う場合は、既にお決まりとなった use RefreshDatabase; の呼び出しが、今後は不要になります。
ベースクラスの tests/TestCase に加わることになりました。

abstract class TestCase extends BaseTestCase
{
    use CreatesApplication, LazilyRefreshDatabase;
}

LazilyRefreshDatabase の箇所です。これ何かと言うと、今までの RefreshDatabase が、Lazy になった版です。つまり、DB を使わない時は、マイグレーションしません。使う時になって始めてやってくれます。

LazilyRefreshDatabase のプルリクでは、「パフォーマンス大丈夫なの?」等、程よく議論となりましたが、結局採用され、で、それがベースクラスに存在する事になりました。

これで、今まで誰もが一度はやっていた(私は毎回やっていた) use RefreshDatabase; の書き忘れをしなくて良くなりました。

もっとも

もっとも、この LazilyRefreshDatabase が出る前のバージョンでも、
自分で、RefreshDatabase をベースクラスに書いてやればいいだけではありますね。

use Illuminate\Foundation\Testing\RefreshDatabase;

abstract class TestCase extends BaseTestCase
{
    use CreatesApplication, RefreshDatabase;
}

107つテストがある案件で試しましたが、スピードはそのままでした。
結局、Feature テストでは、DBを必ず使っているからですが。

なお、LazilyRefreshDatabase は、laravel /framework Ver.8.62 からで、ベースクラスに LazilyRefreshDatabase が加わるのは、laravel / laravel 8.6.3(←予想)からです。

参考リンク

[8.x] Adds new RefreshDatabaseLazily testing trait #38861
[8.x] Uses LazilyRefreshDatabase by default #5696

https://twitter.com/taylorotwell/status/1443663312361857028

Discussion