【问题标题】:ExUnit - Running DB setup code once, before all testsExUnit - 在所有测试之前运行一次数据库设置代码
【发布时间】:2016-11-18 16:29:56
【问题描述】:

早上好,

我的 Elixir 项目中有一些特别昂贵的数据库设置代码,用于将所需的数据插入数据库。

我目前正在运行我的测试,以便在任何需要它的测试之前通过 @tag :insert_my_data 构造插入此数据。我的测试助手中有代码,它执行以下操作:

setup tags do
  if tags[:insert_my_data] do
    # Run code here
  end
end

问题在于我必须运行此代码数百次,而且速度很慢。

如果代码在任何 mix test 调用之前自动运行一次,并且 Ecto 提供的事务回滚功能将重置为这个已知状态(而不是空数据库),那么效果会更好。

我怎样才能做到这一点?

谢谢!

【问题讨论】:

  • 也许setup_all 会有所帮助? elixir-lang.org/docs/v1.3/ex_unit/…
  • @Dogbert 可以在setup_all 中使用应用程序代码和数据库插入吗?还是setup_all 的其他限制?我现在记不清了,但我觉得我看过这个。
  • @Dogbert 似乎setup_all 在每个测试用例开始时运行。我想在测试“套件”开始时运行一次代码 - 而且只运行一次。
  • 你的用例是什么?
  • 您可以为您的 mix 任务创建一个别名 - 并且可以在那里完成此 db-refresh。它适用于单个测试或任何一组测试作为一个整体。例如,我的mix.exs 文件有:``` defp aliases do [ "ecto.seed": "run priv/repo/seeds.exs", "ecto.setup": ["ecto.create", "ecto .migrate", "ecto.seed"], "ecto.reset": ["ecto.drop", "ecto.setup"], 测试: ["ecto.drop", "ecto.create --quiet", " ecto.migrate", "test"], commit: ["format", "deps.get --only #{Mix.env()}", "coveralls.html", "credo --strict"] ] end ` ``

标签: elixir ex-unit


【解决方案1】:

我知道这是一个老问题,但这是一个很好的问题,它仍然会出现在网络搜索结果中。

在执行任何测试之前运行回调的另一种方法是将其放入test/test_helper.exs 文件中。默认只包含

ExUnit.start()

并且它将在测试运行之前执行一次,无论是仅运行 mix test 还是使用类似 mix test test/path/to/file_test.exs:42 的测试子集。

如果您只针对测试运行,我觉得它比修改别名更干净。

【讨论】:

    猜你喜欢
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-07
    • 1970-01-01
    • 2023-01-12
    相关资源
    最近更新 更多