В основном
Когда у вас достаточно автоматических тестов, чтобы быть уверенным в своем конвейере непрерывной интеграции?
Ответ, вероятно, станет ясным, если вы подумаете о том, в чем вы хотите быть уверены. В конечном счете, это карты 1-1; каждый тест дает вам уверенность в одном:
- Модульное тестирование дает вам уверенность в том, что класс (или модуль) выполняет то, для чего он тестируется.
- Интеграционное тестирование дает вам уверенность в том, что несколько устройств работают вместе так, как это проверяется.
- Сквозное тестирование дает вам уверенность в том, что все приложение выполняет определенную функцию, как это описано в тесте.
Исходя из того, как вы сформулировали свой вопрос, вы, вероятно, думаете прямо сейчас, например:
Я хочу быть уверен , что мое приложение может сделать X .
Таким образом, вы пишете сквозной тест, который пытается выполнить X и проверяет, правильно ли он это делает.
Более конкретный
Это все очень ссылаться на себя, но это потому, что к этому все сводится. Там просто не более того.
Например, представьте, что вы пишете приложение для создания кулинарных рецептов. Одна особенность заключается в том, что, если вы добавляете разные количества нескольких разных видов сыра, это дает вам правильную температуру и время, чтобы все они плавились.
Таким образом, вы можете написать тестовый модуль для вашего CheeseMeltCalculator
, где вы даете ему 100 г Гауда и 200 г сыра Эмменталь, а затем вы проверяете, что температура и время оказываются правильными. Это означает, что теперь вы можете быть уверены, что это подходит CheeseMeltCalculator
для 100 г гауда и 200 г сыра. Теперь, если вы повторите этот тест с 300 г гауды вместо 200 г, вы можете быть совершенно уверены, что он работает правильно для разных значений. Вы можете добавить тесты для 0
, -1
и int.MaxValue
г Гауда , чтобы быть уверенным в том , что код не подножки (или поездки правильно , как предполагался) для странного ввода.
Вы можете написать интеграционный тест, чтобы проверить, CheeseMeltCalculator
правильно ли он включен во весь процесс расчета температуры и времени еды. Если это не так, но приведенные CheeseMeltCalculator
выше тесты хороши, вы можете быть уверены, что ошибка в других калькуляторах или в способе комбинирования данных из разных калькуляторов.
И, наконец, вы можете написать сквозной тест для создания целого рецепта, и одна из вещей, которые вы проверяете, это температура и время результата. Если предыдущие 2 уровня испытаний в порядке, но для этого все идет не так, вы снова можете быть уверены, что эти части верны, и ошибка заключается в том, что расчет температуры интегрирован в приложение. Например, возможно, пользовательский ввод передан неправильно.
И, наконец , если все эти тесты в порядке, то вы можете быть уверены, что « если вы добавите разные количества разных видов сыра, это даст вам правильную температуру и время, чтобы все они плавились »
Короче говоря
Дело в том, что у вас не может быть теста «он работает правильно». Вы можете только проверить «Если я делаю X, Y случается».
Тем не менее, это именно то, что должно быть в технических спецификациях для проекта. Такое утверждение, как « если вы добавляете разные количества нескольких разных видов сыра, дает правильную температуру и время, чтобы они все плавились », не только дает клиенту четкие ожидания относительно того, что будет делать готовый продукт, но также может быть перевернуто в автоматизированные тесты.
Дополнительная информация
Пользователь Richard добавил эту информацию в редактирование:
У Мартина Фаулера есть очень хорошее резюме на его веб-сайте о наиболее распространенных стратегиях: https://martinfowler.com/articles/microservice-testing/
Я не хочу удалять это, но я хочу сказать следующее: по сравнению с этим ответом, это не «краткое изложение», а гораздо более подробное объяснение, с хорошей графикой и всем остальным.
Мой совет: если после прочтения моего ответа все будет иметь смысл, все готово. Если вещи все еще кажутся неясными, выделите немного времени и прочитайте связанную статью.
Вы не можете рассчитать метрику, которая обеспечит вам уверенность, которую вы ищете. Уверенность строится на том, что вы делаете что-то, а потом добиваетесь успеха или терпите неудачу и чему-то учитесь.
Единственные "метрики", которые я нашел, которые вселяют в меня уверенность в нашем тестовом освещении:
Автоматизированные тесты не являются серебряной пулей. Вам необходимо отслеживать, сколько производственных дефектов обнаружено в каждом цикле выпуска. Когда это число уменьшается, вы поставляете лучшее программное обеспечение. Автоматизированные тесты и непрерывная интеграция - это всего лишь инструменты, которые вы используете для предоставления лучшего программного обеспечения.
Единственный показатель, который вы действительно можете измерить, это «Вы поставляете лучшее программное обеспечение?»
И даже тогда это субъективно.
источник
В большинстве экономических условий у вас не будет бюджета для обеспечения достаточной уверенности (> 99%), но вам придется управлять ограниченным бюджетом: все зависит от соотношения затрат и выгод.
Таким образом, в действительности будут реализованы простые / дешевые / рискованные тесты, а дорогие / маловероятные - нет.
Одной из целей разработки программного обеспечения является создание архитектуры, которую легко / дешево тестировать (дизайн для тестируемости с помощью Test-driven_development ), чтобы обеспечить автоматизированное тестирование доступным.
Я предполагаю, что Pareto_principle может быть применен и для поддерживаемого / тестируемого программного обеспечения и здесь: в нем говорится, что, потратив на 20% больше денег, вы получите 80% дополнительной выгоды. Чтобы получить оставшиеся 20% больше выгоды, вам нужно потратить дополнительные 80% денег.
Вы можете применить тест Метрику как покрытия кода и охват мутаций , чтобы показать вам потенциальный непроверенный исходный код.
Но даже при 100% покрытии вы не можете быть уверены, что в вашем коде нет ошибок.
Менеджмент любит кодометрию. Если «покрытие кода> = 80%» обеспечивается руководством, в то время как разработчики не поддерживают / не любят автоматизированное тестирование, существуют способы написания тестового кода с высоким охватом, который ничего не доказывает, давая ложное чувство безопасности.
источник
Хитрость здесь не в том, чтобы беспокоиться о полном покрытии, а в управлении риском ваших изменений.
Допустим, вы используете свой конвейер для развертывания той же версии, что и в Production. Каков риск ошибки регрессии? Ноль (потому что нет изменений).
Допустим, я хочу изменить текст на одном из экранов. Я добавил тест, чтобы убедиться, что текст теперь отображается правильно (допустим, ради аргумента, это ДЕЙСТВИТЕЛЬНО важный фрагмент текста). Какие еще тесты мне нужны, чтобы убедиться в отсутствии ошибок регрессии? Реально нет ...
Таким образом, количество автоматических тестов, необходимых для каждого выпуска, зависит не от размера вашего приложения, а от размера ваших изменений. Если вы вносите небольшие изменения с низким уровнем риска, вам потребуется гораздо меньше тестов для снижения рисков.
Но подождите минутку ... разве это не очень хорошо согласуется с CI и CD?
Ага! Сохраняя все ваши изменения и дельты очень маленькими, вы снижаете многие риски регрессии с помощью процесса, а не тестирования. Более того, вопрос на самом деле не становится вопросом автоматизации (это просто инструмент, который мы будем использовать) - это просто вопрос тестирования и аппетита к риску. Полностью забудьте об автоматизации, какие тесты вы бы провели против изменений, чтобы убедиться, что изменения не привели к проблемам? Ответ на этот вопрос не меняется от процесса ручного тестирования к системе CI - единственным преимуществом является то, что многие из этих регрессионных тестов, возможно, ранее были разработаны в предыдущих функциональных возможностях, и CI побуждает вас вносить меньшие, более безопасные изменения.
TLDR
Ваши тесты должны снизить риск изменений. Развертывание с нулевой дельтой не имеет риска и, следовательно, не несет риска. Сохраняя ваши изменения небольшими, становится намного проще идентифицировать тесты, необходимые для их проверки - повторное использование автоматизации является бонусом.
источник
Это тот же показатель, что и при тестировании продукта вручную.
Практически легко идентифицировать эти зоны с низким уровнем достоверности: при условии, что вы отправляете продукт, я предполагаю, что у вас есть некоторые шаги, выполняемые вручную после завершения конвейера, которые повышают вашу уверенность в возможности отправки. Это области, которые вы должны автоматизировать, чтобы повысить уверенность в самом автоматическом процессе.
Ваша автоматизация - это постоянное усилие. Он растет и улучшается по мере улучшения вашего продукта. Дефект является причиной для переосмысления вашего кода, а также для переустановки CI. И солнечная сторона здесь заключается в том, что, поскольку доверие к самому продукту достижимо, также можно достичь уверенности в автоматизации.
источник