Как отменить изменения, внесенные в базу данных, с помощью браузера автоматизации Wallaby
Я долго тестировал, вызывая множество функций, тестирующих все приложение. Я ищу способ, которым в случае сбоя теста я могу откатить определенные изменения, которые автоматизация внесла в тест.
Например:
test "add user and login", session do
session
|> add_user()
# There can be more functions here...
end
def add_user(session, loops // 2) do
try do
session
|> visit("example.com")
|> fill_in(css("#user_name", with "John Doe")
|> click(css("#add_user_button"))
|> assert_has(css("#user_added_successfully_message")
rescue
msg -> if loops > 0, do: add_user(session, loops - 1), else: raise msg
end
end
В случае сбоя функции assert_has (пользователь дополнил, но сообщение не отображается), я хочу откатить все изменения, которые произошли в базе данных до того, как функция add_user вызвалась снова при спасении.
1 ответ
Если вы используете Ecto
чтобы получить доступ к БД повсюду, вы можете использовать ее режим песочницы.
Скорее всего, вы захотите настроить пул песочницы в своем config/test.exs
(если еще не было):
config :my_app, Repo, # my_app being the name of the application that holds the Repo
pool: Ecto.Adapters.SQL.Sandbox
Затем в вашем test_helper или tests сделайте что-то вроде этого:
setup do
:ok = Ecto.Adapters.SQL.Sandbox.checkout(Repo)
Ecto.Adapters.SQL.Sandbox.mode(Repo, {:shared, self()})
end
При этом все ваши тесты запускаются в отдельных транзакциях и впоследствии откатываются. Кроме того, это гарантирует, что все процессы используют одно и то же соединение и видят одни и те же данные транзакции (см.:shared
режим в документации). Этот пример взят из документации, где есть дополнительная информация об этом.
Если по какой-либо причине вы не можете использовать режим песочницы Ectos, хорошим вариантом может быть сам запуск транзакции базы данных и совместное использование соединения между вашим тестом и тестируемым кодом. Таким образом, вы можете вручную выполнять откат после каждого теста.