Согласно к документации «Тестирование базы данных» Я могу сбросить базу данных после каждого теста (первый вариант). Второй вариант — запустить тест с использованием транзакций. Мне кажется, это лучший подход, но если я хочу запустить с транзакцией, миграция не запускается.
Есть ли способ запустить миграцию один раз для всего процесса тестирования?
Другими словами, я хочу запустить миграцию, выполнить все тесты с транзакцией, а затем выполнить откат. Я пытался с тем, что говорит документация, но я думаю, что-то не хватает.
Похоже, сегодня с этим сталкиваются и то, что запуск миграций в сочетании с миграциями делает свое дело. Снимок моего теста выглядит следующим образом:
<?php
namespace Tests\Browser;
use App\User;
use Tests\DuskTestCase;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;
class DefaultTest extends DuskTestCase
{
use DatabaseMigrations, DatabaseTransactions;
/**
* A Dusk test example.
*
* @return void
*/
public function test_something()
{
//Add test stuff here
}
}
У меня есть несколько фабрик в моем реальном тесте, и они, кажется, проходят миграцию с данными, уничтоженными после теста, как и ожидалось.
На данный момент невозможно выполнить DatabaseTransactions в сочетании с сумраком.
https://github.com/laravel/dusk/issues/110
Создание пользовательской записи и ее использование в браузере
сделано в двух разных процессах. Это означает, что созданный пользователь является частью
транзакции базы данных, которая не зафиксирована и, следовательно, не
доступны для процесса браузера.
Миграция базы данных работает. Таким образом, вы должны использовать их. Также убедитесь, что вы используете отдельную тестовую базу данных, чтобы не связываться с вашей базой данных производства / разработки.
https://laravel.com/docs/5.4/dusk#environment-handling
Чтобы заставить Dusk использовать собственный файл среды при запуске тестов,
создайте файл .env.dusk. {environment} в корне вашего проекта.
Например, если вы будете инициировать команду dusk из своего
В локальной среде вам следует создать файл .env.dusk.local.При запуске тестов Dusk создаст резервную копию вашего файла .env и переименует ваш
Сумерки среды для .env. Как только тесты завершены, ваш .env
файл будет восстановлен.
Предоставленный ответ работает, потому что работают DatabaseMigrations. use DatabaseTransactions
не актуально.
Из того, что я понимаю, я не думаю, что транзакции могут когда-либо работать при использовании dusk, поскольку каждый запрос браузера в dusk создает отдельный экземпляр вашего приложения laravel.
Ранее phpunit создавал новое приложение в памяти как часть процесса (в setUp
/ createApplication
метод), затем протестируйте это тестирующее приложение, затем уничтожьте его и настройте следующее. Таким образом, транзакции могут быть обернуты (или только внутри) в части создания и уничтожения этого приложения, прежде чем оно установит новое соединение с базой данных для следующего теста.
В сумерках это настоящее комплексное тестирование (включая браузер, фальшивое взаимодействие с пользователем, маршрутизацию на вашем локальном компьютере и т. Д.), Что означает, что не все содержится в среде, в которой выполняются ваши тесты, как они обычно в phpunit.
Сумерки делает следующее:
.env.dusk.*
и запускает хромедрайвер (или любую другую селеноподобную вещь, которую вы используете)Стоит также отметить, что DatabaseTransactions
trait находится в пакете Foundation, а не в пакете Dusk, поэтому он не собирается / упаковывается с учетом Dusk.
Это также объясняет, почему sqlite в памяти не работает с dusk, так как один процесс не имеет доступа к памяти другого процесса.