如何配置 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: /app
和 remote: 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 以可靠地获得代码覆盖率的主要内容,如果未能解决你的问题,请参考以下文章
phpstorm如何配置xdebug?(hpStudy+PhpStorm+XDebug配置)