0

我在具有标准 phpdoc @method 语法的类中声明了许多方法,例如:

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

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

4

3 回答 3

3

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

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

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

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

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

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

于 2013-09-16T22:49:43.897 回答
2

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

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

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

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

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

于 2017-02-05T22:55:07.890 回答
2

我知道这已经很老了,但是您正在寻找的答案是模拟 __call 方法。

$this->clientMock->expects(static::at(1))
        ->method('__call')
        ->with('get', [RedisAdapter::CONNECTION_TEST])
        ->will(static::returnValue(RedisAdapter::CONNECTION_TEST_VALUE));
于 2019-03-04T18:57:50.980 回答