关于PHPUnit代码覆盖率的很多概念,官方文档中讲的十分清楚,本文仅就部分语焉不详的细节做些补充。

虽然phpunit.xml不是必需,但每次都输入完整的命令很不方便,所以一般都要生成这个配置文件。用phpunit --generate-configuration生成的phpunit.xml默认包含forceCoversAnnotation="true",它表示必须在测试方法头部的注释里显式使用@covers标签声明统计范围,例如:

1
2
3
4
5
6
7
8
9
10
/**
* @covers Ox3f\LaravelUtils\Log\Log::<public>
* @covers Ox3f\LaravelUtils\Log\Log::parseCallStack
* @covers Ox3f\LaravelUtils\Log\Log::__construct
* @covers Ox3f\LaravelUtils\Log\Log::__callStatic
*/
public function testAll()
{
// ...
}

否则在执行统计代码覆盖率的命令时,会报risk:

There was 1 risky test:

1) Ox3f\LaravelUtils\Log\LogTest::testAll
This test does not have a @covers annotation but is expected to have one

如果希望单元测试覆盖全部代码、且不用一一显式声明,可以将此选项的值改成
false

之后即可使用明令phpunit —coverage-html ./report统计代码覆盖率,统计结果保存在report目录中。

参考