PHP代码覆盖率

Posted nece001

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP代码覆盖率相关的知识,希望对你有一定的参考价值。

先安装xdebug

参考:https://blog.csdn.net/nece001/article/details/112713712

不管哪种方式xdebug都是必须的!

xdebug的这一项配置必须要有coverage,逗号间不能有空格!
xdebug.mode = debug,coverage

代码覆盖率

使用phpUnit生成

参考:PHP 单元测试覆盖率 | Laravel China 社区

安装PHPUnit

phpunit官网:PHPUnit – PHP测试框架

安装参考:PHPUnit 手册 – 第 1 章 安装 PHPUnit

项目根目录新建phpunit.xml

<!--
    属性
    bootstrap 需要前置加载的文件,如:autoload.php
-->
<phpunit bootstrap="">
    <!-- 指定测试代码所在目录(相对于本文件所在位置的路径) -->
    <testsuites>
        <testsuite name="mySuite">
            <directory>./tests</directory>
        </testsuite>
    </testsuites>

    <!-- 需要计算覆盖率的目录 -->
    <filter>
        <whitelist addUncoveredFilesFromWhitelist="true" processUncoveredFilesFromWhitelist="true">
            <directory suffix=".php">./extend</directory>
        </whitelist>
    </filter>

    <!-- 生成覆盖率报告的格式和位置 -->
    <logging>
        <log type="coverage-html" target="./test-result/report"/>
    </logging>
</phpunit>

编写测试代码

  1. 新建extend目录,用于存放被测代码。
  2. 新建tests目录,用于存放单元测试代码。

被测代码:extend\\helper\\Math.php

<?php

class Math

    public function add($a, $b)
    
        return $a + $b;
    

    public function jian($a, $b)
    
        return $a - $b;
    

    public function cheng($a, $b)
    
        return $a * $b;
    

    public function chu($a, $b)
    
        return $a / $b;
    

    public function call($a, $b)
    
        $this->add($a, $b);
    

测试代码:

tests\\simple\\MathTest.php

<?php

use PHPUnit\\Framework\\TestCase;

require_once(__DIR__ . '/../../extend/helper/Math.php');

class MathTest extends TestCase

    public function testAdd()
    
        $math = new Math();
        $result = $math->add(1, 2);

        $this->assertEquals(3, $result, '当期望的数组和实际的数组不相等时报这条信息');
    

    public function testSub()
    
        $math = new Math();
        $result = $math->jian(5, 3);

        $this->assertEquals(2, $result, '当期望的数组和实际的数组不相等时报这条信息');
    

    public function testCheng()
    
        $math = new Math();
        $result = $math->cheng(5, 3);

        $this->assertEquals(15, $result, '当期望的数组和实际的数组不相等时报这条信息');
    

tests\\simple\\Math2Test.php

<?php

use PHPUnit\\Framework\\TestCase;

require_once(__DIR__ . '/../../extend/helper/Math.php');

class Math2Test extends TestCase

    public function testChu()
    
        $math = new Math();
        $result = $math->chu(1, 2);

        $this->assertEquals(3, $result, '当期望的数组和实际的数组不相等时报这条信息');
    

    public function testCall()
    
        $math = new Math();
        $result = $math->call(1, 2);

        $this->assertEquals(3, $result, '当期望的数组和实际的数组不相等时报这条信息');
    

运行

d:/项目根目录> phpunit

运行后会生成报告放在目录:test-result\\report ,查看index.html

 

另一种方式

参考文档:(代码已过时,我在下面做了修改)
https://blog.csdn.net/galen2016/article/details/82791856

安装php-code-coverage

代码仓库:https://github.com/sebastianbergmann/php-code-coverage

安装命令:

composer require phpunit/php-code-coverage

在根目录新增一个prepend.php

<?php

/**
 * Created by PhpStorm.
 * User: 灵枢
 * Date: 2018/9/5
 * Time: 下午5:02
 */
require_once dirname(__FILE__) . '/vendor/autoload.php';

use SebastianBergmann\\CodeCoverage\\CodeCoverage;
use SebastianBergmann\\CodeCoverage\\Driver\\Xdebug3Driver;
use SebastianBergmann\\CodeCoverage\\Filter;

$filter = new Filter;
$filter->includeDirectory('/path/to/directory');

// 实例初始化做了修改
$coverage = new CodeCoverage(
    (new Xdebug3Driver($filter)),
    $filter
);

$coverage->start('<Site coverage>'); #开始统计
register_shutdown_function('__coverage_stop', $coverage); #注册关闭方法

function __coverage_stop(CodeCoverage $coverage)

    $coverage->stop(); #停止统计
    $writer = new \\SebastianBergmann\\CodeCoverage\\Report\\Html\\Facade;
    # 设置生成代码覆盖率页面的路径
    $writer->process($coverage, dirname(__FILE__) . '/coverage_html');

新建文件echoNumber.php,用来测试的覆盖率

<?php

/**
 * Created by PhpStorm.
 * User: 灵枢
 * Date: 2018/8/31
 * Time: 下午3:18
 */
include_once("prepend.php");
class echoNumber


    function add($a, $b)
    
        echo $a + $b . PHP_EOL;
    

    function jian($a, $b)
    
        echo $a - $b . PHP_EOL;
    

    function cheng($a, $b)
    
        echo $a * $b . PHP_EOL;
    

    function chu($a, $b)
    
        echo $a / $b . PHP_EOL;
    

    function call($a, $b)
    
        $this->add($a, $b);
    


$f = new echoNumber();
$f->add(3, 4);
$f->cheng(2, 3);
$f->call(5, 6);

运行命令:

d:> php echoNumber.php

运行后就会在根目录下新增一个文件夹,用来存放生成html报告

如何在 gitlab.com 上的 PHP 项目的作业列表中启用代码覆盖率输出

【中文标题】如何在 gitlab.com 上的 PHP 项目的作业列表中启用代码覆盖率输出【英文标题】:How to enable code coverage output in job list for PHP project on gitlab.com 【发布时间】:2017-11-24 09:33:06 【问题描述】:

对于托管在https://www.gitlab.com 的项目,我想在 CI 设置中设置代码覆盖率,以便它可以显示在工作列表中

我的配置如下:

.gitlab-ci.yml

image: php:7.1.1

cache:
  paths:
  - vendor/

before_script:
# Install git, the php image doesn't have installed
- apt-get update -yqq
- apt-get install git -yqq

# Install composer
- curl -sS https://getcomposer.org/installer | php

# Install all project dependencies
- php composer.phar install

# Run our tests
test:
    only:
        - master
        - develop
    script:
        - vendor/bin/phpunit --configuration phpunit.xml --coverage-text --colors=never

作业成功,但显示错误消息

错误:没有可用的代码覆盖驱动程序

我已更新 setting for Test coverage parsing 并将正则表达式设置为

^\s*Lines:\s*\d+.\d+\%

PHP/PHPUnit 的示例。

当我运行命令时

vendor/bin/phpunit --coverage-text --colors=never

在本地,我得到以下输出:

Code Coverage Report:     
  2017-06-21 14:52:55     

 Summary:                 
  Classes: 100.00% (4/4)  
  Methods: 100.00% (14/14)
  Lines:   100.00% (43/43)

\Rodacker\CartExample::Article
  Methods: 100.00% ( 6/ 6)   Lines: 100.00% ( 11/ 11)
\Rodacker\CartExample::ArticleLoader
  Methods: 100.00% ( 2/ 2)   Lines: 100.00% ( 21/ 21)
\Rodacker\CartExample::ArticleRepository
  Methods: 100.00% ( 3/ 3)   Lines: 100.00% (  6/  6)
\Rodacker\CartExample::Image
  Methods: 100.00% ( 3/ 3)   Lines: 100.00% (  5/  5)

【问题讨论】:

你的跑步者缺少 xdebug。 是的,这也是我想出来的。通过apt-get 安装它时遇到问题,但它可以使用 pecl。 【参考方案1】:

我使用 Docker 容器和 Gitlab CI。

我有一个典型的 PHPUnit 配置。

<?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.3/phpunit.xsd" bootstrap="vendor/autoload.php" colors="true">
  <coverage processUncoveredFiles="true">
    <include>
      <directory>src</directory>
    </include>
    <report>
      <clover outputFile="phpunit.coverage.xml"/>
    </report>
  </coverage>
  <testsuites>
    <testsuite name="My Suite">
      <directory>tests</directory>
    </testsuite>
  </testsuites>
</phpunit>

用于测试的配置的一部分。测试覆盖需要vendor/bin/phpunit --coverage-text --colors=nevercoverage: '/^\s*Lines:\s*\d+.\d+\%/'

testing:
  image: $CI_REGISTRY/my-images/ci-docker-compose:latest
  stage: test
  before_script:
    - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
  script:
    - docker-compose -f docker-compose.yml up -d --build
    - docker-compose exec -T my-php-container vendor/bin/phpunit --coverage-text --colors=never
  coverage: '/^\s*Lines:\s*\d+.\d+\%/'
  only:
    - merge_requests

我的 Dockerfile(一部分)。

# some commands

RUN apk add --no-cache --virtual .build-deps autoconf file g++ gcc libc-dev pkgconf make \
    && pecl install pcov && docker-php-ext-enable pcov \
    && apk del .build-deps

# some commands

以下命令很重要:pecl install pcov &amp;&amp; docker-php-ext-enable pcov。他们安装包以实现快速测试覆盖。

在另一种方式中,您可以在测试前使用xdebug"xdebug.mode=coverage" 或在Docker 容器中设置DEBUG_MODE=coverage

【讨论】:

【参考方案2】:

好吧,就我而言,我必须在我的覆盖范围正则表达式中添加一对括号(捕获组)。这是我的.gitlab-ci.yml 文件的摘录:

phpunit:
  image: php:8.0
  stage: qa
  before_script:
    - pecl install xdebug
    - docker-php-ext-enable xdebug
  script: XDEBUG_MODE=coverage vendor/bin/phpunit --coverage-text
  coverage: /\s+Lines:\s+(\d+\.\d+%)/

另外我建议将所有 PHPUnit 配置移动到 phpunit.xml

【讨论】:

拜托,谢谢。这就是我一直在寻找的。​​span> @sk001 很高兴为您提供帮助:)【参考方案3】:

对于那些正在搜索为什么 PHPUnit 在 CI 中运行时不输出覆盖率报告的人,需要进行一些更改。

在我的情况下,它是 PHP 7.3 CLI 版本,运行 vendor/bin/phpunit --configuration phpunit.xml.dist --coverage-text --colors=never 时缺少 phpunit 9.4.3 覆盖率报告,在日志文件中输出了 Warning: xdebug.mode=coverage has to be set in php.ini

通过将具有 xdebug 属性 xdebug.mode=coverage 的 xdebug.ini 文件添加到 PHP conf.d 文件夹来解决此问题。要查找您的 php.ini 文件所在的位置,请运行 php -i |grep php\.ini

【讨论】:

【参考方案4】:

问题是 docker 映像中缺少 Xdebug 安装。我无法使用apt-get 安装正确的版本,所以我必须在before_script 部分添加pecl install xdebug 调用:

image: php:7.1.1

cache:
  paths:
  - vendor/

before_script:
# Install git, the php image doesn't have installed
- apt-get update -yqq
- apt-get install git -yqq

# Install Xdebug
- pecl install xdebug
- docker-php-ext-enable xdebug

# Install composer
- curl -sS https://getcomposer.org/installer | php

# Install all project dependencies
- php composer.phar install

# Run our tests
test:
    only:
        - master
    script:
        - vendor/bin/phpunit --configuration phpunit.xml --coverage-text --colors=never

【讨论】:

是的,它完成了这项工作,但覆盖率报告如何。测试完成后 Gitlab ci/cd 如何公开覆盖率报告? @RiteshAryal - 在项目的 -- Settings > CI / CD > General pipelines > Test coverage parsing ...有例子。我想这就是你所追求的。

以上是关于PHP代码覆盖率的主要内容,如果未能解决你的问题,请参考以下文章

如何在 gitlab.com 上的 PHP 项目的作业列表中启用代码覆盖率输出

以 Clover XML 格式生成代码覆盖率报告 ... PHP 致命错误:无法声明类 ...,因为名称已在

php代码审计之变量覆盖

php 代码审计之变量覆盖

php 覆盖父主题短代码

php代码审计整理