【问题标题】:What does Xdebug in PHP return?PHP 中的 Xdebug 返回什么?
【发布时间】:2012-09-22 22:18:55
【问题描述】:

此代码带有 PHP/Xdebug(在 Windows 7 x64 上使用 Xdebug 2.2.1 和 PHP 5.4,我还添加了一个行计数器以提高可读性):

1: xdebug_start_code_coverage();
2:
3: for ($ii = 0; $ii < 3; ++$ii)
4:    $x = time();
5:
6: if (false)
7:    echo "Never executed.";
8:
9: echo var_dump(xdebug_get_code_coverage());

..我得到这个输出(我修改了一些值以使其更具可读性):

array (size=1)
  '..\testpage.php' => 
    array (size=4)
      3 => int 1
      4 => int 1
      7 => int 1
      9 => int 1

Xdebug 网站上的文档说:

“元素中的值表示该行已执行的执行单元总数。”

来源:http://www.xdebug.com/docs/code_coverage

显然输出是错误的。第 3 行和第 4 行应该执行了 3 次,而 Xdebug 分别执行了 1 次。第6行应该执行过一次,Xdebug根本没话说。第 7 行绝对不应该被执行,但是 Xdebug 说它确实执行了一次。应该说不管有没有大括号,输出都是一样的。

在这个网址上:http://xdebug.org/archives/xdebug-general/0377.html

.. Derick Rethans 说(7 年前!)不知何故文档是错误的(现在仍然是),Xdebug 只返回 -1、0 或 1。但是,正如我的示例所示,Xdebug 返回 1直接通过,被操纵的柜台似乎使他的选择变得任意。即使 Xdebug 确实返回 -1、0 或 1,我也不知道这些值是什么意思。

那么,你们中的任何一位精英程序员有什么想法吗?如果这里的 Xdebug 有严重问题,这是否意味着我不能信任任何其他用于分析和代码覆盖的应用程序和插件,而这些应用程序和插件又使用 Xdebug?我在想 Phing 和 PHPUnit 这似乎是一种共同的婚姻。

另外,如果您想详细说明这个问题;如果 Xdebug 有问题,那么所有依赖的应用程序,你在 PHP 中使用什么来报告代码覆盖率?

编辑:如果我将参数XDEBUG_CC_UNUSEDXDEBUG_CC_DEAD_CODE 作为参数发送到xdebug_start_code_coverage,上面列出的输出使用相同的代码示例不会改变。我开始认为 Xdebug 根本不适用于代码覆盖,而不是在我的系统上。

【问题讨论】:

  • 也许 PHP 解析器仍然需要读取它并为其生成本机代码,即使它不会被执行?
  • Cole,我敢打赌你会想到第 7 行,是的,可能是这样。但是,如果他不能解释这种事情,Xdebug 岂不是完全没用?仍然存在第 3、4 和 6 行的问题。
  • 我从未使用过 Xdebug,所以我无法给出明确的答案,但根据 (digipedia.pl/usenet/thread/15739/883) 看起来它实际上并没有返回该行应该执行的次数.
  • kennypu,您可以在我的帖子中找到的第二个 URL 中看到 Derick 就是这么说的。 Xdebug 应该返回 -1、0 或 1。但我无法完全理解这些数字的含义。在我的系统上,Xdebug 似乎每行代码都返回 1,因为某些任意选择使 Xdebug 完全无用。

标签: php code-coverage xdebug


【解决方案1】:

我知道在使用带有缩进语法的条件时会出现问题。

XDebug 只知道“语句”,实际上并不理解“行”,即使它是这样显示和谈论的。

这个:

1  <?php
2
3  xdebug_start_code_coverage();
4
5  for ($ii = 0; $ii < 3; ++$ii) {
6     $x = time();
7  }
8 
9  if (false) {
10    echo "Never executed.";
11 }
12 
13 echo var_dump(xdebug_get_code_coverage());

产生:

array(1) {
  ["./test.php"]=>
  array(5) {
    [5]  => int(1)
    [6]  => int(1)
    [7]  => int(1)
    [9]  => int(1)
    [13] => int(1)
  }
}

有关更多信息,请参阅:PHPUnit 手册中的Edge Cases

和其他 SO 问题:

【讨论】:

  • 谢谢willoller,您的评论确实很有帮助。但现在我更加困惑了。我复制了您的代码并得到了相同的输出。让我想知道为什么 Xdebug 说执行了第 7 行而不是第 11 行(或者是 statement 7 和 statement 11?)?
  • 在我的代码上执行 7 是因为 6 是。 11 不是因为 10 不是。尾随的} 是任何强迫性约 100% 覆盖率的人的祸根。为了解决这个问题,phpUnit 添加了//@codeCoverageIgnore (?) 所以你可以把它放在大括号之后:} //@codeCoverageIgnore。布莱赫。
猜你喜欢
  • 2022-11-17
  • 2010-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-08
  • 2011-10-19
  • 2018-10-16
  • 2013-06-09
相关资源
最近更新 更多