JTA: как тестировать сбои JMS и JDBC?

в настоящее время мы работаем над тестированием поведения при сбое JTA в системе, которая получает сообщения с использованием JMS, сохраняет их и отправляет результаты с использованием другого класса.

Все это связано с помощью Spring. Текущие модульные тесты используют HSQLDB, Apache ActiveMQ и Bitronix для управления транзакциями. Успех с этим был ограничен, в основном потому, что HSQLDB не реализует транзакции XA.

Итак, вот вопрос: как лучше всего имитировать сбои базы данных в модульном тесте транзакций? Есть ли способ заставить стандартный драйвер JDBC (скажем, для Oracle) выйти из строя в середине теста?

н.б. нажатие кнопки питания не является повторяемым тестом :)


person xcut    schedule 06.12.2009    source источник


Ответы (2)


Вам нужно решить, что именно вы хотите протестировать — например, если вы хотите проверить, как Oracle будет вести себя в транзакции XA с Bitronix, то имитирование DAO, предложенное duffymo, вам не поможет. В таком случае вам нужно найти способ разорвать соединение в середине транзакции, а затем посмотреть, как Bitronix/Oracle справится с восстановлением — например. эвристические результаты и так далее.

Обратите внимание, что во многих случаях есть способы получить ту же функциональность без фактического использования транзакций XA. Это может быть проще, быстрее и более проверяемым. Например, в очень распространенном случае, когда сообщения потребляются из MOM, а DML выполняется в базе данных, существует общий шаблон того, как обойтись без XA, даже если обновляются два менеджера ресурсов.

person maximdim    schedule 06.12.2009
comment
Неплохие комментарии, за исключением того, что в них отсутствуют предложения :) У вас есть ссылка на общий шаблон, на который вы ссылаетесь? Кроме того, есть ли какие-либо предложения о том, как принудительно прерывать соединение повторяемым образом в модульном тесте? - person xcut; 08.12.2009
comment
Описание шаблона: oracle.com /technology/pub/articles/dev2arch/2006/01/ Что касается разрыва соединения, это снова зависит от вашей конкретной настройки — например, вы можете запускать свои тесты в виртуализированной среде (VMWare) и отключать сетевой интерфейс от хост-системы. , либо просто перевернуть правило брандмауэра, либо подключиться через прокси и убить его в процессе. - person maximdim; 08.12.2009

Напишите фиктивный объект для теста, реализация которого выдает исключение в середине транзакции.

Поскольку вы используете Spring, легко написать новую тестовую реализацию интерфейса DAO, которая ведет себя повторяемым и предсказуемым образом. Введите «шаткий DAO» только для теста.

Конечно, вы используете драйвер XA для подключения к базе данных. В противном случае двухфазная фиксация не будет работать.

person duffymo    schedule 06.12.2009
comment
Неплохая идея с точки зрения тестирования логики приложения и диспетчера транзакций, но она не проверяет корректное поведение драйвера базы данных. Так что я проголосую за это, но ждите дальнейших идей. - person xcut; 08.12.2009