Что такое юнит-тесты и почему я должен беспокоиться? - PullRequest
18 голосов
/ 06 декабря 2008

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

Так что же такое модульные тесты, и мне, как программисту на PHP и JavaScript, следует заботиться или они предназначены только для «настоящих» языков программирования?

Ответы [ 8 ]

25 голосов
/ 06 декабря 2008

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

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

Конечно, это также требует, чтобы вы были достаточно дисциплинированы в том, как вы пишете свой код, потому что должна быть возможность изолировать отдельные функции или классы для их тестирования, и потому что, ну, тесты не пишут сами , Вы должны сделать это. ;)

Учитывая качество большей части кода PHP, который я видел, я бы сказал, что модульное тестирование определенно имеет свое место в сообществе PHP. Более того, почти на любом другом языке. ;)

19 голосов
/ 06 декабря 2008

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

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

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

Модульные тесты полезны по ряду причин:

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

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

3 голосов
/ 07 декабря 2008

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

Фреймворки модульных тестов для PHP включают PHPUnit и SimpleTest , которые были по сравнению со StackOverflow .

3 голосов
/ 06 декабря 2008

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

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

Важно различать юнит-тестирование и автоматическое юнит-тестирование. Вы всегда должны тестировать свой код модульно. Однако автоматизация ваших юнит-тестов - это совсем другая тема.

1 голос
/ 04 января 2010

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

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

1 голос
/ 06 декабря 2008

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

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

1 голос
/ 06 декабря 2008

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

Википедия есть статья о модульном тестировании, если вы заинтересованы.

0 голосов
/ 06 декабря 2008

A Поиск в Google по запросу "php unit testing" дает огромное количество информации на эту тему. PHPUnit проект выглядит интересно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...