遵循始终抛出异常的方法的行的代码覆盖率

时间:2011-11-08 22:10:39

标签: php phpunit code-coverage xdebug

据我所知,100%的代码覆盖率只是一个目标,但是让一个包含右括号的行计为未涵盖是令人讨厌的,因为它遵循方法调用,其唯一目的是抛出异常。以下是我的基本测试用例类中的一个简单示例:

function checkForSkipAllTests() {
    if (self::$_skipAllTests) {
        self::markTestSkipped();   // [1] always throws an exception
    }                              // [2] shown as executable but not covered
}

由于[1]总是退出方法,因此实际上无法访问第[2]行。有没有办法告诉Xdebug这个通过注释markTestSkipped()方法本身?

3 个答案:

答案 0 :(得分:5)

你的pull request已经合并,所以从php-code-coverage 1.1.2开始,这应该很快就会出现(使用PHPUnit 3.6.3或3.6.4),你可以写:

private static function checkForSkipAllTests() {
    if (self::$_skipAllTests) {
        self::markTestSkipped();
    } // @codeCoverageIgnore
}

同样在更远的未来,当xDebug将能够提供“条件”覆盖时,我想我会记得关于通过重构使整个问题消失的讨论,因为结束括号在最后一个语句时将被视为“覆盖”在函数中终止函数......但我可能错了

答案 1 :(得分:3)

您可以使用stard / end注释来包围该行,以使PHP_CodeCoverage忽略它,但这意味着在调用该方法的任何地方都这样做。

function checkForSkipAllTests() {
    if (self::$_skipAllTests) {
        self::markTestSkipped();
    // @codeCoverageIgnoreStart
    }
    // @codeCoverageIgnoreEnd
}

这是一个维护噩梦,容易出错。我真的想避免这种解决方案。

答案 2 :(得分:2)

  

据我所知,100%的代码覆盖率只是一个目标,但是让一个包含右括号的行计为未覆盖是令人讨厌的,因为它遵循方法调用,其唯一目的是抛出一个例外。这是我的基础测试用例类中的一个简单示例,用于演示:

事实上,100%的代码覆盖率不是目标,但它很高兴,特别是如果它花费你零时间来实现它。我确实很奇怪;您的测试不是要测试的文件。我从不测试我的测试,我也不感兴趣他们的代码覆盖率。我已经知道哪些测试已经完成,哪些测试成功,哪些测试失败,哪些测试被跳过。这就是PHPUnit为我带来的东西; .....S...F就足够了。

我的测试位于一个单独的目录中,不包含在代码覆盖率中;在我眼里,这样做似乎毫无用处。无论如何,如果您在测试用例上有代码覆盖率报告而被出售,您可能只想删除},如下所示:

function checkForSkipAllTests() {
    if (self::$_skipAllTests)
        self::markTestSkipped();
}

是的,我知道拥有一个没有大括号的if会让我成为回答你问题的最不酷的人,但它似乎比一些神奇有用的注释更容易解决。