Когда тест не является юнит-тестом?

Я ищу такие правила, как:

Тест не является юнит-тестом, если:

  • общается с базой данных
  • он не может работать параллельно с другими тестами
  • использует "среду", такую ​​как реестр или файловую систему

Что еще там?

8 ответов

Решение

См. Определение Майкла Перса

Тест не является модульным тестом, если:

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

Тест не является юнит-тестом, если он не тестирует юнит.

Серьезно, это все, что нужно сделать.

Понятие "модуль" в модульном тестировании не является четко определенным, на самом деле, лучшее определение, которое я нашел до сих пор, на самом деле не является определением, потому что оно круговое: модуль в модульном тесте - это наименьшая возможная вещь, которую могут быть проверены в изоляции.

Это дает вам две контрольные точки: это тестируется изолированно? И это наименьшая возможная вещь?

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

Сложный...

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

Но с другой стороны... можем ли мы на 100% сказать правильно или неправильно?? Не для того, чтобы стать философским, но - как Майкл говорит в своем посте:

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

Так почему бы мне не написать модульный тест, который проверяет логику синтаксического анализа, например, файла xls, путем доступа к некоторому фиктивному файлу из файловой системы в моей тестовой папке (как MS-тесты позволяют с помощью DeploymentItem)?

Конечно, как уже упоминалось, мы должны отделять подобные тесты от других (может быть, в отдельном наборе тестов в JUnit). Но я думаю, что следует также написать эти тесты, если он чувствует себя комфортно, имея их там... ясно, тогда всегда помните, что модульное тестирование должно просто проверять кусок в изоляции.

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

Он не имеет никаких утверждений и не ожидает исключения.

Тест не является модульным тестом, когда:

  • он проверяет более чем одну вещь одновременно (т.е. он проверяет, как две вещи работают вместе) - тогда это интеграционный тест

Контрольный список для хороших юнит-тестов:

  • они автоматизированы
  • они повторяемы
  • их легко реализовать
  • они остаются для будущего использования, когда-то написанные
  • ими может управлять любой
  • они могут быть запущены нажатием кнопки
  • они бегут быстро

Еще несколько лучших практик (без особой важности):

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

Это часть знаний, которые я извлек из книги Роя Ошерова " Искусство юнит-тестирования".

Реализация теста для нескольких, возможно, неисправных модулей не будет модульным тестом.

Запутанный вопрос.

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

Скажем, для целей тестирования я издеваюсь над блоками DAL (создавая "пересмешников").

Но эти пересмешники, конечно, являются дополнительными единицами сами по себе. Так что даже при использовании имитаций может показаться, что я все еще вынужден нарушать идею "никаких других модулей не задействовано", когда я хочу провести модульное тестирование моего модуля бизнес-логики.

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

Вывод: невозможно провести "подлинные юнит-тесты" на бизнес-модулях, которые каким-либо образом зависят от любого типа DAL, вопросительный знак?

Corrolary: единственное, что может быть ("искренне"!) Проверено модулем, это сам DAL, знак вопроса?

Безошибочный ответ: учитывая, что "DAL" обычно является либо ORM, либо самим DML некоторых СУБД, и учитывая, что эти продукты обычно покупаются как "проверенная технология", какова дополнительная ценность выполнения любых модульных тестов? так всегда, вопросительный знак?

После того, является ли тест модульным тестом или нет, возникает следующий вопрос: это хороший тест?

Другие вопросы по тегам