2023年11月PHP测试覆盖率解决方案

【题记:最近进行了ExcelBDD PHP版的开发,查阅了大量资料,发现PHP测试覆盖率解决方案存在不同的历史版本,让我花费了蛮多时间,为了避免后人浪费时间,整理本文,而且网上没有给出Azure DevOps里面PHP测试覆盖率的解决方案,本文一并给出】

版本

  • PHP 8.2.12

  • PHPUnit 10.4.2

  • php-code-coverage 10.1.7

  • Xdebug v3.3.0alpha3

  • 操作系统:Win11

安装

  1. 分别安装PHP, Composer(见 Composer)

  2. 安装PHPUnit,php-code-coverage

  3. 根据网上指南配置PHPUnit,比如PHPUnit 手册 -- 第 1 章 安装 PHPUnit

  4. 下载Xdebug,见Xdebug: Downloads

  5. 配置php.ini 在尾部加如下

    [Xdebug]
    zend_extension="D:\php\php_xdebug-3.3.0alpha3-8.2-vs16-x86_64.dll"
    xdebug.mode=coverage

其中zend_extension是Xdebug的绝对路径

配置

PHPUnit前后版本在phpunit.xml上历经了多次修改,网上能够查到的都是旧版,浪费了我好多时间。如下是最新格式。

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" bootstrap="vendor/autoload.php"
    xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/10.4/phpunit.xsd"
    cacheDirectory="testReports/.phpunit.cache">
    <source>
        <include>
            <directory suffix=".php">src</directory>
        </include>
    </source>
    <coverage>
        <report>
            <cobertura outputFile="testReports/cobertura.xml" />
        </report>
    </coverage>

    <logging>
        <junit outputFile="testReports/junit.xml" />
    </logging>

</phpunit>

网上容易查到的"filter","whitelist"已经过时。PHPUnit作者考虑到前后变化,提供了自动改写功能,如下:

bash 复制代码
phpunit --migrate-configuration

目前PHPUnit支持的覆盖率格式如下

XML 复制代码
<report>
    <clover outputFile="clover.xml"/>
    <cobertura outputFile="cobertura.xml"/>
    <crap4j outputFile="crap4j.xml" threshold="50"/>
    <html outputDirectory="html-coverage" lowUpperBound="50" highLowerBound="90"/>
    <php outputFile="coverage.php"/>
    <text outputFile="coverage.txt" showUncoveredFiles="false" showOnlySummary="true"/>
    <xml outputDirectory="xml-coverage"/>
</report>

参见 5. The XML Configuration File --- PHPUnit 10.4 Manual

测试结果所有选项如下

XML 复制代码
<logging>
    <junit outputFile="junit.xml"/>
    <teamcity outputFile="teamcity.txt"/>
    <testdoxHtml outputFile="testdox.html"/>
    <testdoxText outputFile="testdox.txt"/>
</logging>

Azure DevOps Pipelines的配置

微软官方没有给出PHP测试覆盖率解决方案,经过摸索,得到如下方案:

在azure-pipelines.yml对应位置,按下修改来准备好环境

bash 复制代码
- 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)
# 如下这行没有必要,azure的VM已经安装了xdebug
    sudo apt-get install php8.1-xdebug
# 下行必需,php.ini的位置可以通过 php -i 得到
    sudo sh -c "echo 'xdebug.mode=coverage' >> /etc/php/8.1/cli/php.ini"
    php -version
  displayName: 'Use PHP version $(phpVersion)'

发布测试结果

bash 复制代码
- task: PublishTestResults@2
  inputs:
    testRunner: "JUnit"
    # Make sure the file name matches the file name you specified.
    testResultsFiles: "**/testReports/junit.xml"
    failTaskOnFailedTests: true
  displayName: "Publish Test Results"

发布测试覆盖率

bash 复制代码
- task: PublishCodeCoverageResults@1
  inputs:
    codeCoverageTool: Cobertura
    summaryFileLocation: '**/testReports/cobertura.xml'

提示:PublishCodeCoverageResults@2达到的效果不如PublishCodeCoverageResults@1。

ExcelBDD PHP版在Azure DevOps配置了CI,见ExcelBDD PHP CI

全部文件见ExcelBDD开源项目PHP部分

相关推荐
乌暮13 分钟前
请求进门先安检:Spring 拦截器与统一功能实战指南
java·开发语言·后端·学习·spring
এ慕ོ冬℘゜44 分钟前
JS 事件循环、宏任务微任务:单线程底层原理 + 执行顺序
开发语言·javascript·ecmascript
其实防守也摸鱼1 小时前
Chrome 扩展安全攻防实录:从攻击面到防御实践
开发语言·前端·网络·chrome·安全·web安全·php
web打印社区1 小时前
Lodop排障总纲-常见报错一张表
开发语言·前端·javascript·chrome·websocket
Dxy12393102162 小时前
JS AES加密详解
开发语言·javascript·ecmascript
信息安全失业大专人员2 小时前
每日了解一个智能体-WorkBuddy
开发语言·ai·c#·智能体
4ever.ov02 小时前
精学C++第一站 从命名空间到引用:C++入门核心语法全梳理(13000字长文)
开发语言·c++·clion
小杨互联网2 小时前
Go 现代 CLI 工具离线镜像合集
开发语言·后端·golang·开源·go·命令行
揽星河..2 小时前
【C语言】数组
c语言·开发语言·算法
FRing032 小时前
JavaScript入门到精通三十三(异常处理、call方法、apply方法、bind方法、防抖、节流)
开发语言·前端·javascript