Плохое тест Junit, используя SPRILLFRAMEWORK, имеет хрупкие резьбы. Как исправить?

StackOverflow https://stackoverflow.com/questions/4433423

Вопрос

Недавно я присоединился к группе с некоторыми серьезными проблемами тестирования JENIT. Одной из проблем является 8-минутный тест! Тест имеет несколько разделов; Каждый делает вызовы org.springframework.context.applicationEventpublisher.publishEvent (), за которым следует поток.

Есть несколько очевидных проблем с этим подходом, сроки потока.

  • Испытания иногда терпят неудачу на оживленных машинах; и

  • Испытания забирают далеко слишком долго, когда они не терпят неудачу.

Является ли пул, на котором эти события обрабатываются доступными для тестирования и есть ли звонок, чтобы увидеть, если каскад события сталкивается?

Это было полезно?

Решение

Вы можете перезаписать по умолчанию applicationEventMulticaster Добавляя этот идентификатор компонента в контекст вашего приложения.

Вместо по умолчанию SimpleApplicationEventMulticaster, вы могли бы установить TaskeExutor в этом бозе для выполнения публикации события асинхронно в нескольких потоках.

Или вы могли бы реализовать свой собственный MultiCaster, который отпечатывает, какой слушатель события занял так много времени или блокировал, как долго и на каких событиях. Это может помочь вам отслеживать реальную проблему 8-минутного теста.

Интересно, что Javadoc of SimpleAppentVentMulticaster, который используется по умолчанию на весну при использовании ApplationContext, говорится в следующем:

По умолчанию все слушатели вызываются в вызовах. Это позволяет опасности прослушивателя, блокирующего все приложение, но добавляет минимальные накладные расходы. Укажите альтернативную Taskexuecutor, чтобы прослушиватели выполнялись в разных потоках, например, из пула резьбы.

Другие советы

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

Я (намеренно) избегайте весны, поэтому я не уверен, что могу помочь с спецификой, но просто глядя на проблему сна, вы можете использовать что-то вроде WaitFor в Tempus-Fugit (бесстыдная пробка) для опроса для Condition а не "сон и надежду". Это не идеально и обычно изменение в том, как вы тестируете (как предложено ранее), предпочтительнее, но это означает, что вы получаете более тонкие зернистые «ждет», которые более склонны избегать гоночных условий / Flaky Tests и, как правило, ускоряют тест.

Увидеть проект документация Подробнее и отправьте обратно, если вы найдете его полезным!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top