【问题标题】:Is there a way to have PHPUnit determine code coverage for @method declarations?有没有办法让 PHPUnit 确定 @method 声明的代码覆盖率?
【发布时间】:2013-09-20 05:21:01
【问题描述】:

我在一个类中使用标准 phpdoc @method 语法声明了许多方法,例如:

/**
 * @method string magicMethod(int $arg1, array $arg2) Method description.
 */
class ... { }

在确定方法级代码覆盖率时,是否可以配置 PHPUnit 以检查这些 cmets?目前,我的覆盖率是 100%,尽管到目前为止我只接触了大约 10% 的这些魔法方法。

【问题讨论】:

    标签: php unit-testing testing phpunit code-coverage


    【解决方案1】:

    代码覆盖率只能根据现有代码计算,不能根据“虚拟”方法计算。

    要获得更真实的统计数据,您应该减少无意中生成的覆盖率。 PHPUnit 确实会为使用默认配置时执行的每一行代码生成覆盖 - 这很糟糕,因为如果您无意中沿着未使用断言测试的行运行,则覆盖不会告诉您任何事情(除了那里没有发生错误的事实)。

    当您查看手册中的code coverage chapter 时,您会看到您可以指定哪些方法通过测试进行测试,并且只有那些方法会生成覆盖率统计信息(“指定覆盖的方法”部分)。

    我比较喜欢的方法是在the phpunit.xml file中设置选项mapTestClassNameToCoveredClassName="true",将所有需要测试的类都加入白名单。这样,覆盖范围将自动限制为仅与测试类具有相同名称(减去后缀“Test”)的类。因此,如果您有一个测试“MyGreatModelTest”,它只会在“MyGreatModel”类的任何方法中创建覆盖,而不会在其他任何地方创建覆盖。

    如果您将包含代码的整个目录添加到白名单中,您还将捕获所有确实产生 0 % 覆盖率的文件,因此到目前为止未包含在统计信息中。

    注意:这些设置可能会伤害您的感受,但它们会让您更真实地了解测试期间哪些代码行真正运行,哪些代码行仅作为副作用传递。

    【讨论】:

    • 这并没有真正回答我关于让 PHPUnit 识别通过 .@method 文档声明的魔法方法的问题。为魔术方法定义 .@cover 子句只会从 phpdoc 返回失败:PHP_CodeCoverage_Exception: Trying to .@cover not existing method
    • 不,没有办法将这些标记为已覆盖,因为它们不是真正的代码(cmets 不是代码覆盖检测的一部分)。我的建议是减少来自未明确测试该部分代码的调用的所有覆盖噪声,以便查看哪些部分需要更深入地测试。
    • mapTestClassNameToCoveredClassName 自 php-code-coverage v2 起不再有效
    【解决方案2】:

    PHPUnit 使用自己的注释应用于您的 TestCase 类。它不解析测试类的注释。

    要限制特定测试的代码覆盖分析期间使用的源代码行,您必须使用@covers 注释。

    如果在测试类中使用魔术方法:

    /**
     * @covers My\Class::__call
     */
    public function testMyMagicMethod()
    {
         $this->assertSomething($this->subject->magicMethod());
    }
    

    由于__call() 是您测试的类中调用的真正方法,因此覆盖 源代码行应该在里面。

    【讨论】:

      【解决方案3】:

      我知道这是超级旧的,但您正在寻找的答案是模拟 __call 方法。

      $this->clientMock->expects(static::at(1))
              ->method('__call')
              ->with('get', [RedisAdapter::CONNECTION_TEST])
              ->will(static::returnValue(RedisAdapter::CONNECTION_TEST_VALUE));
      

      【讨论】:

        猜你喜欢
        • 2011-04-16
        • 2012-05-04
        • 1970-01-01
        • 2017-10-20
        • 2014-06-27
        • 2012-08-04
        • 1970-01-01
        • 1970-01-01
        • 2018-05-29
        相关资源
        最近更新 更多