内容简介:PHP自动化测试锤子-PHPUnit&Uopz
PHP自动化测试概述
PHP是一种偏脚本化的语言,了解过ES6的朋友会发现 PHP 和ES6其实语法和一些特性上已经很接近了,对于我这种一直学 Java 的人来讲,觉得PHP和ES6语法上基本没太大区别。由于PHP的这种脚本化的特性,编码的风格一个人一个样,令其难以进行测试,这应该是每个想对PHP搞自动化测试,特别是其中单元化测试的人都会遇到的问题。我最近在公司接了个任务,要对项目中的一些很复杂的回路脚本进行自动化测试,希望组内所有人Merge代码的时候,会自动跑测试Case,这篇文章就是分享我在做这个任务时所找到的锤子。
锤子一: PHPUnit
PHPUnit是大家马上就会找到的一个锤子,关于它官方提供了PHPUnit-Book,里面介绍了其提供的测试 工具 和一些测试基本理念,大家可以花一天左右的时间系统的看完这个文档,我这里就不做赘述了。我举一个 理想情况 下的PHPUnit测试的例子:
上图展示的是测试 MyFoo
类中的 doSomething
方法,这个方法实际是调用了传入的 MyBar
类中的 doSomethingElse
方法,在这种情况下,我们只需要利用PHPUnit提供的测试替身工具,构建一个 MyBar
的测试替身,然后Mock掉其中的 doSomethingElse
方法,再将其传入 MyFoo
的 doSomething
方法中。
通过上面的步骤,我们实现了单元测试所需要的隔离, doSomething
方法不再实际依赖于外部。然后我们只需要对这个php文件执行 phpunit
命令,其中 test
前缀的方法就会被运行,一个测试就跑起来了。
然而虽然理想是丰满的,但现实很残酷,实际的PHP代码很少有这么写的,且不说每个人各有各的风格,每个公司还各有个的框架,下面举个我们公司常见的写法:
如图上所示,我们的项目中倾向于这种静态调用的面向过程写法,这种写法的问题是PHPUnit基本上就失效了,我们的测试将无从入手,那么该怎么办了?
锤子二: Uopz
PHPUnit无法解决问题,有两个工具可以解决 php-test-helper 和 Uopz ,其中 php-test-helper 实际已经不再维护了,Github主页上也指向了 Uopz ,这里我也就主要说说 Uopz 工具,这个工具可以做什么了, Uopz 的全称是 User Operations For Zend ,能够在运行时改变PHP的行为,下面是它提供的主要方法:
uopz_function //备份一个方法 uopz_compose //构建一个类 uopz_flags //改变类或者方法的Flag定义 uopz_function //创建一个function uopz_overload //覆盖一个VM的操作码(这个后来并没有使用,存在问题,实际使用时通过PHPUnit的基境来实现了这个方法的功能) uopz_redefine //创建或者重定义一个常量 uopz_restore //恢复方法到之前备份的状态
这个工具十分强大,基于它真的什么都能搞,就是麻烦点,比如刚才哪个PHPUnit不可测的代码,用上Uopz就不一样了:
PHPUnit不能Mock静态的方法,但Uopz可以,通过 uopz_function
方法,可以改变原始的 MyBar1
和 MyBar2
中 doSomething
方法的行为,达到我们刚才用PHPUnit构造测试替身的效果。甚至你还可以用 uopz_compose
重定义一个自己的 MyBar1
和 MyBar2
,有了这个方法几乎无所不能,但代价也就是麻烦点。
我用这个给公司的回路脚本写测试Case,200行的回路代码,写了1000多行的测试代码,因为要Mock太多的类,重定义很多方法,确实很麻烦,对于经常改动的代码,这样搞代价可能不可承受,但如果代码的变动不大,但每次改动的风险却很大,那么这个就值得了。关于Uopz的详细用法,大家可以找我交流,里面坑还是不少。
锤子三:Jenkins
对于自动化来讲,Jenkins应该是最常用的CI工具了,要做的也就是配置对仓库定期的变动检查,或者代码长裤自己挂Hook,通知Jenkins运行自测代码。这样每次代码变动时,Jenkins都会跑一遍Case,如果发现问题则可以邮件通知开发者。
总结
PHPUnit Uopz Jenkins是用的自动化测试三剑客,三者缺一不可,如果想更好的更高效的进行自动化测试,有两个建议:
- 代码可测性(这其实是最重要的了)
- 封装Uopz的方法
做到这些,PHP的自动化测试将简单而高效。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 锤子科技 480 万门票收入捐赠给 OpenSSL 与 OpenBSD
- 设计模式只是一把锤子,不要拿着到处去敲
- 基于ARKit的iOS无限屏实现,还原锤子发布会效果
- 老罗自掏腰包为开源社区捐款,并表示锤子将自己编写OS
- 锤子开源 Smartisan T1/T2、坚果 Pro 等手机内核源代码
- 罗永浩:Face ID 是弯路,锤子也在做智能音箱;国家药监局对长生生物的疫苗问题正式立案调查;阿里...
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
C++ 程序设计语言(特别版)(英文影印版)
[美] Bjarne Stroustrup / 高等教育出版社 / 2001-8-1 / 55.00
《C++程序设计语言》(特别版)(影印版)作者是C++的发明人,对C++语言有着全面、深入的理解,因此他强调应将语言作为设计与编程的工具,而不仅仅是语言本身,强调只有对语言功能有了深入了解之后才能真正掌握它。《C++程序设计语言》编写的目的就是帮助读者了解C++是如何支持编程技术的,使读者能从中获得新的理解,从而成为一名优秀的编程人员和设计人员。一起来看看 《C++ 程序设计语言(特别版)(英文影印版)》 这本书的介绍吧!