Плохое тест Junit, используя SPRILLFRAMEWORK, имеет хрупкие резьбы. Как исправить?
-
09-10-2019 - |
Вопрос
Недавно я присоединился к группе с некоторыми серьезными проблемами тестирования JENIT. Одной из проблем является 8-минутный тест! Тест имеет несколько разделов; Каждый делает вызовы org.springframework.context.applicationEventpublisher.publishEvent (), за которым следует поток.
Есть несколько очевидных проблем с этим подходом, сроки потока.
Испытания иногда терпят неудачу на оживленных машинах; и
Испытания забирают далеко слишком долго, когда они не терпят неудачу.
Является ли пул, на котором эти события обрабатываются доступными для тестирования и есть ли звонок, чтобы увидеть, если каскад события сталкивается?
Решение
Вы можете перезаписать по умолчанию applicationEventMulticaster
Добавляя этот идентификатор компонента в контекст вашего приложения.
Вместо по умолчанию SimpleApplicationEventMulticaster
, вы могли бы установить TaskeExutor в этом бозе для выполнения публикации события асинхронно в нескольких потоках.
Или вы могли бы реализовать свой собственный MultiCaster, который отпечатывает, какой слушатель события занял так много времени или блокировал, как долго и на каких событиях. Это может помочь вам отслеживать реальную проблему 8-минутного теста.
Интересно, что Javadoc of SimpleAppentVentMulticaster, который используется по умолчанию на весну при использовании ApplationContext, говорится в следующем:
По умолчанию все слушатели вызываются в вызовах. Это позволяет опасности прослушивателя, блокирующего все приложение, но добавляет минимальные накладные расходы. Укажите альтернативную Taskexuecutor, чтобы прослушиватели выполнялись в разных потоках, например, из пула резьбы.
Другие советы
Стоит отметить, что тестовый код, который фактически называет внешние сервисы, являются тесты в интеграции, а не модульные тесты. Если вы действительно единственное тестирование здесь, вы должны заменить эти звонки содевными. Таким образом, вы можете лучше контролировать значения, возвращаемые в вашу бизнес-логику и тестирование на определенные условия. Кроме того, как вы видели, это все, но исключает ложные позитивы из-за внешних (некодных) ситуаций. Очевидно, что эти тесты не являются терпят неудачу, объект, который они ожидают использовать, является.
Я (намеренно) избегайте весны, поэтому я не уверен, что могу помочь с спецификой, но просто глядя на проблему сна, вы можете использовать что-то вроде WaitFor
в Tempus-Fugit (бесстыдная пробка) для опроса для Condition
а не "сон и надежду". Это не идеально и обычно изменение в том, как вы тестируете (как предложено ранее), предпочтительнее, но это означает, что вы получаете более тонкие зернистые «ждет», которые более склонны избегать гоночных условий / Flaky Tests и, как правило, ускоряют тест.
Увидеть проект документация Подробнее и отправьте обратно, если вы найдете его полезным!