В проекте Enqueue мы проводим функциональное тестирование, чтобы убедиться, что транспорт MQ работает должным образом. Для этого нам нужны настоящие брокеры, такие как Amazon SQS или Kafka. Иногда тесты терпят неудачу не из-за ошибки на нашей стороне, а из-за того, как работает брокер.

Например, вы не можете надежно использовать сообщение сразу после его публикации в Amazon SQS. Есть шанс, что он вернет его, но Amazon не гарантирует немедленную доставку, то же самое относится к Kafka.

Вы можете столкнуться с аналогичными проблемами при тестировании взаимодействия со сторонним API, который время от времени срабатывает. При этом были обнаружены API-интерфейсы Paypal и Klarna Sandbox.

Такие ошибочные тесты приводят к случайным сбоям на CI-сервере, хотя в вашем коде ошибки нет. Очевидно, что если вы повторно запустите сборку, она может пройти, но вам все равно придется потратить время на то, чтобы позаботиться о ней, ждать новых результатов, копаться в коде, чтобы выяснить, почему это произошло.

Решение состоит в том, чтобы проинструктировать PHPUnit повторно запустить такие тесты в случае сбоя несколько раз, прежде чем полностью отказаться.

Чтобы упростить задачу, мы создали RetryTrait. После смешивания в тестовом примере он добавляет аннотации retry уровня класса и уровня метода. Вы можете получить его, установив пакет enqueue/test или скопировав эту черту в свой исходный код.

Вот тестовый пример:

Заключение: постарайтесь написать тесты, не требующие повторной попытки. Хотя есть конкретные случаи, когда это может пригодиться.