【问题标题】:How to reach 100% code coverage with expectexception in PHPUnit如何在 PHPUnit 中使用 expectexception 达到 100% 的代码覆盖率
【发布时间】:2017-12-07 12:40:45
【问题描述】:

我正在测试,如果输入必须失败,handleMatchResults 将抛出 RouteNotFoundException。这是实际测试的代码:

public function test_not_found_match_throws_NotFoundException()
{
    $this->expectException(RouteNotFoundException::class);
    $request = $this->prophet->prophesize(ServerRequest::class);
    $this->router->handleMatchResults([0, []], $request->reveal());
}

一切都按预期进行,我的测试通过了,但是,当我运行 phpunit --coverage-text (或任何其他覆盖类型)时,我得到了这个测试的最后一行,以及另一个类似测试的最后一行,无法访问/未执行。我可以理解那些没有被执行,因为如果代码是正确的,这个测试的最后一行将永远不会被执行,因为

$this->router->handleMatchResults([0, []], $request->reveal());

总是会抛出异常并且函数的执行会结束。那么,如何实现 100% 的课程覆盖率?

【问题讨论】:

    标签: php phpunit code-coverage


    【解决方案1】:

    不,您不会得到 100%,因为指标不应该在您的测试中。 您应该在配置中使用whitelist or blacklist 来省略此测试。

    必须配置白名单告诉 PHPUnit 哪个 要包含在代码覆盖率报告中的源代码文件。

    <filter>
      <whitelist processUncoveredFilesFromWhitelist="true">
        <directory suffix=".php">/path/to/files</directory>
        <file>/path/to/file</file>
        <exclude>
          <directory suffix=".php">/path/to/files</directory>
          <file>/path/to/file</file>
        </exclude>
      </whitelist>
    </filter>
    

    您的代码将标记,即转到handleMatchResults 并执行throw。在其他测试中,您将使用此功能执行正面场景。

    这样你应该有 100% 的覆盖率。

    【讨论】:

    • 谢谢。我已经有一个不会引发异常的测试用例。无论如何,我刚刚告诉 phpunit 忽略测试方法,我再次 100% 测试覆盖率。
    • @FrOz:要检查测试覆盖了哪些代码,只需覆盖单元(请参阅@covers 注释)。还将 all 测试代码列入白名单,因为您想查看哪些代码被覆盖(而不是哪些测试代码)。对您的测试进行代码覆盖,以查看您的测试中是否有死代码。就像您在此处提出问题的示例一样,测试做得太多了。提取一个测试异常的测试,通过捕获预期的异常来做到这一点,否则使测试失败($this-&gt;fail('an expected exception was not thrown'); 或类似的)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 2012-08-04
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 2018-05-29
    • 2012-01-18
    相关资源
    最近更新 更多