Unit Testing Anti-Patterns, Full List

The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:

Я писал некоторое время назад об анти-паттернах в ООП. Теперь пришло время написать об анти-паттернах модульного тестирования, потому что они также существуют, и их много. Я попробую включить в этот список все примеры, которые я знаю. Если вы знаете еще какие-то, пожалуйста, добавьте их через pull request или оставьте комментарий ниже. Для каждого анти-паттерна я постараюсь указать, где его обнаружили, если это не мой случай. Имейте в виду, что если я нашел его где-то, это не обязательно означает, что он был изобретен там. Если вы заметили ошибку, пожалуйста, оставьте комментарий.

Cuckoo1 (также известен как Stranger3). Это метод тестирования, который находится в том же модульном тесте, но на самом деле ему там не место.

Test-per-Method1. Хотя однозначное соответствие между тестом и классами продукции является разумной отправной точкой, однозначное соответствие между тестом и методом продукции почти всегда является плохой идеей.

Anal Probe2. Тест, который должен использовать нездоровые способы для выполнения своей задачи, такие как чтение приватных полей с использованием рефлексии.

Conjoined Twins2. Тесты, которые называются модульными, но на самом деле являются интеграционными тестами, так как нет изоляции между тестируемой системой и самими тестами.

Happy Path. Тесты идут по счастливым путям (т.е. ожидаемым результатам, например, 18 лет), не проверяя границы и исключения (например, возраст -2 года).

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

Giant3. Модульный тест, который, хотя и валидно тестирует объект, может занимать тысячи строк и содержать множество тестовых случаев. Это может свидетельствовать о том, что тестируемая система является объектом-Божеством.

Mockery3. Иногда мокирование может быть полезным и удобным. Но иногда разработчики могут потеряться в своих попытках замокировать то, что не тестируется. В этом случае модульный тест содержит так много моков, заглушек и/или фейков, что система, подвергаемая тестированию, не тестируется вообще, а тестируются только данные, возвращаемые из моков.

Inspector3. Модульный тест, который нарушает инкапсуляцию в попытке достичь 100% покрытия кода, но знает так много о том, что происходит в объекте, что любая попытка рефакторинга приведет к нарушению существующего теста и потребует отражения любых изменений в модульном тесте.

Generous Leftovers3 (также известно как Chain Gang, Wet Floor). Ситуация, когда один модульный тест создает данные, которые где-то сохраняются, и другой тест повторно использует эти данные для своих коварных целей. Если “генератор” запускается после этого или вообще не запускается, тест, использующий эти данные, просто не пройдет.

Local Hero3 (также известен как Hidden Dependency, Operating System Evangelist, Wait and See, Environmental Vandal). Тестовый случай, который зависит от чего-то, специфичного для среды разработки, на которой он был написан, чтобы запуститься. В результате тест проходит на разработческих машинах, но не проходит, когда кто-то пытается запустить его в другом месте.

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

Secret Catcher3. Тест, который на первый взгляд кажется, что не делает никакого тестирования из-за отсутствия утверждений, но, как говорят, “дьявол кроется в деталях”. Тест действительно полагается на возникновение исключения при возникновении неполадки и ожидает, что тестовый фреймворк перехватит исключение и сообщит пользователю о его возникновении как о неудаче.

Dodger3. Модульный тест, который имеет множество тестов для незначительных (и предположительно легко тестируемых) побочных эффектов, но никогда не тестирует основное желаемое поведение. Иногда это можно встретить в тестах, связанных с доступом к базе данных, где вызывается метод, затем тест выбирает из базы данных и выполняет проверки результата.

Loudmouth3. Модульный тест (или набор тестов), который захламляет консоль диагностическими сообщениями, логированием и другими разными разговорами, даже когда тесты проходят.

Greedy Catcher3. Модульный тест, который перехватывает исключения и затем проглатывает трассировку стека, иногда заменяя ее менее информативным сообщением об ошибке, но иногда даже просто регистрируя (см. Loudmouth) и пропуская тест.

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

Enumerator3 (также известен как Test With No Name). Модульные тесты, в которых имя каждого метода тестового случая является только перечислением, например, test1, test2, test3. В результате намерение тестового случая непонятно, и единственный способ быть уверенным - прочитать код тестового случая и надеяться на ясность.

Free Ride3 (также известен как Piggyback). Вместо того, чтобы написать новый метод тестового случая для тестирования другой функции или возможности, новое утверждение добавляется в существующий метод тестового случая.

Excessive Setup3 (также известен как Mother Hen). Тест, который требует много работы для настройки перед началом тестирования. Иногда в одном тесте используется несколько сотен строк кода для настройки среды для одного теста, с участием нескольких объектов, что может затруднить понимание того, что на самом деле тестируется из-за “шума” всей настройки.

Line hitter. На первый взгляд, тесты охватывают все, и инструменты анализа кода подтверждают это на 100%, но на самом деле тесты просто проходят по коду

  1. Spock: Up and Running by Rob Fletcher - Spock: Практическое руководство от Роба Флетчера

  2. Освоение тестирования программного обеспечения с JUnit 5 от Бони Гарсии

  3. TDD Анти-паттерны от James Carr

  4. Anti-Patterns by William E. Kempf - Анти-шаблоны от Уильяма Э. Кемпфа.

Translated by ChatGPT gpt-3.5-turbo/42 on 2023-11-22 at 10:06

sixnines availability badge   GitHub stars