0

我有很长时间的测试,它调用了很多测试所有应用程序的函数。我正在寻找一种方法,在测试失败的情况下,我可以回滚自动化对测试所做的特定更改。

例如:

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 函数之前数据库上发生的所有更改。

4

1 回答 1

0

如果您使用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 或测试中执行以下操作:

setup do
  :ok = Ecto.Adapters.SQL.Sandbox.checkout(Repo)
  Ecto.Adapters.SQL.Sandbox.mode(Repo, {:shared, self()})
end

有了这个,您的所有测试都在单独的事务中运行,然后回滚。此外,上述确保所有进程使用相同的连接并查看相同的事务数据(请参阅:shared文档中的模式)。此示例取自文档,其中有更多信息。

如果您出于某种原因无法使用 Ectos 沙盒模式,一个不错的选择可能是自己启动数据库事务并共享您的测试和被测代码之间的连接。这样您就可以在每次测试后手动回滚。

于 2020-02-25T21:26:27.300 回答