有没有办法让PHPUnit确定@method声明的代码覆盖率?
我在一个类中使用标准phpdoc@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%。代码覆盖率只能基于现有代码计算,不能基于虚拟方法 为了获得更真实的统计数据,您应
/**
* @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以来不再工作