Fitnesse: тест не правильно делает уборку - PullRequest
0 голосов
/ 25 октября 2011

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

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

Мы подозреваем, что это может быть потому, что tearDown выполняется до того, как 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 Ответ

1 голос
/ 26 октября 2011

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

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

...