PHP单测基本操作
我11年就开始接触PHP单测,那时候还是3.x版本,现在PHPUnit都已经到7.x了. 当时,需要安装一堆lib,放到include_path里,现在都变成一个文件,下载就能用了,方便很多。 我接触过多种业务的单测,以及YAF,Yii,CI这三个框架的单测。
框架对PHP单测的影响因素
在以往的经验中深感框架对PHP单测的影响很大,主要是因为不同框架的autoload方式都不一样。这和Java的命名空间方式差别很大。不过,根源就在于单例模式对单测的支持度较差,能解决单例模式的对象mock,就比较好搞定单测。
框架对PHP单测的影响优化
YAF框架可以通过参数注入和构造注入解决mock,CI及Yii就需要修改底层框架源码,来达到对单例对象的Mock注入。
接下来,要面对的就是数据库和缓存,要不要mock的问题。经过实践,我采取的是使用各自的mysql和redis,在启动测试用例的时候,写入固定的单测数据。这么做的考虑主要有:
数据库里的数据能用于单元测试,也可以用于QA的接口及集成测试;
mock数据库和缓存,更多的要看代码层面,这有的时候成本较大;
最后,从QA同学学到的,单元测试都用中文组织,可以明显提高单测可读性。
PHP的单测还是有一定的学习成本以及上手成本。特别是复杂业务,对case的维护需要更多的投入。 不过,我还是看好单元测试,因为会使用单测的人,在代码调试,代码质量方面都更有效率,效果更好。
单元测试的实现与执行
解决完框架方面的问题,就要开始考虑,写怎么样的单测,是函数级别的单测,还是接口级别的单测。 在PHP方面,我倾向于做接口级别的单测,输入数据写在$_POST[]中,然后,执行controller。 在java方面,我就倾向于做函数级别的单测,成本较小。
总结
PHP的单测考虑要点:
解决PHP的框架是第一要做的事情,对于部分框架,可能要修改框架源码;
PHP多是WEB开发,推荐做接口级别的单测;
做好单测前的数据库等数据准备,不使用数据库mock;
可以考虑用中文来组织编写单元测试;
优化单测环境搭建,执行,可以让更多人使用单测,这部分优化可能更易于团队走上单测的道路。
领取专属 10元无门槛券
私享最新 技术干货