2

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

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

自动测试需要:

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

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

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

4

2 回答 2

3

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

mix test --only migr

详情

标准测试应该通过

mix test --exclude migr

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


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


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

于 2019-10-03T08:04:23.310 回答
3

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

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

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

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

于 2019-10-04T17:08:44.453 回答