Я всегда с интересом читаю статьи про тестирование кода. И я очень хочу использовать тесты в своих проектах.
Но я не могу. Не могу найти для себя стимул.
Да, тесты из примеров пишутся практически моментально. Но нужно ли писать тест для функции
def get_word():
return 'word'
вопрос довольно сложный. Написать его не составит проблему, но и пользы от него ощутимой не будет.
Писать такой тест для получения радости от +1 выполненный тест? Не вижу смысла.
Для увеличения покрытия тестами? Не вижу смысла.
Просто так?…
С тестами всё хорошо, пока они из обучающих статей. Но тесты нужны для более сложных операций:
Например, на одном проекте используется парсинг других сайтов. С них берется текстовая информация и картинки в большом количестве, рассылаются отчеты о проделанной работе и т.д.
Вот для этого процесса хотелось бы написать тесты.
Но нет смысла писать маленькие тесты для каждой функции. Они итак работают хорошо.
Я понимаю, что предыдущая строка вызывает негодование. Но в реальности функция, которая, например, скачивает изображение и сохраняет его в хранилище — элементарна, и в ней не будет ошибок (точнее эти ошибки слишком явные). Ошибки появляются при использовании этой функции (хранилище не доступно, процессор изображений не сработал и т.д.).
Причем тестирование всех этих функций по отдельности не говорит ни о чем — процессор отлично отрабатывает тысячу изображений, хранилище выдерживает большее количество операций, чем требуется. Всё это, конечно проверяется в самой функции, но это тестов не касается.
Надо проверять взаимодействие всех функций.
Это то, чего я хочу. Запустить тесты и быть уверенным, что довольно сложный распараллеленный процесс выполняется правильно.
Но для написания теста для всего этого процесса (создали дочерние процессы, скачали страницы, нашли нужную информацию, скачали картинки, преобразовали картинки, валидировали данные, сохранили данные, проверили данные на целостность, сохранили отчеты, и т.д.) нужно потратить кучу времени.
Ошибка может случиться только при взаимодействии функций. Причем тестовые данные абсолютно не проверяют эти уязвимости (что на некоторых сайтах в jpeg файлах хранится bmp протестировать можно, но зачем, если в функции всё равно надо будет делать исключение и оно будет работать?).
Можно создать огромные массивы тестовых данных для проверки этих ошибок, но и тут кроется проблема. Если ошибка один раз появилась, то мы просто исправляем функцию, зачем нам писать тест для этой ошибки? Её больше не будет!
Получается такая проблема:
Писать тесты хочется, но от них нет отдачи. Время на написание тратится. Проверять то, что уже работает нет смысла (исходя из опыта — мы не ломаем то, что уже работает. Ну вот как-то так повелось). Для каждого нового случая создать тест, исправить проблему, проверить? Какой смысл в этом двойном написании одного и того-же? Ошибка уже исправлена, написать тест, который охватит в разы больше, чем эта ошибка не получится, а проверка единичными проверочными данными из всех возможных не особо полезна. Количество возможных ошибок не снизится в разы. Максимум на проценты.
Да есть и ещё один немаловажный фактор: заказчики не поймут.
Я не могу сказать заказчику, что цена продукта будет выше, по причине написания тестов.
Я не могу поставить цену за проект выше, заказчик уйдет к конкурентам.
Я не могу не менять цену из-за тестов, хочется что-то заработать.
Заказчику плевать на тесты, на стабильность, на всё, кроме конечного результата. Ему не объяснить, что этот продукт с тестами будет лучше, чем без них, т.к. он будет более стабильным, масштабируемым и т.д. Ему плевать на это. Ему нужен результат. Быстро. И как можно дешевле.
Конечно, я надеюсь, это касается только нашей области — веб-программирование. Для систем связанных с денежным оборотом, систем, от которых зависят жизни людей и т.д. тесты обязательны, и там заказчики будут понимать, что они нужны. Я верю в это.
Автор: Brick85