gpt4 book ai didi

php - 使用 PHPUnit 达到 100% 的代码覆盖率

转载 作者:IT王子 更新时间:2023-10-29 01:02:44 24 4
gpt4 key购买 nike

我一直在为一个项目创建一个测试套件,虽然我意识到获得 100% 的覆盖率并不是一个应该努力实现的指标,但其中有一个奇怪的地方我想澄清一下代码覆盖率报告。

看截图:

enter image description here

因为被测试方法的最后一行是 return,所以最后一行(只是一个右括号)显示为从未被执行,因此整个方法被标记未在概述中执行。 (要么这样,要么我没有正确阅读报告。)

完整方法:

static public function &getDomain($domain = null) {
$domain = $domain ?: self::domain();

if (! array_key_exists($domain, self::$domains)) {
self::$domains[$domain] = new Config();
}

return self::$domains[$domain];
}

这是有原因的,还是故障?

(是的,我通读了 How to get 100% Code Coverage with PHPUnit ,虽然相似,但大小写不同。)

编辑:

继续阅读报告,我注意到代码中其他地方的 switch 语句也是如此。所以这种行为至少在某种程度上是一致的,但让我感到困惑。

编辑2:

我正在运行:OS X 上的 PHPUnit 3.6.7、PHP 5.4.0RC5、XDebug 2.2.0-dev

最佳答案

首先:100% 的代码覆盖率是努力 的重要指标。这并不总是可以通过理智的努力来实现,而且这样做并不总是很重要:)

问题来自 xDebug 告诉 PHPUnit 这一行是可执行的,但没有被覆盖。

对于简单的情况,xDebug 可以判断该行不可达,因此您可以在那里获得 100% 的代码覆盖率。

请参阅下面的简单示例


第二次更新

问题现已修复 xDebug bugtracker所以构建一个新版本的 xDebug 将解决这些问题:)

更新(有关 php 5.3.x 的问题,请参见下文)

由于您运行的是 PHP 5.4 和 xDebug 的 DEV 版本,因此我已经安装了它们并对其进行了测试。我遇到了和你一样的问题,你评论的输出相同。

我不能 100% 确定问题是否来自 xDebug 的 php-code-coverage(phpunit 模块)。这也可能是 xDebug dev 的问题。

I've filed a bug with php-code-coverage我们会找出问题出在哪里。


对于 PHP 5.3.x 问题:

对于更复杂的情况,这CAN会失败。

对于您展示的代码,我只能说“它适用于我”(下面的复杂示例)。

也许更新 xDebug 和 PHPUnit 版本,然后再试一次。

我已经看到它在当前版本中失败了,但这取决于有时整个类(class)的样子。

删除 ?: 运算符和其他单行多语句的东西也可能会有所帮助。

据我所知,xDebug 正在进行重构,以避免出现更多此类情况。 xDebug 曾经希望能够提供“语句覆盖”,这应该可以解决很多这样的情况。目前这里没有什么可以做的

虽然 //@codeCoverageIgnoreStart//@codeCoverageIgnoreEnd 会“覆盖”这条线,但它看起来真的很难看,而且通常弊大于利。

对于发生这种情况的另一种情况,请参阅以下问题和答案:

what-to-do-when-project-coding-standards-conflicts-with-unit-test-code-coverage


简单示例:

<?php
class FooTest extends PHPUnit_Framework_TestCase {
public function testBar() {
$x = new Foo();
$this->assertSame(1, $x->bar());
}
}

<?php
class Foo {
public function bar() {
return 1;
}
}

产生:

phpunit --coverage-text mep.php 
PHPUnit 3.6.7 by Sebastian Bergmann.

.

Time: 0 seconds, Memory: 3.50Mb

OK (1 test, 1 assertion)

Generating textual code coverage report, this may take a moment.

Code Coverage Report
2012-01-10 15:54:56

Summary:
Classes: 100.00% (2/2)
Methods: 100.00% (1/1)
Lines: 100.00% (1/1)

Foo
Methods: 100.00% ( 1/ 1) Lines: 100.00% ( 1/ 1)

复杂示例:

<?php

require __DIR__ . '/foo.php';

class FooTest extends PHPUnit_Framework_TestCase {

public function testBar() {
$this->assertSame('b', Foo::getDomain('a'));
$this->assertInstanceOf('Config', Foo::getDomain('foo'));
}
}

<?php

class Foo {
static $domains = array('a' => 'b');

static public function &getDomain($domain = null) {
$domain = $domain ?: self::domain();
if (! array_key_exists($domain, self::$domains)) {
self::$domains[$domain] = new Config();
}
return self::$domains[$domain];
}
}

class Config {}

产生:

PHPUnit 3.6.7 by Sebastian Bergmann.

.

Time: 0 seconds, Memory: 3.50Mb

OK (1 test, 2 assertions)

Generating textual code coverage report, this may take a moment.

Code Coverage Report
2012-01-10 15:55:55

Summary:
Classes: 100.00% (2/2)
Methods: 100.00% (1/1)
Lines: 100.00% (5/5)

Foo
Methods: 100.00% ( 1/ 1) Lines: 100.00% ( 5/ 5)

关于php - 使用 PHPUnit 达到 100% 的代码覆盖率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8804095/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com