【问题标题】:Code coverage for lines following methods that always throw exceptions始终抛出异常的方法后面的行的代码覆盖率
【发布时间】:2011-12-24 20:38:31
【问题描述】:

我知道 100% 的代码覆盖率只是一个目标,但是将包含右大括号的行算作 未覆盖 很烦人,因为它遵循一个方法调用,其唯一目的是抛出异常。这是我的基本测试用例类中的一个简单示例来演示:

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

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

【问题讨论】:

    标签: php phpunit code-coverage xdebug


    【解决方案1】:

    您的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 将能够提供“条件”覆盖时,我想我记得讨论过通过重构使整个问题消失,因为在最后一个语句时,右括号将被视为“覆盖”在函数中终止函数......但我可能错了

    【讨论】:

    • 这很快!确实,这正是我提交请求的原因。很高兴听到 Xdebug 正在寻求从源头上解决问题。条件覆盖也很酷。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      我知道 100% 的代码覆盖率只是一个目标,但是将包含右括号的行算作未覆盖是很烦人的,因为它遵循一个唯一目的是引发异常的方法调用。这是我的基本测试用例类中的一个简单示例来演示:

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

      我的测试在一个单独的目录中,不包含在代码覆盖范围内;在我看来,这样做似乎毫无用处。无论如何,如果您对测试用例的代码覆盖率报告感到满意,您可能想简单地摆脱},如下所示:

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

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

      【讨论】:

      • 如果 unclebob 被允许使用不带大括号的 ifs,我们也是 :) --- 我只是假设这是一个测试助手类,那些通常会被测试(因为他们不是测试他们自己他们需要测试)。值得一提的是,我忽略了这一点
      • @edorian LOL 在鲍勃叔叔的评论中。尽管如此,这是他提出的少数几个我通常不同意的立场之一。也许这只是我说话的有限经验。 :)
      • @Berry - 正如 edorian 所说,这些类在我们的测试框架中,是 PHPUnit_Framework_TestCase 子类的基本测试用例,并被我们所有的实际测试使用。我当然不会跟踪单元测试本身的代码覆盖率。 :)
      • @Berry - 省略括号在这里可以工作,但在多行块中不行。和你一样,我讨厌没有大括号的积木。
      • @DavidHarkness 显然,它不适用于多行块。但是之后;您的示例显示单行;)
      猜你喜欢
      • 2017-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 2011-05-27
      • 2022-01-18
      • 1970-01-01
      相关资源
      最近更新 更多