引言
程序员很难发现自己写的bug,这是一条难破的槛。所以要写测试,要让自己的程序给别人测试,
思路不同,实现方法不同,才能发现业务逻辑中的不合理和bug。
laravel集成了PHPunit测试框架可方便书写测试用例。本文就来个抛砖引玉式的简介。
代码时间
laravel应用安装完毕之后,在 vendor/bin/ 目录内已经内置了 phpunit 文件,
在windows平台下,使用 phpunit.bat 文件。
打开命令行工具,进入到laravel工作根目录,运行命令:
./vendor/bin/phpunit
默认应用只写了两个测试用例,所以输出结果如下图:
文件上传测试
我们先来模拟一个虚拟的文件,执行表单文件上传功能。这里构造文件对象,使用 Symfony UploadedFile 对象,
下面的代码中,我们假设存在 storage/tests 目录。该目录下放置一个 for-tests.jpg 图片文件。
下面是一个测试方法:
我们首先构造了一个 UploadFile 对象,然后调用 post 方法访问 upload-route,
并将上传参数正确地填写。最后验证上传是否成功。
很多时候测试路由要求必须有真是的文件存在,比如对于用户,我们要求其必须有一个头像文件。
laravel使用了Faker库用于伪数据的生成,我们通过一个工厂方法,实现为每个用户创建头像的需求。
上述方法,从源目录内随机地获取一张图片,并拷贝到目标路径,并使用用户名进行区分。
然后构造测试用例,创建一个新的用户,访问用户的个人信息页面,并查看头像是否存在。
session测试
web网页为了保持会话上下文信息,使用session缓存数据。我们在之前的文章内有过详细的说明。
那么现在我们看一看,如何对session进行测试。
比如某个页面,断言某个键值是否匹配:
$this->assertSessionHas('key', 'value');
或者同时根据不同的规则,测试不同的数据:
$check = [
'has',
'hasWithThisValue' => 'thisValue',
];
$this->assertSessionHasAll($check);
laravel在表单验证中使用 throw exception 的方式返回,并为页面写入 errors 数组,
记录验证错误信息。我们测试某个页面是否有错误信息:
$this->post('test-route', ['failing' => 'data']);
$this->assertSessionHasErrors(['name', 'email']);
Cache缓存测试
测试缓存,与session类似,不过更加精简。因为cache是全局的数据,
比如测试某个键值对的正确性:
Cache::put('key', 'value', 15);
$this->assertEquals('value', Cache::get('key'));
大致如此,不过多赘述。
Cookie测试
用户端缓存一些数据,可以有效降低网络请求量。但是在laravel中,为了安全性,cookie数据都是经过加密处理的,
我们如果直接在测试用例中使用,是办不到的。所以需要首先排除在测试中的cookie加密。
我们看一下注册的默认中间件的内容:
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
],
],
然后查看 EncryptCookies 文件,该类内提供了方法:
protected $except = [];
此处填写cookie名,指定不用加密的那些键名。这种方法添加的cookie名全局不加密,
但是对于专门在测试时不使用加密的方法,有些矫枉过正。所以我们需要在测试用例中,
实时声明不加密,那么只需在测试方法中这样实现:
在中间件内实时声明cookie名不加密,然后请求url并传入cookie,最后断言cookie的值。
如果出于一些考虑,在全局不加密的情况下,要测试单个加密的cookie值,
那么可以手动加密字符串并传入url中:
$encryptedBaz = app(Encrypter::class)->encrypt('baz');
Encrypter就是laravel框架用来加密cookie值的方法。
写在最后
本文通过对网页端的session,cookie,cache等组件值的测试,
演示了常用的构造测试用例的方法。在测试之前,需要大家对laravel的框架中,
处理此种缓存数据的方法有所深入了解。
Happy coding :-)
我是@程序员小助手,持续分享编程知识,欢迎关注。