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