【问题标题】:How to cover Exception Classes in PHPUnit如何在 PHPUnit 中覆盖异常类
【发布时间】:2012-08-07 01:48:47
【问题描述】:

我的目标是非常高的代码覆盖率,并希望覆盖异常类或将它们排除在代码覆盖率报告之外。

示例代码

class My_DataException extends Exception
{}

class Foo
{
   function __construct() { throw new My_DataException('see?'); }
}

如何获得 My_DataException 的代码覆盖率(在 library/My/DataException.php 中)或将文件排除在代码覆盖率报告中?我不想使用注释方法(@codeCoverageIgnore 或类似的方法)。

我的 phpunit.xml 定义了一个黑名单,没有白名单

<filter>
    <blacklist>
        <directory suffix="Exception.php">../library/</directory>
    </blacklist>
</filter>

每个异常文件都将以“Exception.php”结尾,所以我不确定为什么后缀部分不起作用。

其他细节:

  • 这不是关于合适的覆盖范围的问题
  • 我宁愿不要在每个异常文件中使用注解方法
  • 每个异常文件都将以“Exception.php”结尾,例如。 My/Exception.php 或 My/DataException.php

【问题讨论】:

  • 您使用的是什么版本(php、xdebug、phpunit、php-codeCoverage)?对我来说,没有可执行代码的异常不会出现在覆盖率报告中。请参阅:dl.dropbox.com/u/3615626/stackoverflow/… 运行 phpunit --coverage-text(或 html)只显示一个文件,而不是例外。
  • PHPUnit 3.6.10。 PHP 5.3.10-1ubuntu3.2,Xdebug v 2.1.3。不确定“php-codeCoverage”... n/a?

标签: php phpunit code-coverage


【解决方案1】:

我一直在寻找一种方法来覆盖实际的异常文件,这就是我最终偶然发现答案的方式:

<?php

/**
 * Simple test for exception
 */
class Api_ExceptionTest extends PHPUnit_Framework_TestCase
{
    /**
     * Test can construct the exception, then throw it.
     *
     * @expectedException Api_Exception
     */
    public function testThrowException()
    {
        $exception = new Api_Exception();
        throw $exception;
    }
}   

【讨论】:

    【解决方案2】:

    对于以下代码:

    class Foo
    {
        function __construct() {
            throw new My_DataException('see?');
        }
    }s
    

    如果您在测试中执行该行,您将获得代码覆盖率:

    new Foo;
    

    对于这样的测试,您可以通过注释告诉 Phpunit 您期望哪个异常:

    /**
     * @expectedException My_DataException
     */
    

    但是异常通常是异常,因此您不会覆盖它们,但出于安全原因也可能存在异常,您还不知道如何使用测试设置/数据/参数触发它们。

    然后更加努力地思考并尝试触发它们。否则可能是代码是多余的,因为从技术上讲您无法抛出异常,因此没有必要。

    对于您知道它们可能发生但仍然无法触发它们的情况(这可能吗?),您可以在源代码中将脚本的某些区域标记为从覆盖率报告中排除:

    // @codeCoverageIgnoreStart
    throw new My_DataException('see?');
    // @codeCoverageIgnoreEnd
    

    很少使用它,您将来可能想删除它。

    【讨论】:

    • 您关于通过其他类覆盖异常的 cmets 让我思考。我总是尝试做@covers Fooclass::method,这就是为什么我从来没有得到关于异常类的报道。我可以删除 @covers 注释以覆盖抛出它们的测试中的异常类。
    猜你喜欢
    • 2011-05-27
    • 2016-05-26
    • 2011-03-18
    • 1970-01-01
    • 2019-08-26
    • 2021-09-27
    • 2014-06-07
    • 1970-01-01
    • 2020-02-11
    相关资源
    最近更新 更多