学习IOS开发时曾经写过一篇关于Objective-C单元测试的文章,IOS开发学习单元测试,今天总结一下PHP中如何使用单元测试。1.前言在本文中,我们使用composer的依赖包管理工具来安装和管理phpunit包。Composer官方地址https://getcomposer.org/,按照提示进行全局安装即可。另外,为了方便我们,我们还会使用一个非常好用的Monologlogging组件来记录日志。在根目录下创建一个coomposer.json配置文件,输入如下内容:{"autoload":{"classmap":["./"]}}上面的意思是加载根目录下的所有class文件,在命令行执行composerinstall后,根目录下会生成vendor文件夹,我们通过composer安装的第三方代码都会在这里生成。第二,为什么要进行单元测试?每当您想到在打印语句或调试表达式中键入某些内容时,请将其替换为测试。--MartinFowlerPHPUnit是一个使用PHP编程语言和单元测试框架开发的开源软件。PHPUnit由SebastianBergmann创建,起源于KentBeck的SUnit,是xUnit家族的框架之一。单元测试是测试单个代码对象的过程,例如测试函数、类和方法。单元测试可以使用任何已经编写好的测试代码,也可以使用一些现有的测试框架,如JUnit、PHPUnit或Cantata++。单元测试框架提供了一系列常用且有用的功能来帮助人们编写自动化检测单元,例如检查实际值是否符合我们预期的断言。单元测试框架通常会包含每个测试的报告,以及您所覆盖的代码覆盖率。总之,使用phpunit进行自动化测试,会让你的代码更加健壮,减少后期维护的成本。也是比较标准的规格。现在流行的PHP框架都有单元测试,比如Laraval、Symfony、Yii2等,单元测试已经成为标配。此外,单元测试用例通过命令来操作测试脚本,而不是通过浏览器访问URL。3.安装PHPUnit使用composer安装PHPUnit。其他安装方法请看这里composerrequire--devphpunit/phpunit^6.2安装phpunit测试日志的Monolog日志包。安装好composerrequiremonolog/monolog后,我们可以看到coomposer.json文件中已经有了这两个扩展包:"require":{"monolog/monolog":"^1.23",},"require-dev":{"phpunit/phpunit":"^6.2"},四、PHPUnit的简单使用1.单文件测试创建目录tests,新建文件StackTest.php,编辑如下:assertEquals(0,count($stack));array_push($stack,'foo');//添加日志文件,如果没有安装monolog,monolog相关的代码可以注释掉$this->Log()->error('hello',$stack);$this->assertEquals('foo',$stack[count($stack)-1]);$this->assertEquals(1,count($stack));$this->assertEquals('foo',array_p操作($堆栈));$this->assertEquals(0,count($stack));}publicfunctionLog(){//创建一个日志通道$log=newLogger('Tester');$log->pushHandler(newStreamHandler(ROOT_PATH.'storage/logs/app.log',Logger::WARNING));$log->error("错误");返回$日志;}}代码解释:StackTest继承自测试类StackTest,为PHPUnit\Framework\TestCase的测试方法testPushAndPop(),测试方法必须有public权限,一般以test开头,也可以选择添加注释@test测试方法,类似于assertEquals()方法,用于断言实际值与期望值匹配命令行执行:phpunit命令测试文件命名?framework#./vendor/bin/phpunittests/StackTest.php//或者文件扩展名可以省略//./vendor/bin/phpunittests/StackTest执行结果:?framework#./vendor/bin/phpunittests/StackTest.phpUnit6.4.1bySebastianBergmannandcontributors..1/1(100%)Time:56ms,Memory:4.00MBOK(1test,5assertions)我们可以在app.log文件中查看我们打印的日志信息。2.类文件importCalculator.php单元测试类:CalculatorTest.phpassertEquals(0,$obj->sum(0,0));}}命令执行:>./vendor/bin/phpunittests/CalculatorTest执行结果:PHPUnit6.4.1bySebastianBergmannandcontributors.F1/1(100%)Time:117ms,Memory:4.00MBTherewas1failure:如果我们在这里故意写错断言,$this->assertEquals(1,$obj->sum(0,0));查看执行结果:SebastianBergmann和贡献者的PHPUnit6.4.1。F1/1(100%)时间:117毫秒,内存:4.00MB有1次失败:1)App\tests\CalculatorTest::testSumFailedassertingthat0matchesexpected1./Applications/XAMPP/xamppfiles/htdocs/web/framework/tests/CalculatorTest.php:22FAILURES!Tests:1,Assertions:1,Failures:1.方法错误将直接报告信息和行号帮助我们快速查找bugs3、进阶用法你是否厌倦了在每个测试方法名前加一个测试,是否因为调用的参数不同而苦苦编写多个测试用例?我最喜欢的高级函数,现在推荐给你,叫做框架生成器Calculator.php命令行启动测试用例,使用关键字--skeleton>./vendor/bin/phpunit--skeletonCalculator.php执行结果:PHPUnit6.4.1bySebastianBergmannandcontributors.WrotetestclassskeletonforCalculator到CalculatorTest.php。是不是很简单,因为没有测试数据,所以在这里添加测试数据,然后重新执行上面的命令在原始类中检查@assert注释的每个方法。这些变成了这样的测试代码/***Generatedfrom@assert(0,0)==0.*/publicfunctiontestSum(){$obj=newCalculator;$this->assertEquals(0,$obj->sum(0,0));}执行结果:./vendor/bin/phpunittests/CalculatorTestPHPUnit6.4.1,由SebastianBergmann和贡献者提供。....时间:0秒OK(4次测试)4.其他用法其他用法请参考官网:PHPUnit中国官网参考文章:PHPUnit中国官网文档
