Xdebug 2 与 Xdebug 3 - 代码覆盖率的差异

时间:2021-01-11 15:40:37

标签: php unit-testing phpunit code-coverage xdebug

我将 Xdebug 版本从 2.9.3 升级到 3.0.1,在使用 --code-coverage 运行单元测试后,我发现代码覆盖率结果存在一些差异。 假设有两种环境:

  • 环境 1:PHP 7.3.16、Xdebug 2.9.3、php-code-coverage 8.0.2、PHPUnit 9.0.2
  • 环境 2:PHP 7.3.25、Xdebug 3.0.1、php-code-coverage 8.0.2、PHPUnit 9.0.2

代码示例 1:

public function getAllOptions(): array
    {
        $this->_options = [
            [
                'label' => _'label 1,
                'value' => 'value 1'
            ],
            [
                'label' => _'label 2,
                'value' => 'value 2'
            ]
        ];

        return $this->_options;
    }

代码示例 1 的结果:

  • 环境 1:100% 的代码覆盖率
  • 环境 2:第二行 ($this->_options =) 标记为未覆盖

代码示例 2:

private function moveImportedFileToArchive(Operation $operation): void
    {
        $sourceFilePath = $this->_filesystem->getDirectoryWrite(DirectoryList::ROOT)->getAbsolutePath()
            . $operation->getFileInfo()['file_path']
            . '/'
            . $operation->getFileInfo()['file_name'];
        // @codingStandardsIgnoreStart
        $fileName = basename($sourceFilePath);
        // @codingStandardsIgnoreEnd
        $archiveFileName = (int)gmdate('U') . '_' . $fileName;
        $archivePath = static::ARCHIVE_DIR . $archiveFileName;
        $this->_varDirectory->renameFile($sourceFilePath, $archivePath);
    }

代码示例 2 的结果:

  • 环境 1:100% 的代码覆盖率
  • 环境 2:第四行 (.'/') 标记为未覆盖

我不知道是什么导致了这些差异。 它们通常发生在将值分配给变量的地方(通常与将数组分配给变量或将变量分配给数组或数组到数组有关)

1 个答案:

答案 0 :(得分:3)

Xdebug 3 可能不再涵盖某些行,因为它对收集的信息更具选择性。

我相信您的第一个问题已在 Xdebug 3.0.2 (#1922) 中得到解决。对于第二个问题,如果升级到 Xdebug 3.0.2 后仍然存在,请按照 https://bugs.xdebug.org 的说明在 https://xdebug.org/reporting-bugs 提交错误报告 - 对于代码覆盖率错误,我通常只需要一个完全可解析的显示问题的 PHP 文件。 StackOverflow 不是报告错误的地方。