Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法让PHPUnit确定@method声明的代码覆盖率?_Php_Unit Testing_Testing_Phpunit_Code Coverage - Fatal编程技术网

有没有办法让PHPUnit确定@method声明的代码覆盖率?

有没有办法让PHPUnit确定@method声明的代码覆盖率?,php,unit-testing,testing,phpunit,code-coverage,Php,Unit Testing,Testing,Phpunit,Code Coverage,我在一个类中使用标准phpdoc@method语法声明了许多方法,例如: /** * @method string magicMethod(int $arg1, array $arg2) Method description. */ class ... { } 在确定方法级代码覆盖率时,是否可以将PHPUnit配置为对照这些注释进行检查?目前,我的覆盖率是100%,尽管到目前为止我只接触了这些神奇方法的10%。代码覆盖率只能基于现有代码计算,不能基于虚拟方法 为了获得更真实的统计数据,您应

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

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

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

代码覆盖率只能基于现有代码计算,不能基于虚拟方法

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

当您查看手册中的时,您会发现您可以指定哪些方法通过测试进行测试,并且只有那些方法生成覆盖率统计信息部分指定了覆盖率方法


我更喜欢的方法是在中设置选项MapTestClassNameToOveredClassName=true,并将所有要测试的类添加到白名单中。这样,覆盖范围将自动限制为仅具有与测试类相同名称的类减去后缀Test。所以,如果您有一个测试MyGreatModelTest,它将只在MyGreatModel类的任何方法中创建覆盖率,而不会在其他任何地方创建覆盖率

如果您将整个目录和代码添加到白名单中,您还将捕获所有覆盖率为0%的文件,因此到目前为止还没有包含在统计数据中


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

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

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

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

/** *@covers My\Class::\u呼叫 */ 公共函数测试MyMagicMethod { $this->assertSomething$this->subject->magicMethod; } 正如在您测试的类中调用的实际方法一样,包含
源代码行应该在其中。

我知道这是非常古老的,但您要寻找的答案是模拟调用方法

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

这并没有真正回答我关于让PHPUnit识别通过@method doc声明的神奇方法的问题。定义@magic方法的cover子句只会从phpdoc:PHP\u CodeCoverage\u异常:尝试返回失败。@cover not existing methodNo,无法将它们标记为covered,因为它们不是真正的代码注释,不属于代码覆盖检测的一部分。我的建议是减少未显式测试该部分代码的调用产生的所有覆盖噪音,以便查看哪些部分需要进行更严格的测试。mapTestClassNameToCoveredClassName自php代码覆盖率v2以来不再工作