Скидати базу між тестами. Laravel дає для цього трейти.
RefreshDatabase - стандартний вибір. Він мігрує базу один раз на прогін, а кожен тест загортає в транзакцію й відкочує її наприкінці. Швидко, бо таблиці не перестворюються.
// tests/Pest.php
pest()->extend(Tests\TestCase::class)
->use(Illuminate\Foundation\Testing\RefreshDatabase::class)
->in('Feature');
LazilyRefreshDatabase - те саме, але мігрує лише тоді, коли тест справді звернувся до бази. Тести без бази стають швидшими.
DatabaseMigrations і DatabaseTruncation скидають базу повністю: перестворюють чи очищують таблиці. Значно повільніше - потрібні, коли код сам керує транзакціями чи з'єднаннями, і обгортка RefreshDatabase йому заважає.
Що ще ділять тести, крім бази:
- кеш і сесію - у тестах їх тримають на драйвері
array, що живе один запит; - статичні властивості й синглтони, які пережили тест;
- файли - тому для дисків беруть
Storage::fake().
Ознака проблеми: тести проходять поодинці, але падають разом чи в іншому порядку.
Докладніше в документації: Скидання бази після кожного тесту