今天给各位分享心理测试网站源码分享php的知识,其中也会对心理测试专业网站进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
5.3PHPUnit高级测试
PHPUnit是XUnit家族中的一员,它的作者是SebastanBergmann,他自己的使命是:Drivenbyhispassiontohelpdevelopersbuildbettersoftware(译为:帮助开发人员构建更优质的软件)。
简单认识完PHPUnit的作者后,我们就要开始深入学习PHPUnit和相关的测试技巧了。概括来说,PHPUnit单元测试的执行流程,主要有以下几个环节:
TestCase::setUpBeforeClass()TestCase::setUp()TestCase::testXXX()TestCase::tearDown()TestCase::tearDownAfterClass()
PHPUnit官方文档有详细的说明,这里不再重复赘述。这里要讲的是,下面四个小节的内容,都是基于这条主线而展开的内容。首先,我们会介绍如何自动生成测试代码骨架,而不需要人工编写重复的代码。有了测试代码骨架后,再根据构造-操作-检验模式就可以编写具体的测试用例了。接下来就是怎么执行单元测试的问题了。把这些环节全部串联起来,就可以完成测试驱动开发中“红-绿-重构”这条主线的实践了。
但在PHPUnit高级测试中,还有两个非常重要的模块,分别是针对输入和输出的。前者说的是造假的技巧,即使用桩、替身、仿件等技术模拟需要的测试数据。后者说的是断言的艺术,包括对异常的断言、对API接口结果的验证和对模板渲染输出的验证等。
5.3.1自动生成测试代码骨架
不管以何种方式,若能自动生成测试代码骨架,都能帮助我们开发人员节省很多重复代码编写的时间,更重要的是能极大提升我们编程时的心理体验。
在讨论不同的自动生成方式前,先让时光稍微倒流一下,假设我们的计数器类Calculator还没有实现,只是设计好了函数签名,并且单独在一个类文件Calculator.php中。最初时,代码是这样:
<?php\nclassCalculator{\npublicfunctionadd($left,$right){\n//TODO\n}\n}
为了给Calculator类,包括后面项目中成千上百个类生成对应的单元测试代码骨架,现在花一点时间来学习代码自动生成的技术,是很有必要的。
使用官方的phpunit-skelgen生成
根据官方文档的说明,可以使用以下命令在Linux系统上快速安装phpunit-skelgen,注意第三行命令需要使用root权限。
$wgethttps://phar.phpunit.de/phpunit-skelgen.phar\n$chmod+xphpunit-skelgen.phar\n39;Thistesthasnotbeenimplementedyet.&39;&39;&39;saturn&39;UserModel&39;UserModel&39;getMcUser&39;tokenId&39;5BA25B3FD90C71AB99B532929F1CF4E1E7F39A50&39;tokenSecret&39;6e215b1e7d0e73f9dc5ba6d4320ee8eb&39;userId&39;1&39;userName&39;phpunit&39;UserModel&39;UserModel&39;KernalHelper&34;ThiswillcallKernalHelper::$func(&39;,&34;)…\\n&39;Controller&39;&39;期望跳转的链接&39;type&39;data&39;mixedData&39;id&39;id&39;type&39;data&39;mixedData&39;id&39;id&39;type&39;html&39;mixedData&39;haha~&39;mixedData&39;id&39;mixedData&39;id&39;code&39;data&39;brand_id&39;is_fixed&39;sequence&39;brand_id&39;is_fixed&39;sequence'=>3),\n//……\n),\n);\n}\n}
技巧9:对protected方法进行模拟替换
在一个复杂的业务处理场景中,我们通常会把不同的子操作提取为protected成员函数。但过多的路径又难以覆盖到各个成员函数的调用。或者说,我们既想能模拟到这些protected方法的操作,又能真实对其进行调用。该怎么办?这时,可通过继承子类添加成员属性的开关方式来进行控制。
为了简单,容易理解,假设我们有这样的收礼场景:
<?php\nclassGift{\npublicfunctionpickup($uuid,$orderSn){\nif($this->hasBeenPickuped($orderSn)){\nreturn;\n}\n//……\n}\nprotectedfunctionhasBeenPickuped($orderSn){\n//……\n}\n}
为了造一个礼物已领取的假象,我们可以先这样添加一个模拟子类:
<?php\nclassGift_MockextendsGift{\npublic$isPickUp=null;\npublicfunctionhasBeenPickuped($orderSn){\nreturn$this->isPickUp===null?parent::hasBeenPickuped($orderSn):$this->isPickUp;\n}\n}
请注意到两点,一点是我们在模拟子类中添加了成员属性$isPickUp,另一点我们将hasBeenPickuped()方法的访问级别提升到了public。
接着,但可这样同时进行模拟或真实的测试:
<?php\n$mock=newGift_Mock();\n$mock->pickup($uuid,$orderSn);//真实调用\n\n$mock->isPickUp=true;\n$mock->pickup($uuid,$orderSn);//模拟已领取\n\n$mock->isPickUp=false;\n$mock->pickup($uuid,$orderSn);//模拟非领取
综合以上九个造假技巧,可以发现一个原则:测试代码与产品代码分离,且测试时不能改动任何产品代码。此外,产品代码应尽量提供一个服务入口,即缝纫点,以便使用桩、替身或仿件。
5.3.4断言的艺术
PHPUnit官方本身提供了40多个断言,例如常见的有:assertEquals()、assertArrayHasKey()、assertCount()、assertContains()等。此外,还有对输出、异常、正则等的断言。
另外,在对实际项目进行单元测试时,还要注意两方面的断言。一类是对Controller类渲染输出的页面内容的断言,另一类是针对接口服务返回的数据结果进行断言。如果需要渲染页面,可能使用的是原生PHP的模板方式,也有可能使用的是诸如Smarty、Twig这样的模板引擎。不管是何种渲染方式或视图模板格式,在对输出页面内容进行断言时,建议不要直接对输出内容断言,也不要直接对页面内容断言,而是改为对提供给视图模板的数据进行断言。
这样做有好处的。一方面,通常前、后端开发是分离的,在协作开发过程中,很有可能后端代码已经实现,如果依赖前端提供的模板文件才能测试,完成断言的话,工作进度就会受到阻塞,达不到高效流转的效果。另一方面,如果数据与视图融合在一起,想要还原或提炼数据就非常困难。虽然可以使用正则或者对输出的内容进行断言,但那样往往都是取巧的做法,会丢失数据类型和精度,不够严谨,同时成本也很大。何必那么复杂呢?直接对提供给视图的数据进行断言即可,如果数据都是正确的,那么接下来只需要关注页面展示是否正确就可以了。
同样地,针对接口服务返回的结果,如果想进行自我验证,在测试时,不是真的要输出最终的返回结果。而是针对最终将要返回的数据结果本身进行断言即可,因为返回的方式和格式也有可能是多种多样的,比如HTTP+JSON格式,SOAP+对象格式,JSONP格式等。
这里所说的断言艺术,很简单,那就是对最原始的数据进行断言,而非对二次处理输出的结果进行断言。
关于心理测试网站源码分享php的内容到此结束,希望对大家有所帮助。
