在传统的PHP开发当中,我们通常是这样的:敲代码->调试运行->直到运行成功,然而在laravel中,强调了单元测试的概念,毫无疑问单元测试是十分必要而且高效的,在我接触laravel的这段时间里,目前为止都是编写一个模块->访问路由->测试纠错->运行成功,这样传统而笨拙的方法,让我在测试代码正确性的过程中白白浪费了不少时间,复杂的不说,就说用户登录,按照我的习惯,往往会在middleware中执行UserCheck来检查用户是否登陆,或者赋予一些session便于后续使用,所以有些时候我不得不真的打开浏览器登陆一个用户,再去测试我的功能模块,亦或者,模拟一个session,然而使用单元测试以后,这些问题就都很简单的解决了。
laravel的单元测试是开箱即用的,一切都为你准备好了,我正在使用laravel5.5,你可以在vender/bin下找到phpunit文件,然后执行phpunit --version就可以看到了。
tests/目录下已经有了示例的测试文件,Feature/ExampleTest.php中你可以明显的看到,示例的测试文件做了以下两个动作:1 get /,2 断言返回的HTTP状态码是200,毫无疑问这个断言肯定是成立的,那么如何运行呢?你只要运行phpunit命令,并且使用bootstrap参数,参数值就是这个示例的测试文件,比如:phpunit bootstrap ../../tests/Feature/ExampleTest.php
现在我开始尝试使用它,我的第一次尝试,是来测试我的一个jsonAPI,我将这个示例测试文件中的testBasicTest方法改成如下内容:
$response = $this->withoutMiddleware()->get('/api/v1/Offline/User/Index');
dump($response->content());
第一句,get了一个uri地址,这是我的接口地址,我在get之前使用了withoutMiddleware方法,表示不使用中间件,这样会帮助我绕过用户的认证,第二句,最开始我是dump整个$response变量的,虽然也能看到输出的json内容,但这是一个很复杂的对象,会有很多我不关心的东西一同被输出,并且通过输出我看到其实$response变量其实是一个Illuminate\Http\JsonResponse实例,所以我在laravel的官方文档中找到了这个类https://laravel.com/api/5.4/Illuminate/Http/JsonResponse.html,看到其中的content方法可以得到字符串内容。当我在执行phpunit bootstrap ../../tests/Feature/ExampleTest.php之后,果不其然输出了预期的内容。
当然,这只是一个尝试,单元测试无疑会大大提升开发效率,我今天也是从无到有,从零开始的学习单元测试,但是我已经感受到它的无限魔力了!今天开发任务比较重,剩下的有空再写!