【问题标题】:How to configure PhpStorm, Codeception and Docker to reliably get code coverage如何配置 PhpStorm、Codeception 和 Docker 以可靠地获得代码覆盖率
【发布时间】: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)可用于功能测试。

【问题讨论】:

标签: docker docker-compose phpstorm code-coverage codeception


【解决方案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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-25
      • 1970-01-01
      • 2013-07-31
      • 2017-09-13
      • 2019-01-29
      • 2013-09-12
      • 2021-01-24
      • 1970-01-01
      相关资源
      最近更新 更多