Когда у вас достаточно автоматических тестов, чтобы быть уверенным в своем конвейере непрерывной интеграции?

10

Непрерывная интеграция с тестированием полезна для того, чтобы убедиться, что у вас постоянно проверяется «отправляемый» код.

Тем не менее, действительно сложно поддерживать полный набор тестов, и часто создается впечатление, что сборка все равно будет глючить.

Сколько тестов вы должны чувствовать, чтобы чувствовать себя уверенно при тестировании конвейера CI? Используете ли вы какую-то метрику, чтобы решить, когда будет достаточно тестов?

stonefruit
источник

Ответы:

16

В основном

Когда у вас достаточно автоматических тестов, чтобы быть уверенным в своем конвейере непрерывной интеграции?

Ответ, вероятно, станет ясным, если вы подумаете о том, в чем вы хотите быть уверены. В конечном счете, это карты 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/

Я не хочу удалять это, но я хочу сказать следующее: по сравнению с этим ответом, это не «краткое изложение», а гораздо более подробное объяснение, с хорошей графикой и всем остальным.

Мой совет: если после прочтения моего ответа все будет иметь смысл, все готово. Если вещи все еще кажутся неясными, выделите немного времени и прочитайте связанную статью.

Р. Шмитц
источник
Это хороший концептуальный взгляд. Будете ли вы иметь примеры показателей, которые были бы полезны для обеспечения уверенности в нашем тестовом освещении?
каменный плод
@stonefruit Не совсем, но я думаю, что у меня есть именно тот ответ, который вам нужен: Testivus On Test Coverage
R. Schmitz
@stonefruit Что касается числа в этой притче, 80%, это число вы слышите чаще в этом контексте. Главным образом из-за принципа Парето - последние 20% охвата составляют 80% работы. Другими словами, это в 4 раза больше работы, чтобы получить его с 80% до 100%, чем прежде всего до 80%. Это часто излишне, но представьте, что вы пишете контрольный код для спутника: если всплывает ошибка, вы не можете просто это исправить; получение покрытия до 100% - это стоящее вложение.
Р. Шмитц
Похоже, я третий программист. ха - ха. Я полагаю, что в конце дня все возвращается к подходу, основанному на оценке риска, как вы упомянули на примере спутника.
косточковый
1
@stonefruit Может быть, вы первый, хотя. Если у вас есть проект с охватом 0%, не начинайте марш смерти до 80%. Вместо этого, действительно, « просто напишите несколько хороших тестов ». Может быть, использовать последнюю половину пятницы для написания тестов, что-то вроде этого. По моему опыту, вы сначала автоматически предложите тесты с наилучшим соотношением усилий и вознаграждений, и каждый тест даст вам немного больше уверенности.
Р. Шмитц
4

Вы не можете рассчитать метрику, которая обеспечит вам уверенность, которую вы ищете. Уверенность строится на том, что вы делаете что-то, а потом добиваетесь успеха или терпите неудачу и чему-то учитесь.

Единственные "метрики", которые я нашел, которые вселяют в меня уверенность в нашем тестовом освещении:

  1. Количество дефектов, обнаруженных в производстве
  2. Можете ли вы провести рефакторинг кодовой базы и положиться на тестовое покрытие для выявления дефектов регрессии?

Автоматизированные тесты не являются серебряной пулей. Вам необходимо отслеживать, сколько производственных дефектов обнаружено в каждом цикле выпуска. Когда это число уменьшается, вы поставляете лучшее программное обеспечение. Автоматизированные тесты и непрерывная интеграция - это всего лишь инструменты, которые вы используете для предоставления лучшего программного обеспечения.

Единственный показатель, который вы действительно можете измерить, это «Вы поставляете лучшее программное обеспечение?»

И даже тогда это субъективно.

Грег Бургардт
источник
По сравнению с другими ответами этот ответ обращается к возможным метрикам. Я думал о том, чтобы сделать предлагаемые показатели более значимыми. Возможно, в дополнение к определению количества дефектов, обнаруженных в производстве, присвойте каждому дефекту оценку, основанную на управлении рисками, и установите пороговое значение (например, 30 пунктов дефектов, обнаруженных за последние 3 месяца). Достижение порога может указывать на проверку системы на наличие возможных ошибок до того, как техническая задолженность за ошибочный код возрастет в геометрической прогрессии.
каменный плод
2

Когда у вас достаточно автоматических тестов, чтобы быть уверенным в своем конвейере непрерывной интеграции?

В большинстве экономических условий у вас не будет бюджета для обеспечения достаточной уверенности (> 99%), но вам придется управлять ограниченным бюджетом: все зависит от соотношения затрат и выгод.

  • Некоторые автоматизированные тесты дешевы в реализации, а некоторые чрезвычайно дороги.
  • В зависимости от вашего фактического управления рисками некоторые риски должны быть покрыты тестами, а другие - нет.

Таким образом, в действительности будут реализованы простые / дешевые / рискованные тесты, а дорогие / маловероятные - нет.

Одной из целей разработки программного обеспечения является создание архитектуры, которую легко / дешево тестировать (дизайн для тестируемости с помощью Test-driven_development ), чтобы обеспечить автоматизированное тестирование доступным.

Я предполагаю, что Pareto_principle может быть применен и для поддерживаемого / тестируемого программного обеспечения и здесь: в нем говорится, что, потратив на 20% больше денег, вы получите 80% дополнительной выгоды. Чтобы получить оставшиеся 20% больше выгоды, вам нужно потратить дополнительные 80% денег.

Вы можете применить тест Метрику как покрытия кода и охват мутаций , чтобы показать вам потенциальный непроверенный исходный код.

Но даже при 100% покрытии вы не можете быть уверены, что в вашем коде нет ошибок.

Менеджмент любит кодометрию. Если «покрытие кода> = 80%» обеспечивается руководством, в то время как разработчики не поддерживают / не любят автоматизированное тестирование, существуют способы написания тестового кода с высоким охватом, который ничего не доказывает, давая ложное чувство безопасности.

k3b
источник
1

Хитрость здесь не в том, чтобы беспокоиться о полном покрытии, а в управлении риском ваших изменений.

Допустим, вы используете свой конвейер для развертывания той же версии, что и в Production. Каков риск ошибки регрессии? Ноль (потому что нет изменений).

Допустим, я хочу изменить текст на одном из экранов. Я добавил тест, чтобы убедиться, что текст теперь отображается правильно (допустим, ради аргумента, это ДЕЙСТВИТЕЛЬНО важный фрагмент текста). Какие еще тесты мне нужны, чтобы убедиться в отсутствии ошибок регрессии? Реально нет ...

Таким образом, количество автоматических тестов, необходимых для каждого выпуска, зависит не от размера вашего приложения, а от размера ваших изменений. Если вы вносите небольшие изменения с низким уровнем риска, вам потребуется гораздо меньше тестов для снижения рисков.

Но подождите минутку ... разве это не очень хорошо согласуется с CI и CD?

Ага! Сохраняя все ваши изменения и дельты очень маленькими, вы снижаете многие риски регрессии с помощью процесса, а не тестирования. Более того, вопрос на самом деле не становится вопросом автоматизации (это просто инструмент, который мы будем использовать) - это просто вопрос тестирования и аппетита к риску. Полностью забудьте об автоматизации, какие тесты вы бы провели против изменений, чтобы убедиться, что изменения не привели к проблемам? Ответ на этот вопрос не меняется от процесса ручного тестирования к системе CI - единственным преимуществом является то, что многие из этих регрессионных тестов, возможно, ранее были разработаны в предыдущих функциональных возможностях, и CI побуждает вас вносить меньшие, более безопасные изменения.

TLDR

Ваши тесты должны снизить риск изменений. Развертывание с нулевой дельтой не имеет риска и, следовательно, не несет риска. Сохраняя ваши изменения небольшими, становится намного проще идентифицировать тесты, необходимые для их проверки - повторное использование автоматизации является бонусом.

Liath
источник
0

Это тот же показатель, что и при тестировании продукта вручную.

Практически легко идентифицировать эти зоны с низким уровнем достоверности: при условии, что вы отправляете продукт, я предполагаю, что у вас есть некоторые шаги, выполняемые вручную после завершения конвейера, которые повышают вашу уверенность в возможности отправки. Это области, которые вы должны автоматизировать, чтобы повысить уверенность в самом автоматическом процессе.

Ваша автоматизация - это постоянное усилие. Он растет и улучшается по мере улучшения вашего продукта. Дефект является причиной для переосмысления вашего кода, а также для переустановки CI. И солнечная сторона здесь заключается в том, что, поскольку доверие к самому продукту достижимо, также можно достичь уверенности в автоматизации.

ittays
источник