3

Я использую Play Framework 2.3 и сделал эволюцию базы данных, которая в некоторой степени задействована и требует обновления новых полей со значениями, вычисленными из старых полей (которые удаляются в процессе эволюции). Было бы неплохо проверить, что эволюция работает так, как ожидалось, то есть проверить, что новые поля заполнены правильными значениями. Тем не менее, я не смог найти оптимальную практику для тестирования эволюции базы данных. На самом деле, я даже не уверен, как применить эволюцию во время теста.Как протестировать эволюцию базы данных в Play Framework 2

Любые предложения?

ответ

1

Итак, с игрой вы можете легко написать интеграционные тесты, используя экземпляр 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, чтобы проверить густонаселенные значения.

+0

Спасибо за этот ответ, который частично решает мою проблему. Решение, однако, касается только тестирования, если эволюция вверх и вниз выполняется без ошибок. Поскольку fakeApplication с inMemoryDatabase всегда пуст, а затем применяет эволюции, которые мы не можем создать до/после тестовых случаев, которые проверяют, выполняются ли инструкции обновления и т. Д. Есть ли способ установить базу данных на определенную эволюционную ревизию, заполнить таблицу и затем запустить последующие эволюции? – plade

Смежные вопросы