Fitnesse: тест не выполняет правильную очистку

#java #jdbc #transactions #fitnesse

#java #jdbc #транзакции #fitnesse

Вопрос:

Мы пытаемся исправить некоторые проблемы в тестовом жгуте и проблемы с конкретным тестом, который в основном проверяет функцию, которая создает объект, выполняет некоторую обработку и сохраняет ее в базе данных (да, C в CRUD).

В разделе демонтажа теста fitnesse мы выполняем оператор delete для этой записи. Однако ничего не удаляется.

Мы подозреваем, что это может быть связано с тем, что удаление выполняется до SUT фиксации транзакции. Следовательно, удалять нечего.

Чтобы попытаться исправить это, мы удаляем опрашиваемый jdbc:

 java.sql.Statement statement;
/*creates a statement*/
do{
   recordsDeleted = statement.executeUpdate("delete...");
   Thread.sleep(INTERVAL);
}while(recordsDeleted == 0);
  

Итак, здесь возникают вопросы:

  • Когда выполняется транзакция jdbc?

    В приведенном выше коде будут ли обновления выполняться в одной и той же транзакции или будет создаваться новая транзакция для каждой итерации цикла do-while? (Я склонен думать, что они будут выполнены в одной транзакции, поскольку java.sql.Connection содержит методы commit , rollback , etc ).

  • Можете ли вы предложить другое решение этой проблемы? Я бы подумал, что это довольно распространенное явление, но мои товарищи по команде не нашли никакого решения в Интернете, только предложение «опрос до его удаления или тайм-аута».

Ответ №1:

Я не вижу ничего плохого в вашем цикле изначально. Вы звоните statement.close() куда-то правильно? Я предполагаю SUT , что он находится в другом потоке или удален? Вы уверены, что ваши критерии удаления соответствуют вводимым данным? Можете ли вы проверить базу данных в другом процессе, чтобы узнать, попадает ли create в базу данных?

Что касается транзакций, это зависит от базы данных, но обычно транзакций по умолчанию нет. Обычно включена автоматическая фиксация, поэтому каждый отдельный оператор выполняется и фиксируется немедленно. Если вы хотите включить транзакции, вам нужно отключить автоматическую фиксацию, а затем вызвать databaseConnection.setSavePoint() . Транзакция фиксируется при commit() вызове. Если соединение закрыто (или rollback() вызвано), транзакция откатывается.