Comments 22
Плюс полноценное внедрение подобных методологий требует наличие развитых DevOps процедур и технологий, внедрение которых часто тоже ложится на разработчиков. То есть они воспринимают это как перекладывание на них ещё и обязанностей опсов-админов.
Если тестировать только то, что действительно нужно тестировать, и делать это правильно (читай — не писать хрупкие юнит-тесты, которые постоянно ломаются и нуждаются в непрерывной поддержке) — то не в несколько раз. По моему опыту на разработку нормальных юнит-тестов (с покрытием 80-90%) нужно примерно столько же времени, сколько и на разработку кода, который они тестируют. Таким образом время (стоимость) непосредственного написания кода удваивается, но в общей стоимости проекта написание кода это далеко не 100%, так что в финале стоимость разработки увеличивается примерно в 1.5 раза.
Причём это стоимость разработки первой версии — а как только начинается поддержка этой версии (и юзеры с новыми багами и разработка нового функционала) оказывается, что код нормально покрытый юнит-тестами поддерживать значительно дешевле, так что с этого момента начинается сокращение разницы в стоимости разработки, и через несколько месяцев обычно оказывается, что к этому моменту стоимость разработки проекта с тестами уже меньше, чем без тестов. Конечно, окупить тесты таким образом и даже начать на них экономить можно только в проектах, которые активно развиваются и поддерживаются.
А вот если тесты писать не уметь, и в результате писать их слишком много и/или слишком хрупких — тогда да, ничего кроме раздувания стоимости разработки в разы не получится.
и через несколько месяцев обычно оказывается, что к этому моменту стоимость разработки проекта с тестами уже меньше, чем без тестов
Абсолютно верно.
то не в несколько раз
Может быть вы правы, и добавьте еще приемочные тесты, не говоря про интеграционные тесты, обучение тестировщиков, аналитиков. И все это можно умножить на специфику продукта.
Отсутствие тестов на код не оставляет шансов на изменение скоупа продукта как в ходе разработки, так и после нее, и делает багфиксинг неприемлемо дорогим.
Или всё это одно большое IMHO? Ну так нужно так и писать тогда: «по моему мнению, в компаниях, в которых я работал, автоматическое тестирование развито слабо», вместо безаппеляционного мнения, преподносимого как.истина в последней инстанции.
Я вот работал в компании, которая автоматические тесты пишет с 90х годов. Что дальше, моё мнение против мнения автора?
Тем более, для внедрения TDD/BDD и изобретать ничего не нужно, в современных средах разработки достаточно добавить тестовый проект. На самом деле это единственно возможный способ убедиться что твой собственный код отвечает всем требованиям, других способов попросту не существует. Любой программист так и или иначе всегда делал отдельные маленькие проекты, в которых пробовал новые идеи. Ну так вот — место таким проектам — в тестах!
Maxik77, зачем в вашем случае понадобилось выносить тесты в отдельный проект?
Без разницы кто пишет тесты. Место тестам — в отдельном проекте и отдельной области видимости
Место тестам — в отдельном проекте
Зачем тратить лишние ресурсы на связывание двух проектов?
Первый раз вообще о таком ужасе слышу.
Как раз рилиз диплой подразумевает, что там нет всех этих левых зависимостей, которые неизбежно тянутся за тестами, да и самих тестов нет, которые неизбежно раздувают результирующий бинарник. К тому же тесты могут обладать сайд-эффектами, т.е. код работает только в присутствии тестов, что является очень неприятной фичей.
На CI деплоится весь солюшен, который с нуля собирается и прогоняются тесты. Потом собирается инсталлятор, пекеджи и т.д.
Именно так всё работает во всех C/C++/C# проектах, в которых я участвовал.
В скриптовых языках возможно это и не так актуально, так как зависимости все грузятся на этапе пре-компиляции или вообще в рантайме.
а) У нас есть инструменты для запуска проектных задач через командную строку (таск-раннеры, Gulp, Grunt). Сами задачи пишем сами. Например, задачей может быть сборка проекта, или его отдельных компонентов, тестирование, деплой, генерация документации, эспорт документов, и прочее. Как-правило есть задача на сборку продукта для продуктива (склейка списка исходников, минификация, и прочее), и на выходе получается или папка с исходниками для прода, или архив.
б) У нас есть пакетные менеджеры, для установки внешних зависимостей в проект. Они позволяют разделять девелоперские зависимости от зависимостей самого продукта.
В JavaScript приложениях мы можем держать всё в одном проекте, и не смешивать одно в другое.
В модулях на джаваскрипте что я видел — тесты вынесены в отдельную директорию, и релиз на выходе в поддиректории dist. Никакой особой проблемы с этим не вижу, просто особенность инструментария и языка.
Вот что я реально видел — это тесты положены в ту же папку, что и сорс файл, только у него суффикс _test.java, они даже в одном пространстве имён находятся и потом собираются в один .jar. Вот это реально бред, так делать нельзя
Разрабатывать по TDD? Иди поучи свою жену щи варить. Что нам говорит TDD, сначала пишем тест. Он не проходит. Имплементируем функционал — проходит. Такой подход иррационален. Зрелый продукт внутри представляет собой иерархическую структуру с компонентами и слоями, которые в свою очередь тоже покрыты тестами. TDD двойное покрытие. Учитывая что бизнес логика меняется, то со временем придется еще поддерживать и тесты.
Как на мой взгляд должно производиться тестирование. Чем важнее и «базовее» компонент, тем лучше он должен быть покрыт тестами. TDD хорошо подходит для некоторых фич фреймворков.
Интеграционное тестирование хорошо подходит для критических вещей всего продукта.
Автоматизацию надо начинать с рутинных или приемочных тестов, без которых продукт выпускать смысла нет. В идеале можно использовать DSL подход, и прямо в требовании писать сценарий на DSL для тестирования.
Например проводник винды: select menu «File», submenu «New». Keyboard «My Folder». Check: Explorer.FolderExists("%PATH%\My Folder").
Например у нас в приложении есть большое количество независимых окон, автоматизировали сценарий открытия окна, пока кодом, следующий шаг выделить DSL и дать возможность тестерам писать DSL.
Недалекое прошлое: этюд о проблемах автоматизации тестирования