如何配置 PhpStorm、Codeception 和 Docker 以可靠地获得代码覆盖率

Posted

技术标签:

【中文标题】如何配置 PhpStorm、Codeception 和 Docker 以可靠地获得代码覆盖率【英文标题】:How to configure PhpStorm, Codeception and Docker to reliably get code coverage 【发布时间】:2020-03-03 04:34:12 【问题描述】:

我不知道如何可靠地配置我的项目的各个部分以在 phpStorm 中显示代码覆盖率。

我正在使用 PhpStorm (EAP)、docker (19.03.5-rc1) 和 docker-compose (1.24.1)。我使用包含 php 服务的 docker-compose.yml 设置我的项目(Docker 映像 in2code/php-dev:7.3-fpm 包含 xdebug 并基于官方 php:7.3-fpm 映像) 我用 composer 和所需的 codeception (3.1.2) 创建了一个新项目。我运行了 codecption 引导程序,添加了覆盖设置,创建了一个单元测试并运行了带有覆盖的 while 测试套件。覆盖率没有出现在 PhpStorm 中,或者到处都显示为 0%。我不知道如何配置 PhpStorm/Codeception 来显示覆盖率。有些项目可以使用,但它们被配置为使用 Docker 映像而不是正在运行的 docker-compose 容器。

我尝试了以下远程 PHP 解释器:

远程 PHP 解释器 -> Docker -> 图像 (in2code/php-dev:7.3-fpm) Remote PHP Interpreter -> Docker -> docker-compose 为这个项目构建的镜像 (cct_php:latest) 远程 PHP 解释器 -> Docker Compose -> 服务 php -> docker-compose exec 远程 PHP 解释器 -> Docker Compose -> 服务 php -> docker-compose 运行

我为上面创建的每个解释器创建了一个 PHP 测试框架。 我为每个测试框架配置创建了一个 Codeception 运行配置。 我使用(项目默认)PHP CLI 解释器和其他远程解释器的任意组合执行了所有 Codeception 运行配置。

测试框架配置了正确的 codeception 路径(codeception 版本由 phpstorm 检测),并将 codeception.yml 文件的路径作为默认配置文件。所有运行配置都使用测试框架配置中的默认配置文件。

我还尝试在根 codeception.yml 文件中启用覆盖,尝试了 work_dir: /appremote: false

这些尝试都没有生成显示在 PhpStorm 中的代码覆盖率。

使用 PHP Remote Interpreter Docker Image 配置代码覆盖工作的项目(docker-compose 为该项目构建的图像) 编辑:项目的 CLI 解释器必须是由docker-compose build 构建的图像。在 Codeception 运行配置中设置不同的命令行解释器没有任何影响

docker-compose.yml

version: '3.7'

services:
  php:
    image: in2code/php-dev:7.3-fpm
    volumes:
      - ./:/app/
      - $HOME/.composer/auth.json:/tmp/composer/auth.json
      - $HOME/.composer/cache/:/tmp/composer/cache/

测试/unit.suite.yml

actor: UnitTester
modules:
    enabled:
        - Asserts
        - \App\Tests\Helper\Unit
    step_decorators: ~

coverage:
    enable: true
    remote: true
    include:
        - src/*

tests/unit/App/Controller/AirplaneControllerTest.php

<?php
declare(strict_types=1);
namespace App\Tests\App\Controller;

use App\Controller\AirplaneController;

class AirplaneControllerTest extends \Codeception\Test\Unit

    /**
     * @covers \App\Controller\AirplaneController::start
     */
    public function testSomeFeature()
    
        $airplaneController = new AirplaneController();
        $airplaneController->start();
    

我是否遗漏了配置中的某些内容? 最好的解决方案是对远程解释器使用docker-compose exec 进行有效配置,以便其他服务(如 mysql 或 ldap)可用于功能测试。

【问题讨论】:

Rutger 发布了一个 Answer 说“看看这里描述的解决方法:https://youtrack.jetbrains.com/issue/WI-61914” 【参考方案1】:

不幸的是,它现在已经无可救药地坏了:https://youtrack.jetbrains.com/issue/WI-32625

【讨论】:

【参考方案2】:

我注意到 PHPStorm 使用此选项调用 codeception

--coverage-xml /opt/phpstorm-coverage/admin_service$unit_tests.xml

但是当测试完成时,我会收到这条消息

XML report generated in /opt/phpstorm-coverage/admin_service$$unit_tests.xml

请注意文件名不同。所以我使用这个命令创建了一个链接

ln admin_service\$\$unit_tests.xml admin_service\$unit_tests.xml

并重新开始测试覆盖。覆盖窗口出现了。

【讨论】:

以上是关于如何配置 PhpStorm、Codeception 和 Docker 以可靠地获得代码覆盖率的主要内容,如果未能解决你的问题,请参考以下文章

Codeception 验收测试因底部导航而失败

Yii2中如何使用CodeCeption

phpstorm如何配置xdebug?(hpStudy+PhpStorm+XDebug配置)

Yii2中如何使用CodeCeption

如何在 Codeception 中使用 Stub::update?

如何在 Codeception\Util\Stub 中正确使用 atLeastOnce 方法?