Проверка и настройка покрытия кода в Azure Pipelines

Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022

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

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

В этой статье показано, как просматривать, настраивать и устранять неполадки с покрытием кода в Azure Pipelines. Вы узнаете, как настроить покрытие диффа для pull requests, конфигурировать политики покрытия и устранить распространенные проблемы.

Замечание

Хотя вы можете создавать код из различных систем управления версиями, поддерживаемых Azure Pipelines, функция покрытия кода для pull request, рассмотренная в этой статье, на данный момент доступна только для Azure Repos.

Поддерживаемые форматы, задачи и артефакты

Поддерживаемые форматы

Azure Pipelines может публиковать результаты покрытия с помощью задачи "Публикация результатов покрытия кода" версии 2. Задача может отображать результаты в 2 различных представлениях:

  • Для cobertura, jacoco, clover, gcov, pcov и других xml-форматов создается HTML-представление, содержащее более подробные сведения в отчете об охвате кода и предпочтительно большинством клиентов.
  • Для .coverage/.cjson/.covx — табличное представление создает, содержащее меньше сведений, чем html-представление.

Артефакты и результаты

Артефакты покрытия кода, опубликованные во время сборки, можно просмотреть на вкладке "Сводка" в сводном отчете выполнения конвейера.

Снимок экрана показывает вкладку

Кроме того, можно просмотреть результаты отчета о охвате кода на вкладке "Покрытие кода ":

Снимок экрана: содержимое вкладки

  • При публикации покрытия кода с помощью форматов покрытия Cobertura или JaCoCo артефакт покрытия кода содержит .html файл, который можно просмотреть в автономном режиме для дальнейшего анализа. Снимок экрана: сводка отчета HTML.
  • Для .NET и .NET Core можно получить доступ к ссылке для загрузки артефакта, выбрав этап покрытия кода в сводке сборки.
  • Visual Studio Test может собирать данные о покрытии для приложений .NET и .NET Core. Он создает .coverage файлы, которые можно скачать и использовать для дальнейшего анализа в Visual Studio. Снимок экрана с результатами покрытия кода.

Tasks

Публикация результатов покрытия кода публикует результаты покрытия кода в Azure Pipelines, которые были созданы сборкой в формате Cobertura или JaCoCo.

Встроенные задачи, такие как Visual Studio Test, .NET Core, Ant, Maven, Gulp, Grunt и Gradle , предоставляют возможность публиковать данные покрытия кода в конвейере.

Рекомендации по Docker

Для приложений, использующих Docker, можно запускать сборки и тесты внутри контейнера и создавать результаты покрытия кода в контейнере. Чтобы опубликовать результаты в конвейере, сделайте полученные артефакты доступными для задачи "Публикация результатов покрытия кода ". Для справки см. аналогичный пример публикации результатов теста в разделе "Сборка, тестирование и публикация результатов с файлом Docker" для Docker.

Важные замечания

  • В многоэтапном конвейере YAML результаты покрытия кода доступны только после завершения всего конвейера. Чтобы просмотреть результаты покрытия кода перед развертыванием в производственной среде, может потребоваться разделить этап сборки на собственный конвейер.
  • Объединение результатов покрытия кода из нескольких запусков тестов в данный момент работает только для .NET и .NET Core. Нет планов поддержки других форматов.

Полное покрытие и дифференциальное покрытие

Полный охват измеряет охват для всего кода проекта. В контексте пул-реквестов разработчики сосредоточены на изменениях, которые они вносят, и хотят знать, покрыты ли тестами конкретные строки кода, которые они добавили или изменили. Этот тип покрытия — это покрытие diff.

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

Индикаторы покрытия отображаются в изменённом представлении файлов, независимо от того, включены ли сведения о комментариях pull request.

Настройка дифференциального покрытия

Чтобы изменить настройки покрытия кода по умолчанию для запросов на вытягивание, добавьте в корневой каталог репозитория файл конфигурации YAML с именем azurepipelines-coverage.yml. Задайте требуемые значения в этом файле, а Azure DevOps использует их автоматически при следующем запуске конвейера.

Вы можете изменять следующие параметры:

Снимок экрана: параметры, которые можно настроить.

Пример конфигурации

coverage:  
  status:                    # Code coverage status will be posted to pull requests based on targets defined below. 
    comments: on             # Off by default. When on, details about coverage for each file changed will be posted as a pull request comment.  
    diff:                    # Diff coverage is code coverage only for the lines changed in a pull request. 
      target: 60%            # Set this to a desired percentage. Default is 70 percent 

Дополнительные примеры с подробностями см. в репозитории образцов YAML для покрытия кода.

Состояние покрытия, сведения и индикаторы

При настройке pipeline для сбора и публикации покрытия кода при создании pull request публикуется информация о статусе покрытия кода. По умолчанию сервер проверяет, что тесты охватывают не менее 70% измененных строк. Вы можете изменить пороговое значение покрытия diff на желаемое, изменив параметр целевого показателя, упомянутый ранее.

Снимок экрана: ошибка проверки статуса покрытия.

Проверка состояния вычисляет покрытие изменений для всех файлов в пулл-реквесте. Чтобы увидеть процент для каждого файла, откройте раздел «Сведения», как описано в предыдущем разделе. Когда включено, система публикует сведения в качестве комментария к пул-реквесту.

Снимок экрана: сбой проверки покрытия Diff.

В представлении изменённых файлов в запросе на вытягивание изменённые строки также помечены индикаторами покрытия, чтобы показать, охвачены ли эти строки покрытием.

Снимок экрана: индикаторы изменения покрытия строки запроса на вытягивание.

Принудительное применение защиты ветви с помощью политики покрытия кода

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

Состояние покрытия кода, размещенное из конвейера, следует соглашению {name-of-your-pipeline/codecoverage} об именовании.

Замечание

  • Политики ветви в Azure Repos (даже необязательные политики) не позволяют автоматически выполнять pull-запросы, если они не проходят проверку. Это поведение не зависит от политики покрытия кода.
  • Политика покрытия кода не переопределяется на failed, если сборка завершается ошибкой.

Руководство по устранению неисправностей

Почему в представлении покрытия на вкладке "Покрытие кода" отображаются повторяющиеся библиотеки DLL?

При одновременном использовании .NET Core и .NET Framework в конвейере могут отображаться повторяющиеся библиотеки DLL. Ожидайте повторяющиеся библиотеки DLL при использовании обоих, что это предусмотрено, поскольку один и тот же модуль поступает по разным путям.

Почему на вкладке "Покрытие кода" нет данных покрытия?

Некоторые причины могут вызвать эту проблему:

  • Отсутствуют тесты или библиотеки DLL: если файлы не содержат тесты или библиотеки DLL, значение покрытия равно 0. Azure DevOps не отображает данные покрытия кода на вкладке, если значение покрытия равно 0. Вместо этого на вкладке "Покрытие кода" отображается сообщение, объясняющее, почему нет данных о охвате.

  • Пустой XML покрытия: при использовании задач "Публикация покрытия кода", если покрытие .xml , предоставленное в качестве входных данных, не содержит никаких сведений или содержит нулевые строки, данные покрытия не отображаются на вкладке. Проверьте, почему файл покрытия .xml (входной файл) пуст или не содержит сведений.

  • Сбои сборки: если сборка завершается ошибкой, вкладка покрытия кода отображается с соответствующим сообщением.

  • Конфигурация задачи VSTest: при использовании задачи VSTest, если вы не включите проверку покрытия кода или если вы упоминаете неправильные библиотеки DLL или неверные пути для тестирования файлов в поле фильтра тестирования, данные покрытия не отображаются.

  • Проблемы конфигурации сборки. Иногда существуют несколько значений конфигурации сборки, и вы не задаете все значения, такие как BuildFlavour или BuildPlatform. В пользовательском интерфейсе отображаются только значения определенных конфигураций сборки, поэтому отсутствуют другие модули.

  • Большие HTML-файлы: если размер файла превышает 7 МБ, отчет .html недоступен на вкладке "Покрытие кода". В качестве обходного решения скачайте артефакт "Покрытие кода Report_*" из опубликованных артефактов в сводке.

  • Сообщения об ошибках: если вкладка "Покрытие кода" содержит сообщение об ошибке, связанное с ошибкой конкретного пользователя, изучите, что вызвало это сообщение об ошибке.

Что делать, если проверка статуса покрытия кода никогда не завершается или происходит сбой?

Чтобы включить проверку состояния покрытия кода, попробуйте добавить azurepipelines-coverage.yml файл в корневой каталог репозитория. Убедитесь, что имя файла остается точно таким же. Ниже приведен пример:

coverage: 
  status: 
    comments: on 
    diff: 
      target: 50% 

Если проверка состояния покрытия завершается ошибкой:

  1. Проверьте процент охвата диффа. Если это меньше целевого показателя, попробуйте увеличить процент покрытия различий.
  2. Если сборка завершилась ошибкой по какой-либо причине, это также может привести к сбою проверки статуса покрытия кода.
  3. Проверьте, какая задача создает файл покрытия или отчет в конвейере. Убедитесь, что задача правильно загружает отчет о покрытии или файл.
  4. В случаях, когда комментарии про покрытие показывают "Нет исполняемых изменений" или "Нет данных о покрытии кода", это может возникнуть из-за удаления строк, добавления пробелов или введения комментариев. Эти случаи являются неисполняемыми изменениями и не имеют значения, поэтому покрытие кода не учитывает их.

Как исключить некоторые библиотеки DLL из покрытия кода?

Чтобы исключить файлы из покрытия кода, используйте класс ExcludeFromCodeCoverageAttribute.

Как опубликовать сводку покрытия кода с правильными сведениями путем объединения нескольких сводных файлов?

Задача "Публикация покрытия кода версии 1" не поддерживает несколько сводных файлов в качестве входных данных. Вместо этого используйте задачу "Публикация покрытия кода версии 2", которая поддерживает несколько форматов файлов.

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

Как запустить проверку покрытия кода?

Для .html файлов проверки состояния покрытия не поддерживаются. Используйте задачу проверки качества сборки для проверки результатов покрытия кода.

Отчет на вкладке "Покрытие кода" содержит неточные числа

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

Политика покрытия кода заблокирована — в чём причина?

Некоторые факторы могут вызвать эту проблему:

  • Неправильный формат имени политики ветви: проверьте, соответствует ли имя политики ветви и не имеет дополнительных символов.

    Снимок экрана показывает вкладку «Политики» и выделенное имя политики ветки, для подтверждения, что оно соответствует имени конвейера.

  • Использование PublishCodeCoverage версии 1: политика покрытия кода зависает, и комментарии не создаются. Вместо этого используйте задачу PublishCodeCoverage версии 2.

  • Слишком много файлов в PR: если PR содержит более 100 файлов, политика покрытия блокируется.

  • Несколько политик покрытия: если настроить несколько политик покрытия, один из них зависает. Настройте только одну политику и удалите другую зависшую политику.

Я вижу 0% покрытия для моих PR даже после добавления тестов

Если вы добавляете тесты для покрытия измененных или новых строк кода в PR и тем не менее видите 0% покрытие различий:

  1. Убедитесь, что недавно добавленные тесты выполняются как часть сборки.
  2. Если тесты не выполняются, проверьте и обновите конфигурацию, чтобы включить их в сборку, так как покрытие невозможно вычислить, если тесты не выполняются.

Я не вижу комментариев о охвате диффа на PR, хотя я вижу отчет о охвате, опубликованный

Некоторые факторы могут вызвать эту проблему:

  • Версия задачи: комментарии по покрытиям diff поддерживаются только в версии V2 Publish Code Coverage.
  • Отсутствие изменений в исполняемом коде: комментарии по покрытию diff создаются для файлов с изменениями в исполняемом коде. Если в пулл-запросе есть только обновления конфигурации, Azure DevOps отображает покрытие кода на основе всех тестов, выполняемых во время сборки, но может не быть расчета покрытия изменений.
  • Формат отчета о покрытии: если в функциональном коде есть изменения, а комментарий не создается, убедитесь, что конвейер создаёт отчет в одном из поддерживаемых форматов, указанных в начале этой статьи.

На вкладке "Покрытие кода" не отображается правильный HTML-отчет

При возникновении проблем с генерацией отчета .html, система переключается на упрощенное представление.

Снимок экрана показывает вкладку «Покрытие кода», список модулей и диаграмму покрытия с визуальным индикатором, которая является резервным упрощенным представлением.

Какие средства покрытия и форматы результатов можно использовать для проверки покрытия кода в пул-реквестах?

В настоящее время можно использовать только форматы покрытия кода Visual Studio.coverage для проверок пул-реквестов. Используйте этот формат, если вы публикуете покрытие кода с помощью задачи "Тест Visual Studio", команды "тест" задачи .NET Core и параметра TRX задачи "Публикация результатов теста".

Если при создании pull request активируется несколько конвейеров, объединится ли покрытие между конвейерами?

Если при возникновении pull request активируется несколько потоков, покрытие кода не объединяется. Эта возможность в настоящее время предназначена для одного конвейера, который собирает и публикует покрытие кода для pull requests. Если необходимо объединить данные покрытия по конвейерам, отправьте запрос функции на Сообщество разработчиков.