Как отменить изменения, внесенные в базу данных, с помощью браузера автоматизации 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, хорошим вариантом может быть сам запуск транзакции базы данных и совместное использование соединения между вашим тестом и тестируемым кодом. Таким образом, вы можете вручную выполнять откат после каждого теста.

Другие вопросы по тегам