Контекст:

Тесты до сих пор работают нормально, и, вдруг, это, кажется, терпит неудачу.

Почему?

Хотя писать основные модульные тесты легко, это может быть сложно при работе с датысложные расчеты, или случайные значенияПолем

Ошибки с датами и интервалами

Хотя это обычно хорошая практика, чтобы придерживаться родного API (независимо от языка программирования), я рекомендуюУглерод, особенно в модульных тестах:

  • это просто работает
  • Это более читаемо
  • Это более точное
  • это только дополнительный слой, так как он расширяет встроенный DateTime 
  • это упрощает тесты
  • Он уже упакован в крупные рамки, такие как Laravel

Вы можете предотвратитьСмешные ситуациис датами:

  • Несоответствие из -за конфигурации сервера: трубопроводы (CI/CD) против локальных машин
  • несоответствие из -за переполнен: Утверждения терпят неудачу, потому что интервалы даты не совпадают в этом месяце
  • несоответствие из -за различий в часовом поясе и микросекунд
  • несоответствие из -за изменчивость времени: ваши тесты зависят от текущей даты, но текущая дата не высмеивается правильно

Тестируемый код по сравнению с сложной логикой

Бизнес -логика - это сердце вашей работы.

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

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

Написание тестируемого кода резко упрощает тесты (например, твердые принципы, сухой, состав над наследством).

Вот несколько красных знаков:

  • Тесты повторяют реализацию, в то время как она должна сосредоточиться на поведении вместо этого
  •  Расовые условия: Ваша логика включает в себя одновременные операции, которые случайным образом терпят неудачу

Испытания на основе собственности: прерывистые сбои

Испытания на основе недвижимости являются популярным подходом.

Вы можете использовать рандомизированные входы, чтобы охватить больше случаев.

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

Это довольно круто, но убедитесь, что вы делаете следующее раньше:

  •  Подумайте о спецификацииочень тщательно
  • Свойства Fine Tune в соответствии с вашей бизнес -логикой (например, неподдерживаемые значения, области)

Кроме того, имейте в виду, что он не заменяет модульные тесты (испытания на основе примеров), поэтому не полагайтесь исключительно на тестирование на основе свойств.

В противном случае вы можете столкнуться с следующими вопросами:

  • неправильное или неполное понятие правильности
  • чрезмерное использование, приводящее к более медленному разработке
  • Проблемы с производительностью

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

Это может быть трудно охватить все сценарии.

Ручные "взломы"

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

Эти хаки делают работу, но не подлежат обслуживанию.

Например:

 sleep(9);
 

Приведенный выше код определяет произвольное время ожидания 9 секунд и может позволить вам «издеваться над некоторым реальным поведением.

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

А Faker ловушка

 Faker очень популярная библиотека для генерации поддельных данных:

 $email1 = $faker->email();
$email2 = $faker->email();
 

В приведенном выше коде, $email1 и $email2 Иногда может быть таким же, что делает ваше утверждение случайным образом.

В этом случае использование Faker, вероятно, не обязательно (особенно для разница)

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

Сравнения массива

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

Это часто потому, что один из двух массивов не отсортирован:

 $this->assertEquals([2, 1], [1, 2]);
 

Phpunit естьконкретные методыОценить равенство.

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

Будьте осторожны, хотя. Это не означает, что вы можете использовать эти методы, чтобы ваши тесты проходили, а не должны.

Иногда вы хотите, чтобы ваши массивы были точно такими же.

Неправильный приказ исполнения

Этот может быть огромной болью!

Порядок выполнения ваших тестов не должен влиять на результат, но нередко находить такую ​​конфигурацию в проектах.

Вы можете использовать @depends Аннотация, чтобы «исправить» проблему, но лучше, если вы можете рефакторировать свои тесты, чтобы быть независимыми.

Устранение неполадок: помогите себе

Есть простые меры, которые вы можете принять, чтобы облегчить боль с помощью тестов:

  • Держите это просто (что совсем не глупо)
  • В то время как трубопроводы CI/CD могут сбой, он автоматически работает по толчкам, слияниям или ручным развертываниям
  • аAAA Patternулучшает читабельность
  • Используйте случайность разумно
  • Тщательно назовите свои методы
  • уменьшить ненужную сложность, включая бесполезные зависимости
  • Рефакторируйте ваши тесты на регулярной основе
  • Включите тесты в обзоры кода

Заворачивать

Если ваши тесты терпят неудачу случайным образом, это обычно связано с известной проблемой.

Тем не менее, есть некоторые ловушки, которые следует избегать, особенно когда вы вводите некоторую случайность специально.