TestCase supports a
$seed property. When you set this to
true and also use the
RefreshDatabase trait, it then automatically seeds your database using the default seeder.
This feature isn't exactly new. It was added in Laravel 8. But I still bump into applications where it's not being used. Instead,
$this->seed() is being called manually within the test or in the base
Why is using this new property better? Is it just about saving the need to write a few lines of code? Not at all! It's actually a huge performance improvement.
RefreshDatabase trait starts each test run with
artisan migrate:fresh and then wraps every individual test in a database transaction. At the end of each individual test execution, the transaction is rolled back, so each test runs in a pristine database. This helps a ton to reduce test flakiness.
But when using the
$seed property, it runs
artisan migrate:fresh --seed. So that seeder is only being run one time for the entire test run, not once for each individual test within the suite. As your test suite grows, you'll save more and more time with this handy feature.
If you're wondering what we put in the seeder, stay tuned for tomorrow's tip...
Here to help,
P.S. Testing is such an important topic, but we still see a lot of projects with minimal tests. If that sounds like your project, hit reply and let me know what is holding you back from writing more tests.