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






Большую часть php, которую я видел, практически невозможно провести модульное тестирование.
В Википедия есть статья о модульном тестировании, если вам интересно.
Это обычное дело в кодировании в стиле сценария, это часто бросаемый стиль кодирования людьми, которые больше заинтересованы в том, чтобы быть дизайнером веб-сайта, чем разработчиком. Это так же часто встречается в сообществе ASP / VBScript. Откровенно говоря, если вам нужен UT, вам следует подумать о другом языке.
Модульный тест - это проверка небольшой части кода, который вы пишете. Вы тестируете его изолированно от остальной системы, чтобы убедиться, что эта часть вашего кода работает.
Легче протестировать множество небольших фрагментов кода, убедиться, что они работают, а затем протестировать их совместную работу, чем тестировать систему в целом.
Важно различать модульное тестирование и автоматическое модульное тестирование. Вы всегда должны проводить модульное тестирование своего кода. Однако автоматизация модульных тестов - это совсем другое дело.
Модульные тесты предназначены для любого кода, который вы хотите поддерживать.
Вкратце, идея состоит в том, чтобы написать множество небольших тестов, каждый из которых можно запускать изолированно, и протестировать минимально возможную часть вашей кодовой базы (часто отдельные классы или отдельные функции). Если я дам этой функции ожидаемый ввод, вернет ли она ожидаемый результат? Если это так, это означает, что остальная часть приложения может в значительной степени предположить, что оно работает. А если этого не произойдет, я лучше поймаю ошибку в небольшой, простой, изолированной функции модульного тестирования, чем буду пытаться отследить ее по всему моему приложению.
Конечно, это также требует, чтобы вы были достаточно дисциплинированными в том, как вы пишете свой код, потому что должна быть возможность изолировать отдельные функции или классы для их тестирования, а также потому, что тесты не пишут сами себя. Вы должны это сделать. ;)
Учитывая качество большей части кода PHP, который я видел, я бы сказал, что модульное тестирование определенно имеет свое место в сообществе PHP. Фактически, даже больше, чем почти на любом другом языке. ;)
Знаете ли вы о фреймворках для модульного тестирования, которые работают с PHP? Откровенно говоря, если вы видите PHP достаточно сложным, чтобы сделать модульное тестирование жизнеспособным, вы должны задаться вопросом, является ли PHP правильным языком для работы.
SimpleTest и PHPUnit - это два.
Anothony: Я не думаю, что сложность языка имеет значение. Модульные тесты полезны всякий раз, когда у вас есть код, который вы хотите протестировать (и разве вы обычно не хотите тестировать все свой код?). Реальный вопрос - легко ли их написать в соответствии с вашей кодовой базой, но он зависит больше от дизайна, чем от языка.
Возможно, вы сможете уточнить, сказав: для этого также требуется, чтобы вы были достаточно дисциплинированными в том, как вы пишете свой код: его нужно разбивать на блоки для тестирования.
@AnthonyWJones: Я лично сомневаюсь, является ли PHP подходящим языком для работы Любые. Но если вы обнаружите, что используете его, вам понадобится вся доступная помощь, чтобы убедиться, что ваш код менее сломан, чем язык, на котором он был написан. Так что да, это еще одна причина для модульного тестирования вашего кода
Я могу представить себе написание кода, который генерирует входные данные. Как мне написать код для отдельной проверки того, что функция / класс / тестируемый код (CUT) выдает правильный результат? Один из способов «проверить» - это вообще не писать код, а просто проверять ввод-вывод вручную. Если бы мне пришлось написать код, чтобы попытаться сгенерировать выходные данные, с помощью которых можно было бы проверить выходные данные CUT, то чем это отличается от написания CUT в первую очередь? Или в этом суть - проверить, что две разные реализации функции / класса дают одинаковый результат?
поиск в Google по запросу "модульное тестирование php" дает кладезь информации по этому вопросу. Интересно выглядит проект PHPUnit.
Модульные тесты - это автоматизированные тесты, которые проверяют, выполняет ли данный фрагмент кода то, что вы ожидаете от него при заданном наборе обстоятельств. Хорошие модульные тесты тестируют небольшие фрагменты функциональности, часто на уровне отдельных функций.
Модульные тесты обычно структурированы так, что вы настраиваете какое-то состояние, запускаете функцию или метод, которые хотите протестировать, а затем подтверждаете либо вывод этой функции, либо изменение в другом состоянии в результате этой функции. В большинстве фреймворков модульного тестирования есть утилиты для поддержки и структурирования этого, например:
Модульные тесты полезны по ряду причин:
Модульные тесты полезны для любого кода, размер которого превышает несколько строк, независимо от языка. Я определенно тестировал php-код, даже для относительно небольших проектов, и получил от этого немедленное вознаграждение.
Вы имели в виду, что наборы тестов группируют похожие тесты, а не тестовые примеры.
Если вы пишете приложение с любым описанием, вам следует подумать о модульных тестах. При правильном исполнении они заставляют задуматься о качестве кода, который вы доставляете своим пользователям. Я думаю, что проблема, с которой вы столкнулись, заключается в разнице между кодом модульного тестирования и автоматическим модульным тестированием. Модульное тестирование можно выполнить так же просто, как записать набор тестов и затем вручную выполнить их.
С другой стороны, автоматическое модульное тестирование полагается на то, что у вас есть какая-то форма приложения / оснастки для запуска и повторного запуска тестов. С помощью автоматических модульных тестов вы можете повторно запустить тесты, просто нажав кнопку. Так почему же так важно повторное выполнение теста? Проще говоря, вы не пишете приложения, запускаете на них тесты один раз, а затем уходите от них. Напишите свои тесты так, чтобы вы выполняли свой код отдельными небольшими прогонами и запускали их на протяжении всего процесса разработки. Делая это с помощью хорошо написанного набора тестов, у вас гораздо больше шансов идентифицировать код, который был поврежден обновлениями.
В дополнение к тому, на что уже был дан ответ, наличие тестовых примеров, охватывающих ваш код, позволяет вам перейти к Рефакторинг (улучшение дизайна вашего кода без изменения его наблюдаемого поведения).
Фреймворки модульного тестирования для PHP содержат PHPUnit и SimpleTest, которые были по сравнению с StackOverflow.
На Зачем модульное тестирование должно проводиться в первую очередь, я хотел бы добавить аргумент Барри Бома: «неисправность, обнаруженная и исправленная на этапе модульного тестирования, более чем в сто раз дешевле, чем если бы она была сделана после доставки в лабораторию. клиент."
Хотя множитель действительно звучит немного грубо, я думаю, что этот аргумент определенно оправдывает тестирование.
Отчасти потому, что люди смешивают логику и представление и не используют функции. Почему люди ненавидят функции в PHP, я не понимаю - DDRY (определенно повторяйте себя), похоже, является мантрой PHP.