testing - Gitlab 覆盖徽章总是未知的

标签 testing gitlab-ci code-coverage badge

问题
我正在处理一个 Laravel 包项目并设置一个管道以在合并请求时对其进行测试(针对 php 7.3、7.4 和 8.0)并将其发布到我的主分支上的包注册表。
我正在尝试为代码覆盖率设置徽章,但我无法使其正常工作,因为它总是显示 unknown百分比。
我做了什么
管道

stages:
  - dependancies
  - linting
  - test
  - publish

# Dependancies job
download dependancies:
  stage: dependancies
  # job stuff

# Linting jobs
phpcs:
  stage: linting
  # job stuff

# test jobs templates
.testing_template: &testing
  stage: test
  script:
    - php -dxdebug.mode=coverage vendor/bin/phpunit --coverage-text --colors=never
  only:
    - merge_requests

# Testing jobs
php 8:
  image: mileschou/xdebug:8.0
  <<: *testing

php 7.4:
  image: mileschou/xdebug:7.4
  <<: *testing

php 7.3:
  image: mileschou/xdebug:7.3
  <<: *testing


#  Publish to package registry
publish:
  only:
    - master
    - tags
  # job stuff
所以我的管道工作如下:
  • 在功能分支上
  • 下载依赖
  • Lint 代码
  • 针对 php 7.3、7.4 和 8.0 进行测试

  • 在主分支和标签上
  • 将包发布到包注册表


  • 所以在合并请求上执行的部分如下
    enter image description here
    此外,我可以在管道作业部分看到每个测试作业的代码覆盖率
    enter image description here
    (我不确定为什么测试会导致不同的代码覆盖率百分比,因为代码库是相同的,但显然与 php 版本和代码解析中完成的特定优化有关。)
    徽章
    由于这是一个 Laravel 包项目,我正在使用 PhpUnit 对其进行测试,因此我将给定的正则表达式用于测试覆盖解析设置(取自 Gitlab docs)。
    ^\s*Lines:\s*\d+.\d+\%
    
    我想要一个在 master branch 上显示代码覆盖状态的徽章,不在功能分支上,所以我创建了一个带有徽章图像网址的覆盖徽章如下(我添加了对特定测试作业的引用,即 php 7.4 )
    https://gitlab.com/%{project_path}/badges/%{default_branch}/coverage.svg?job=php%207.4
    
    但它一直显示为
    enter image description here .
    我认为 Gitlab 找不到所需的 php 7.4作业,因为它不在 master 上执行分支但在功能分支上,所以我尝试替换 %{default_branch}带有 %{commit_sha} 的占位符引用特定的提交,但这也不起作用,因为(我想)它引用了合并提交(仅触发了发布作业)而不是触发了整个管道的提交。
    我被卡住了
    我不知道如何获得 master 的代码覆盖率百分比分支。
    我不想在主分支上再次执行测试,因为我已经在合并之前测试了功能分支。
    我能怎么做?我错过了什么吗?

    最佳答案

    我在不同的堆栈中遇到了同样的问题( Java、Gradle 和 Jacoco )。我已经解决了这个问题,我将分享我所做的。我希望我的解决方案能给你一些想法。
    首先,在您的项目中,转到 设置 > CI/CD 并展开 通用管道部分。填写 测试覆盖解析带有基于您使用的工具的适当正则表达式的文本框。您可以在此页面上找到这些正则表达式的示例列表:
    Test coverage parsing samples
    Gitlab 期望测试运行器工具将根据 CI 作业日志中某处的给定正则表达式打印测试覆盖率百分比。如果测试运行器引擎没有将其打印到控制台,您可以手动进行。例如:

    test:
      stage: test
      script:
        - gradle test jacocoTestReport --info
        # Print test coverage to console
        - cat build/reports/jacoco/test/html/index.html | grep -o 'Total[^%]*%'
      artifacts:
        paths:
          - build/reports/jacoco/test/*
    
    确保日志中存在测试覆盖率后,徽章将完美运行。
    pipeline and coverage badge sample

    关于testing - Gitlab 覆盖徽章总是未知的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66780206/

    相关文章:

    scala - Akka Scala TestKit 测试 PoisonPill 消息

    javascript - 如何从 Protractor 测试发出 POST 请求?

    SwiftUI Preview - 无法构建方案,没有这样的模块 "ProjectName"

    c# - 添加变量以跨解决方案访问

    gitlab-ci - GitLab CI Runner 突然变慢了

    unit-testing - 突变测试在实践中有用吗?

    teamcity - 如何使用 dotCover 从 TeamCity 覆盖范围中通过掩码 *.Tests.dll 排除程序集?

    gitlab - CI 失败时如何在 gitlab 合并请求页面上显示错误消息?

    amazon-web-services - 如何使用 GitLab CI/CD 在 aws 中部署 docker 应用程序

    python - Pytest 测试显示在代码覆盖率报告中