Не нужно вручную заполнять базы данных в тестах
$seed
лучше ручного заполнения базы данных? Просто ли это избавление от необходимости писать несколько строк кода?Laravel TestCase
поддерживает свойство $seed
. Если установить его в true
, а также использовать трейт RefreshDatabase
, то база данных будет автоматически заполнена сидером по умолчанию.
Эта функция не так уж и нова. Она была добавлена в Laravel 8. Но я все ещё сталкиваюсь с приложениями, где она не используется. Вместо этого $this->seed()
вызывается вручную в тесте или в базовом методе setup()
.
Почему использование этого нового свойства лучше? Просто ли это избавление от необходимости писать несколько строк кода? Вовсе нет! На самом деле это огромное улучшение производительности.
Трейт RefreshDatabase
запускает каждый тест с помощью artisan migrate:fresh
, а затем оборачивает каждый отдельный тест в транзакцию базы данных. В конце выполнения каждого отдельного теста транзакция откатывается, так что каждый тест выполняется в чистой базе данных. Это помогает существенно сократить количество ошибок в тестах.
Но при использовании свойства $seed запускается artisan migrate:fresh --seed
. Таким образом, сидер запускается только один раз для всего теста, а не для каждого отдельного теста в наборе. По мере роста набора тестов вы будете экономить все больше и больше времени, используя эту удобную функцию.
Если вам интересно, что мы поместили в сидер, ждите завтрашней статьи...