如何在 Play Framework 2 中测试数据库演化

Posted

技术标签:

【中文标题】如何在 Play Framework 2 中测试数据库演化【英文标题】:How to test database evolutions in Play Framework 2 【发布时间】:2015-11-16 11:15:08 【问题描述】:

我正在使用 Play Framework 2.3 并进行了数据库演进,这在一定程度上涉及并需要使用从旧字段(在演进中删除)计算的值更新新字段。测试进化是否按预期工作会很好:也就是说,检查新字段是否填充了正确的值。但是,我还没有找到测试数据库演变的最佳实践。事实上,我什至不确定如何在测试中应用进化。

有什么建议吗?

【问题讨论】:

【参考方案1】:

因此,通过 Play,您可以使用 FakeApplication 的实例轻松编写集成测试。有关基本信息,请参阅 https://www.playframework.com/documentation/2.2.x/JavaTest。

您还可以设置自定义 Evolution 实例,以在您的测试中使用。

这里只是一个简单的java例子:

@Before
public void setUp() throws IOException 
  fakeapp = Helpers.fakeApplication(testconfiguration)
  evolutions = Evolutions.applicationEvolutions(fakeapp.getWrappedApplication().path(), fakeapp.getWrappedApplication().classloader(), "database");
  Iterator<Evolution> iterator = evolutions.iterator();

  while (iterator.hasNext()) 
    Evolution current = iterator.next();
    if (latestEvolution == null) 
      latestEvolution = current;
     else 
      latestEvolution = current.revision() > latestEvolution.revision() ? current : latestEvolution;
    
  

  latestEvolutionFile = new File(fakeapp.getWrappedApplication().path(), "path/to/evolution/files" + latestEvolution.revision() + ".sql");
  latestEvolutionFileContent = Files.readAllBytes(Paths.get(latestEvolutionFile.getAbsolutePath()));


@Test
public void testLatestDownEvolution() throws IOException 
  try 
    // arrange
    // modify the latest evolution file, so when executing the evolution plugin a 2nd time the latest evolution file will be applied again
    Evolutions.updateEvolutionScript("database", latestEvolution.revision(), "", "", "", fakeapp.getWrappedApplication());

    // act
    app.getWrappedApplication().plugin(EvolutionsPlugin.class).get().onStart();

    // when no exception has been thrown, then we are fine

   catch (InconsistentDatabase ex) 
    Assert.fail(ex.subTitle() + " " + ex.rev() + ".sql");
   finally 
    // just bring the modified script back to his original content, cause we don't want to commit that in our VCS...
    try (FileOutputStream stream = new FileOutputStream(latestEvolutionFile)) 
    stream.write(latestEvolutionFileContent);
  

运行进化测试后,您可以使用简单的 ebean 查询编写测试用例来检查填充的值。

【讨论】:

感谢您的回答,这部分解决了我的问题。然而,该解决方案仅解决了上下演进执行是否没有错误的测试。由于带有 inMemoryDatabase 的 fakeApplication 总是从空开始,然后应用我们无法在测试用例之前/之后创建的演变,以检查更新语句等是否正确执行。有没有办法将数据库设置为某个进化版本,填充一个表,然后运行后续的进化?

以上是关于如何在 Play Framework 2 中测试数据库演化的主要内容,如果未能解决你的问题,请参考以下文章

Play framework & CAS - 如何登录功能测试?

java 如何使用Play Framework 2.5测试具有多部分数据的路径

Play Framework 2.4.1:在测试模式下忽略 play.application.loader 设置

如何使用 Jenkins 在本地自动部署 Play Framework (2.4) 应用程序?

如何将 IntelliJ 与 Play Framework 和 Scala 一起使用

迁移到 2.4.x (Java) 后在 Play Framework 中运行测试时出错