Что такое модульные тесты и почему мне это нужно?

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
18
0
1 305
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

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

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

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

Rich Bradshaw 06.12.2008 22:52

Это обычное дело в кодировании в стиле сценария, это часто бросаемый стиль кодирования людьми, которые больше заинтересованы в том, чтобы быть дизайнером веб-сайта, чем разработчиком. Это так же часто встречается в сообществе ASP / VBScript. Откровенно говоря, если вам нужен UT, вам следует подумать о другом языке.

AnthonyWJones 07.12.2008 00:04

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

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

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

Ответ принят как подходящий

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

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

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

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

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

AnthonyWJones 07.12.2008 00:00

SimpleTest и PHPUnit - это два.

JW. 07.12.2008 00:22

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

jalf 07.12.2008 00:57

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

reinierpost 04.01.2010 12:21

@AnthonyWJones: Я лично сомневаюсь, является ли PHP подходящим языком для работы Любые. Но если вы обнаружите, что используете его, вам понадобится вся доступная помощь, чтобы убедиться, что ваш код менее сломан, чем язык, на котором он был написан. Так что да, это еще одна причина для модульного тестирования вашего кода

jalf 24.11.2011 13:29

Я могу представить себе написание кода, который генерирует входные данные. Как мне написать код для отдельной проверки того, что функция / класс / тестируемый код (CUT) выдает правильный результат? Один из способов «проверить» - это вообще не писать код, а просто проверять ввод-вывод вручную. Если бы мне пришлось написать код, чтобы попытаться сгенерировать выходные данные, с помощью которых можно было бы проверить выходные данные CUT, то чем это отличается от написания CUT в первую очередь? Или в этом суть - проверить, что две разные реализации функции / класса дают одинаковый результат?

Minh Tran 07.02.2016 21:08

поиск в Google по запросу "модульное тестирование php" дает кладезь информации по этому вопросу. Интересно выглядит проект PHPUnit.

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

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

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

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

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

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

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

philant 07.12.2008 00:09

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

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

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

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

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

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

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