azure - 在 Pipeline Azure 中发布 PHPUnit 代码覆盖率结果
问题描述
Azure DevOps Pipelines 仅支持 JaCoCo 和 Cobertura 覆盖率报告格式:
PHPUnit 仅支持 Clover、Crap4jn PHP、(自定义)XML、HTML 和 TXT 覆盖率报告格式:
如何在我的 Pipeline 中发布我的 PHPUnit 测试的覆盖率结果?
解决方案
PHPUnit 9.4 添加了对 Cobertura 覆盖输出的支持。但是,Azure Pipelines 提供 atm 的默认 Ubuntu 构建代理。仅支持 phpunit 8.5。但是您可以通过在 docker 容器中运行 phpunit 9.4+ 来获取覆盖率报告。这是我当前执行此操作的 azure 构建管道的片段:
trigger:
- master
pool:
vmImage: ubuntu-latest
variables:
phpVersion: 7.4
phpunitImage: jitesoft/phpunit:7.4-9
steps:
- script: |
sudo update-alternatives --set php /usr/bin/php$(phpVersion)
sudo update-alternatives --set phar /usr/bin/phar$(phpVersion)
sudo update-alternatives --set phpdbg /usr/bin/phpdbg$(phpVersion)
sudo update-alternatives --set php-cgi /usr/bin/php-cgi$(phpVersion)
sudo update-alternatives --set phar.phar /usr/bin/phar.phar$(phpVersion)
php -version
displayName: 'Use PHP version $(phpVersion)'
# Do a composer install to get an autoloader that phpunit can use
- script: composer install --no-interaction --prefer-dist
displayName: 'composer install'
# Run the test using the jitesoft phpunit docker image to get support
# for phpunit 9+ and that way cobertura reports for code coverage.
- script: |
docker run --rm -v $(pwd):/app ${{ variables.phpunitImage }} phpunit --log-junit .junit/TEST-phpunit-junit.xml --coverage-cobertura=.coverage/COVERAGE-phpunit-cobertura.xml
displayName: 'Run tests with phpunit docker container'
- task: PublishTestResults@2
displayName: 'Publish test report'
condition: always()
inputs:
testResultsFormat: 'JUnit'
testResultsFiles: '**/TEST-phpunit-*.xml'
searchFolder: '$(System.DefaultWorkingDirectory)/.junit'
failTaskOnFailedTests: true
- task: PublishCodeCoverageResults@1
displayName: 'Publish coverage report'
condition: always()
inputs:
codeCoverageTool: 'Cobertura'
summaryFileLocation: '$(System.DefaultWorkingDirectory)/.coverage/COVERAGE-phpunit-*.xml'
pathToSources: '$(System.DefaultWorkingDirectory)/src'
failIfCoverageEmpty: true
请注意always()
Publish* 任务中的条件。这是必需的,因为如果测试失败,则该docker run
步骤将失败并显示 bash 退出代码 1,这反过来会阻止报告发布,除非这些步骤是强制的。可能有一种方法可以处理退出代码清洁器,但我还没有弄清楚。
附言。理想情况下,您还可以进行一些缓存,因此并不总是下载 docker 映像,但我跳过了该部分以使示例专注于单元测试和覆盖率报告的实际运行。
推荐阅读
- performance - Rcpp中是否有任何优化功能
- c# - mongodb c# driver set _id of bson document
- javascript - Chrome 中的 Acrobat Javascript:如何触发 HTTP 请求?
- java - 如何解决没有可用的“com.example.test.repository.ConfigRepository”类型的合格bean:预计至少有1个符合自动装配条件的bean
- javascript - 如何正确迭代日期数组并将值分配给另一个数组?
- python - 当我在我的 linux 终端中输入废话时,我得到了错误
- c# - System.Data.Entity.Core.EntityCommandExecutionException 和内部异常 SqlException:无效的列名“xxxx”
- python - 如何在有限状态机中定义动态并行条目 - python django
- julia - 如何从 julia 数据框创建字典?
- c# - Winforms 中的 Context.SaveChanges