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,在启动测试用例的时候,写入固定的单测数据。这么做的考虑主要有:

  1. 数据库里的数据能用于单元测试,也可以用于QA的接口及集成测试;
  2. mock数据库和缓存,更多的要看代码层面,这有的时候成本较大;
  3. 最后,从QA同学学到的,单元测试都用中文组织,可以明显提高单测可读性。

PHP的单测还是有一定的学习成本以及上手成本。特别是复杂业务,对case的维护需要更多的投入。 不过,我还是看好单元测试,因为会使用单测的人,在代码调试,代码质量方面都更有效率,效果更好。

单元测试的实现与执行

解决完框架方面的问题,就要开始考虑,写怎么样的单测,是函数级别的单测,还是接口级别的单测。 在PHP方面,我倾向于做接口级别的单测,输入数据写在$_POST[]中,然后,执行controller。 在java方面,我就倾向于做函数级别的单测,成本较小。

image

总结

PHP的单测考虑要点:

  1. 解决PHP的框架是第一要做的事情,对于部分框架,可能要修改框架源码;
  2. PHP多是WEB开发,推荐做接口级别的单测;
  3. 做好单测前的数据库等数据准备,不使用数据库mock;
  4. 可以考虑用中文来组织编写单元测试;
  5. 优化单测环境搭建,执行,可以让更多人使用单测,这部分优化可能更易于团队走上单测的道路。

单元测试分享PPT下载


本文档来自支付产品技术交流群的聊天记录整理,由志愿者整理并发布到本网站。如需要及时收到来自支付产品技术交流群的最新消息,请扫码关注“凤凰牌老熊”的微信公众号。 本群面向支付行业的有经验(2年以上)的产品经理、软件工程师、架构师等,提供交流平台。如想加入本群,请在本文评论中留言(不公开),说明所在的公司、负责的工作、入群分享的主题和时间。