Мы пишем тесты для проверки корректности поведения программы.
Проверка правильности поведения программы путем проверки содержимого операторов вывода с помощью ваших глаз - это руководство , а точнее, визуальный процесс.
Вы можете утверждать, что
визуальный осмотр работает , я проверяю, что код выполняет то, что должен делать, для этих сценариев, и как только я увижу, что он верен, все готово.
Теперь, во-первых, здорово, что вас интересует, правильно ли работает код. Это хорошая вещь. Вы на шаг впереди! К сожалению, у этого подхода есть проблемы.
Первая проблема, связанная с визуальным осмотром, заключается в том, что вы попали в аварию при сварке и никогда больше не сможете проверить правильность кода.
Вторая проблема заключается в том, что используемая пара глаз тесно связана с мозгом владельца глаз. Если автору кода также принадлежат глаза, используемые в процессе визуального контроля, процесс проверки правильности зависит от знаний о программе, усвоенных в мозгу визуального инспектора.
Новой паре глаз трудно подойти и проверить правильность кода просто потому, что они не связаны с мозгом исходного кодировщика. Владельцу второй пары глаз придется поговорить с первоначальным автором кода, чтобы полностью понять рассматриваемый код. Общение как средство обмена знаниями, как известно, ненадежно. Вопрос, который является спорным, если исходный кодировщик недоступен для новой пары. В этом случае новая пара глаз должна прочитать исходный код.
Чтение чужого кода, не охваченного модульными тестами, сложнее, чем чтение кода, связанного с модульными тестами. В лучшем случае чтение кода других людей - сложная работа, в худшем - это самая трудная задача в разработке программного обеспечения. Есть причина, по которой работодатели, рекламируя вакансии, подчеркивают, что проект является новым (или новым). Написать код с нуля проще, чем изменить существующий, и тем самым сделать рекламируемую вакансию более привлекательной для потенциальных сотрудников.
При модульном тестировании мы разделяем код на составные части. Затем для каждого компонента мы устанавливаем нашу стойку с указанием того, как должна себя вести программа . Каждый модульный тест рассказывает историю того, как эта часть программы должна действовать в конкретном сценарии. Каждый модульный тест похож на пункт в контракте, который описывает, что должно происходить с точки зрения клиентского кода.
Это значит, что у новой пары глаз есть две нити живой и точной документации по рассматриваемому коду.
Во-первых, у них есть сам код, реализация, то , как код был написан ; во-вторых, они обладают всеми знаниями, которые исходный кодировщик описал в виде набора формальных утверждений, рассказывающих о том, как этот код должен себя вести.
Модульные тесты фиксируют и формально описывают знания, которыми обладал первоначальный автор при реализации класса. Они предоставляют описание того, как этот класс ведет себя при использовании клиентом.
Вы правы, сомневаясь в полезности этого, потому что можно писать бесполезные модульные тесты, не охватывающие весь рассматриваемый код, устаревшие или устаревшие и т. Д. Как мы можем гарантировать, что модульные тесты не только имитируют, но и улучшают процесс, когда знающий, добросовестный автор визуально проверяет операторы вывода своего кода во время выполнения? Сначала напишите модульный тест, а затем напишите код, чтобы этот тест прошел. Когда вы закончите, позвольте компьютерам запустить тесты, они быстрые, они отлично справляются с повторяющимися задачами, они идеально подходят для этой работы.
Обеспечьте качество тестов, просматривая их каждый раз, когда вы касаетесь кода, который они тестируют, и запускаете тесты для каждой сборки. Если тест не прошел, немедленно исправьте его.
Мы автоматизируем процесс запуска тестов, чтобы они запускались каждый раз, когда мы делаем сборку проекта. Мы также автоматизируем создание отчетов о покрытии кода, в которых подробно описывается, какой процент кода покрывается и выполняется тестами. Мы стремимся к высоким процентам. Некоторые компании не допускают внесения изменений кода в контроль исходного кода, если у них нет достаточных модульных тестов, написанных для описания любых изменений в поведении кода. Обычно вторая пара глаз просматривает изменения кода вместе с автором изменений. Рецензент проведет изменения, чтобы убедиться, что изменения понятны и в достаточной степени охвачены тестами. Итак, процесс проверки выполняется вручную, но когда тесты (модульные и интеграционные тесты и, возможно, приемочные тесты пользователя) проходят этот процесс ручной проверки, они становятся частью процесса автоматической сборки. Они запускаются каждый раз, когда регистрируется изменение. Aнепрерывная интеграция сервер выполняет эту задачу как часть процесса сборки.
Тесты, которые запускаются автоматически, поддерживают целостность поведения кода и помогают предотвратить поломку кода при будущих изменениях в базе кода .
Наконец, предоставление тестов позволяет вам агрессивно рефакторировать код, потому что вы можете безопасно вносить большие улучшения кода, зная, что ваши изменения не нарушают существующие тесты.
Есть одно предостережение относительно разработки, основанной на тестировании, и это то, что вы должны писать код, чтобы сделать его тестируемым. Это включает в себя кодирование интерфейсов и использование таких методов, как внедрение зависимостей, для создания экземпляров взаимодействующих объектов. Посмотрите работу Кента Бека, который очень хорошо описывает TDD. Посмотрите кодирование интерфейсов и изучитешаблоны проектирования