Допустим, вы хотели вручную тестировать приложение каждый раз, когда вы его развертывали. Как бы вы поступили так?
Ну, для начала, вы можете составить список всех вещей, которые вы хотите проверить, чтобы потом не забыть проверить что-то позже. Тогда вы, вероятно, напишете шаги для каждого теста, чтобы убедиться, что вы делаете их одинаково каждый раз. Если вы не уверены, что процесс тестирования, который вы использовали, был согласованным, ваши результаты не были бы согласованными.
Итак, теперь, когда у вас есть список тестов, которые вы должны выполнить, вы должны открыть свой браузер, прочитать шаги первого теста, выполнить их и записать результат. Вы должны повторить этот процесс для каждого теста в вашем списке.
Количество выполняемых вами тестов будет расти с ростом приложения и обнаружением новых ошибок. Конечно, вы будете ограничены выполнением этих тестов на человеческой скорости, делая их довольно медленными.
Ирония здесь заключается в том, что, механически перебирая список операций, вы вычисляете. Вы просто делаете это медленнее, чем, скажем, компьютер.
Это, среди многих других веских причин, является причиной того, что мы пишем модульные тесты: они позволяют компьютеру выполнять вычисления, поэтому вам не нужно.
Я могу запустить комплексный набор модульных тестов достаточно быстро, чтобы использовать его часто во время разработки, а не раз в неделю перед развертыванием. Это позволяет быстрее обнаруживать ошибки, экономя время и деньги.
Я даже могу написать тесты, которые предсказывают поведение системы, а затем написать это поведение (которое, как я уже знаю, является правильным, потому что я только что проверил его), процесс, известный как разработка через тестирование.