После запуска инструмента покрытия кода мы получим отчет о покрытии, показывающий показатели покрытия. Мы видим, что, хотя покрытие функций у нас составляет 100 %, покрытие веток составляет только 50 %. Мы также видим, что инструмент покрытия кода istanbul не рассчитывает показатель покрытия условий. Для этого используют метрику “покрытие кода тестами” (code coverage). Покрытие анализируется тестовыми фреймворками, которые считают отношения строчек, задействованных в тестах, ко всем строчкам исходного кода. Например, если в коде есть условная конструкция, и она не проверяется тестами, это значит, что все строки кода, входящие в нее, не будут покрыты.
Покрытие кода представляет собой показатель того, какая часть исходного кода охвачена тестами. Это полезный показатель позволяет оценить качество комплекта тестов. В этой статье мы покажем, как начать работать с ним в собственных проектах.
Tasks #1 и #2: Restore and Build
Есть самые разные критерии покрытия, которые можно измерить, но обычно именно различные пути, условия, функции, и утверждения в рамках программы составляют общее покрытие. Метрика покрытия кода – это как раз процент тестов, которые выполняют каждый из этих критериев покрытия. Если вы всегда ударяете по ветке “YES”, вы не покрываете часть “else” и это будет показано в результатах покрытия кода. Это хорошо, потому что теперь вы знаете, что то, что не покрыто и вы можете написать тест на покрытие части “else”.
Шаг “Build Quality Checks” позволяет добавить “Quality Gate” в пайплайн. Как и предыдущие этапы, этот шаг достаточно простой, но является “вишенкой на торте”, мы будем использовать политику ветки Azure DevOps для того что бы настроить остановку билда если порог покрытия снизился. “Build Quality Checks” при первом запуске анализирует покрытие кода и формирует Baseline – базовое значение, от которого будет считаться снижение покрытия кода, это просто процент покрытия предыдущего успешного билда. После выполнения всех тестов, PHPUnit выводит сводную таблицу. В примере выше видно что в классе PHP\Package\User покрыто 100% кода, а вот класс PHP\Package\App не тестируется вообще, так как покрытие 0%.
О метриках тестирования: code coverage для тестировщиков
Для анализа покрытия репозитория с большим количеством сервисов процесс немного усложняется. Во второй статье будет рассмотрен универсальный шаблон для разных сервисов c использованием переменных. Здесь вы можете узнать больше о различных типах тестирования программного обеспечения. Решение Open DevOps от Atlassian представляет собой платформу с открытым пакетом инструментов, где вы можете создать конвейер разработки с непрерывной поставкой с помощью любимых инструментов. Узнайте из наших руководств по тестированию DevOps, как инструменты Atlassian и сторонних производителей могут интегрировать тестирование в ваш рабочий процесс.
Две самых популярных метриках покрытия — code coverage и branch coverage. В заключительном шаге “Build Quality Checks” по умолчанию выбран анализ c Сode Сoverage метрикой. Проще начинать внедрение метрики с контролем снижения процента покрытия сравнивая с предыдущей сборкой и вырабатывать подходящий процент исходя из опыта разработки требований проекта. Повторюсь, если вы только начали работать с метриками, лучше начинать от простого, билб за билдом анализировать как именно формируется процент покрытия кода вашего проекта и не делать жесткие требования к покрытию когда. Важно также учитывать, что высокий процент покрытия кода не всегда гарантирует высокое качество программы.
Как добиться 100% покрытия тестами кода в блоке try-catch?
Хороший инструмент даст вам не только процент кода, который исполняется, но и позволит просверлить в данные и посмотреть, какие именно строки кода выполнились во время того или иного теста. Общепринятым правилом, которое можно считать ориентиром, является покрытие кода на уровне от 70% до 90%. Это означает, что тестами должно быть покрыто от 70% до 90% всех строк, инструкций или ветвей кода. Но даже этот диапазон не является строгим стандартом и может меняться в зависимости от обстоятельств. Чтобы прийти к развитой культуре тестирования, необходимо сперва добиться, чтобы команда понимала, как приложение должно себя вести, когда кто-то использует его правильно и когда кто-то пытается нарушить его работу. Инструменты покрытия кода могут помочь понять, на чем следует сосредоточить внимание в дальнейшем, но они не покажут, достаточно ли надежны существующие тесты с точки зрения проверки непредвиденного поведения.
- Целью использования покрытия кода является повышение качества программного обеспечения путем обнаружения недостаточно протестированных участков кода и повышения надежности программы в целом.
- Есть самые разные критерии покрытия, которые можно измерить, но обычно именно различные пути, условия, функции, и утверждения в рамках программы составляют общее покрытие.
- Мы также видим, что инструмент покрытия кода istanbul не рассчитывает показатель покрытия условий.
- После выполнения всех тестов, PHPUnit выводит сводную таблицу.
- Вы узнаете, что сломалось, когда получите сборку с ошибкой, но вам будет сложно понять, какие компоненты успешно прошли тестирование.
Ваш инструмент покрытия кода будет отслеживать выполнение комплекта тестов и сообщать, какая часть операторов, веток, функций и строк была выполнена при запуске тестов. Если вы не добьетесь достаточно высокого процента покрытия, после запуска рабочего процесса непрерывной интеграции (CI) могут начаться отказы при прохождении тестов. Конечно, как уже сказано выше, было бы неразумно устанавливать слишком высокий порог отказа, а 90-процентное покрытие с высокой вероятностью будет причиной частых отказов сборки.
Quality Gate: настройка проверки Code Coverage для микросервисов .Net Core в Azure DevOps
Branch coverage дает более глубокий анализ, чем code coverage. Вместо использования количества строк кода, эта метрика ориентируется на таки структуры как команды if и switch и немного усложняет разработку тестов. Не смотря на эти недостатки, покрытие кода остается полезным инструментом при правильном использовании и совмещении с другими методами тестирования и анализа кода.
А так же добавлены Unit Tests и Functional Tests поэтому магазин удобно использовать для демонстрации и практических примеров (я попытался рассказать про эту разработку подробнее). Проект удобно разворачивается локально, в Kubernetes, Docker Compose или Azure Kubernetes Service. Так же в репозитории прилагается несколько книг полностью покрывающих цикл разработки и эксплуатации, очень удобных для изучения технологии с разных сторон QA, Development, DevOps. В статье будет использоваться код и тесты сервиса “Catalog” этого интернет магазина. Следуя этим шагам, вы сможете практически измерить покрытие кода и улучшить надежность вашего программного обеспечения.
Atlassian Together
Обычно это происходит тогда, когда в команде есть разные люди и не все из них ответственно подходят к написанию тестов. Покрытие кода означает, насколько хорошо ваш тестовый набор покрывает ваш исходный код. В какой степени исходный код покрывается набором тестовых случаев.
Quality Gate — это принудительная мера или метрика, встроенная в Pipeline, которой должно соответствовать программное обеспечение, прежде чем оно сможет перейти к следующему шагу. Эта мера обеспечивает соблюдение определенных правил, метрик или практик, которым должен следовать код, чтобы предотвратить проникновение кода низкого качества в разрабатываемое ПО. В зависимости от используемого языка (или языков) можно найти несколько вариантов создания отчетов о покрытии. Это потому, что при выполнении нашего скрипта оператор else не был выполнен. Если бы мы хотели получить покрытие в 100 %, можно было бы просто добавить еще одну строку (по сути, еще один тест), чтобы обеспечить использование всех веток с этим оператором. С ростом проекта, определить какой код протестирован, а какой нет, становится сложно, хотя подобная потребность возникает регулярно.