如何测试 Ecto 迁移

How to test Ecto migrations

我最近在 Phoenix 应用程序中编写了一些 Ecto 迁移。
但是,我总是手动测试迁移。

随着我们的迁移变得越来越复杂并且需要更改我们的实时系统上的数据,我真的很想在部署它们之前编写自动化测试。

自动测试需要:

  1. 将数据库重置为迁移前的某个点
  2. 运行 迁移早于要测试的迁移
  3. 准备数据并插入数据库
  4. 运行迁移
  5. 验证结果符合预期
  6. 清理数据库以确保即将进行的测试不会与数据冲突

我们正在使用 ExUnit 和 ESpec,但我还没有找到一种方法来仅在特定测试之前应用一些迁移。

有没有办法为 Ecto 迁移编写自动测试?

这可以通过一些手动操作来实现。所有这些测试都应该有一个标签(例如 @tag :migr)并且应该是 运行 作为一个单独的测试通过

mix test --only migr

Details.

标准测试应该是 运行 通过

mix test --exclude migr

后者可能被设置为默认配置,对于前者我会创建 mix 别名。


然后你应该创建自己的任务,类似于ecto.migrate。它会将所有迁移汇总到指定的迁移(这可能作为参数传递)并执行您想要的测试。


旁注:测试迁移的必要性通常是代码设计的一个非常糟糕的标志。

我建议不要在迁移中加入太多逻辑。迁移应该改变数据层的结构,而不是数据本身。

解决您的问题更直接的方法是创建具有数据转换逻辑的单独模块并为此模块编写测试。然后,您可以应用迁移并单独调用您的模块以应用转换。

此外,请记住,即使您决定将应用程序回滚到以前的版本,您的应用程序也应该可以正常工作。 IE。如果要删除列,请先创建新列,然后传输数据并将应用程序切换为使用新列。在下一次部署时,您可以删除旧列。

您可以通过Mix.Task调用您的数据转换模块。