4

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

有什么建议么?

4

1 回答 1

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 查询编写测试用例来检查填充的值。

于 2015-12-04T09:59:04.737 回答