PHP单元测试

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;

可以考虑用中文来组织编写单元测试;

优化单测环境搭建,执行,可以让更多人使用单测,这部分优化可能更易于团队走上单测的道路。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181109B0EJ6F00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券