1.跑完接口自动化用例后,大概生成了474个.cov文件,执行生成html报告时提示正常,没有任何报错,但是打开生成报告的index.html文件时报错,无法查看报告。
$ phpcov merge --html="./coverage_html" cov/ -vvv
phpcov 4.0.5 by Sebastian Bergmann.
Generating code coverage report in HTML format ... done
刚开始怀疑是因为.cov文件过多,phpcov在处理报告时出现了异常,毕竟是第一次用这个工具,对它到底能处理多大量级的数据心理没有底。
为了测试到底是什么时候报告开始异常,我换成手动分批执行接口用例,如每执行10个用例就生成报告,依次累加,执行到倒数的十几个用例时确实又出现了异常,但是这次报错跟之前不一样,提示信息比较清楚,经过开发提醒,可能是某个接口是新开发的功能,而当前测试分支未包含这个接口的代码所以导致异常。然后又重新排查接口,意外的是后面又没有重现这种情况了,跑完跟之前一样数量的接口,可以正常生成报告。虽然这个过程很让人摸不着头脑,但是能够成功生成报告已经是很开心的事情了。
自己后面又回想了以下,不确定是不是因为中间有切换host,练到了其他的服务器上,所以才导致打开自动化测试那台服务器上的index.html文件报错。
2.因项目代码仓库很大,我在设置统计覆盖率的文件目录时将用到的文件全部都加上了,结果生成的覆盖率数据很低,只有6%,想根据这个覆盖率来补充用例简直无处下手。
咨询了开发,该项目包含很多已经废弃的功能代码,以及在生成pb文件时产生的与功能无关的代码,鉴于推动开发处理冗余代码的工作量和对项目造成的风险都不可控,只好换个思路。
如果项目仓库很大时,可以不需要一上来就直接统计整个项目下的代码覆盖率,先找开发了解下哪个文件或文件夹是项目的主功能代码,先针对这部分的代码统计覆盖率,从而补充用例。
3.查看生成的覆盖率报告时,发现两个问题:
1:phpunit将一些完全没有测试覆盖的类均标记未n/a“,导致代码覆盖率的百分比被夸大了,因为这些类的行数没有被计算在内。
2:如果测试时仅覆盖了方法中的一个分支,phpunit就默认为这个类已经全部覆盖了,导致覆盖率数据不准确
解决方法:
在需统计覆盖率的文件的类前面加上@covers ClassName,表示覆盖该类下的全部方法
如需要统计的文件类名为unitest,格式如下:
//@covers unittest
class unittest
{
...
}
后来在实际项目中已经添加了@covers ClassName后还是偶尔会出现”将一些完全没有测试覆盖的类均标记未n/a“的情况,暂未找到具体原因,保险起见,执行自动化用例前先重启服务
service php-fpm restart
开始执行后只要有了覆盖率数据,就马上生成html文件看下统计是否异常,如果异常则停止,再次执行用例,避免等到所有的用例都执行完成后生成报告才发现统计有误。