2012-03-13 3 views
2

У меня есть набор устаревших модульных тестов, большинство из которых - тесты Spring AbstractTransactionalJUnit4SpringContextTests, но некоторые из них управляют транзакциями самостоятельно. К сожалению, это, похоже, привело к побочным эффектам, приводящим к сбоям полностью несвязанных тестов при изменении набора тестовых данных, т. Е. Неудачный тест работает при его запуске самостоятельно (с тем же набором исходных данных), но сбой при запуске как часть полного набора тестов.Автоматическое определение побочных эффектов Junit

Тесты, как правило, проходят через плагин Maven's surefire во время обычной сборки Maven.

Что я ищу - это автоматический способ перестановки количества и порядка выполненных тестов, чтобы выяснить виновника. Наивный, но довольно дорогостоящий подход, взял бы набор всех тестов и выполнил все возможные комбинации. Более оптимизированный подход будет использовать существующий порядок выполнения теста (который в основном случайный, но стабильный) и проверить все потенциальные упорядоченные подмножества. Я знаю, что время выполнения этого процесса может быть длительным.

Есть ли инструменты/плагины Maven, которые могут сделать это из коробки?

+0

Не ответ на ваш вопрос, но вместо того, чтобы полагаться на транзакции с отсрочкой и откаты (которые не срабатывают в вашей ситуации), следует просто воссоздать всю базу данных перед каждым тестом. Ознакомьтесь с моей [статьей] (http://nurkiewicz.blogspot.com/2011/11/spring-pitfalls-transactional-tests.html). –

+0

Tomasz Nurkiewicz: Это то, что я буду делать, начиная с нуля. К сожалению, загрузка всех необходимых данных занимает ~ 20 с, что исключает этот подход (я знаю, что модульные тесты не должны полагаться на столько данных, но при работе с устаревшим кодом нужно работать с тем, что есть). –

ответ

1

я не знаю инструмент, который делает конкретно то, что вы хотите, но вы могли бы баловаться с runOrder parameter in maven surefire. С этой страницы:

Определяет порядок испытания будут работать в Поддерживаемые значения «алфавитный», «reversealphabetical», «случайным», «ежечасно» (в алфавитном порядке по четным часов, обратный алфавитный по нечетным. часов), «failedfirst», «сбалансированная» и «файловая система».

Нечетный/Четный для ежечасно , определенный во время сканирования пути к классу, то есть он может изменить во время сборки нескольких модулей.

Таким образом, вы можете сделать простой алфавитный runOrder и выполнить первый сбой и начать с него. По крайней мере, у вас есть предсказуемый порядок выполнения. Затем вы запускаете один за другим (используя -Dincludes) каждый тест перед сбоем & сбойным, чтобы определить, какой из них делает неудачный тест.

Затем повторите весь процесс для всех неудачных тестов. Вы можете запустить это в цикле в одночасье или что-то в этом роде.

0

Можете ли вы просто изменить тесты на использование чистой копии базы данных каждый раз? DBUnit - отличный инструмент для этого.

http://www.dbunit.org/

+0

К сожалению, нет. Загрузка данных занимает ~ 20 с, что является слишком дорогостоящим для ~ 700 тестов ... –

+0

Достаточно справедливо - вы можете посмотреть только на загрузку данных, которые вам нужны для конкретного теста, но я бы счел, что анализ потребует от вас до тех пор, пока вы предлагаете, так что там нет выигрыша. – TrueDub

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