Охват кода: от неудачной сборки до публикации отчета с помощью Gitlab Pages

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

Что такое покрытие кода?

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

Почему покрытие кода важно?

Покрытие кода дает нам представление о том, насколько эффективны наши тестовые примеры, какие части нашего исходного кода тщательно выполняются, а отчет о покрытии помогает найти непроверенные части в вашей кодовой базе. Это помогает нам повышать и поддерживать качество кода. Но наличие 100% тестового покрытия не означает 100% тестирования, потому что покрытие кода, выполняемое двумя тестовыми примерами, может быть одинаковым, но входные данные 1-го тестового примера могут найти дефект, а входные данные 2-го тестового примера - нет. Есть также другие показатели, такие как цикломатическая сложность, строки кода, индекс ремонтопригодности, глубина наследования и т. Д., Которые также могут помочь вам улучшить ваш код. Я расскажу об этих темах в будущих блогах.

Как создать отчет о покрытии кода?

Это просто базовое понимание покрытия кода. Теперь давайте посмотрим, как мы можем создавать отчеты о покрытии кода в java с помощью gradle.

Для создания отчета о покрытии на java мы будем использовать jacoco, его очень легко интегрировать с вашей кодовой базой. Если вы используете gradle, вам нужно применить плагин Jacoco в своем build.gradle.

build.gradle
применить плагин: «jacoco»

После применения плагина создается новая задача с именем jacocoTestReport, которая зависит от задачи test. Вам просто нужно запустить gradle test jacocoTestReport, и ваш отчет о покрытии будет доступен по адресу $buildDir / reports / jacoco / test. По умолчанию создается отчет в формате HTML. Но как насчет того, чтобы запустить тестовую задачу, чтобы также создать отчет о покрытии. Для этого вы можете использовать свойство finalisedBy, предоставленное gradle. Это завершит тестовую задачу после jacocoTestReport.

test {
    finalizedBy jacocoTestReport
}

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

build.gradle

jacocoTestReport {
    reports {
        xml.enabled false
        csv.enabled false
        html.destination "${buildDir}/jacocoHtml"
    }
}

А теперь как насчет того, чтобы наша сборка завершилась ошибкой, если показатели покрытия кода не на должном уровне. Это поможет нам предотвратить запуск непроверенного кода в производство. Вы можете сделать это, добавив задачу jacocoTestCoverageVerification.

jacocoTestCoverageVerification {
    violationRules {
        rule {
            limit {
                minimum = 0.7
            }
        }
    }
}

0.7 утверждает, что ваши тесты должны охватывать минимум 70% вашей кодовой базы, нарушение этого приведет к сбою сборки. Теперь это требование может быть указано для проекта в целом, для отдельных файлов и для определенных типов покрытия, специфичных для JaCoCo, например, перекрываемых линий или перекрываемых ветвей. Вы можете прочитать об этом подробнее в документации Gradle.

Поскольку теперь у нас есть отчет о покрытии кода, как насчет того, чтобы опубликовать его на страницах gitlab.

Как опубликовать отчет на Gitlab Pages

Конфигурация gitlab CI определяется в файле .gitlab-ci.yml. Давайте посмотрим, как написать конфигурацию для публикации отчета на страницах gitlab.

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

test:
  stage: test
  script:
    - ./gradlew test
  artifacts:
    paths:
      - build/reports/jacoco/

Все внутри build / reports / jacoco / будет сохранено как артефакт. Мы будем использовать этот артефакт в нашей следующей работе.

Давайте опубликуем отчет о покрытии, который мы создали в нашей последней работе, на страницах gitlab. Вам необходимо добавить задание страниц в .gitlab-ci.yml.

pages:
  stage: deploy
  dependencies:
    - test
  script:
   - mkdir public
   - mv build/reports/jacoco/test/html/* public
  artifacts:
    paths:
      - public
  only:
  - master

Это задание опубликует ваш отчет о тестовом покрытии на страницах gitlab. Не то чтобы вам нужно использовать страницы в качестве названия вакансии. Использование ключевого слова dependencies укажет gitlab на загрузку артефактов, сохраненных как часть задания test. Вам также необходимо переместить отчет о покрытии в общедоступный каталог, поскольку это каталог, в котором GitLab Pages ожидает найти статический веб-сайт. Использование только ключевого слова приведет к публиковать новый отчет о покрытии только тогда, когда конвейер CI работает в главной ветви.

Как только вы впервые отправите свои изменения в .gitlab-ci.yml в Gitlab, вы увидите новую работу в конвейере CI. Когда задание pages: deploy выполнено успешно, вы можете получить доступ к отчету о покрытии, используя URL-адрес http://group-path.gitlab.io/project-path/index.html. Страница должна выглядеть примерно так:

Если вы дойдете до этого места в блоге, то теперь вы сможете опубликовать отчет о покрытии кода на страницах gitlab.