|3分钟短文:刀刃向内,Laravel缓存测试简单入门

|3分钟短文:刀刃向内,Laravel缓存测试简单入门

文章图片

|3分钟短文:刀刃向内,Laravel缓存测试简单入门

文章图片

|3分钟短文:刀刃向内,Laravel缓存测试简单入门

文章图片


引言程序员很难发现自己写的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库用于伪数据的生成 , 我们通过一个工厂方法 , 实现为每个用户创建头像的需求 。


【|3分钟短文:刀刃向内,Laravel缓存测试简单入门】上述方法 , 从源目录内随机地获取一张图片 , 并拷贝到目标路径 , 并使用用户名进行区分 。
然后构造测试用例 , 创建一个新的用户 , 访问用户的个人信息页面 , 并查看头像是否存在 。


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 :-)

我是@程序员小助手 , 持续分享编程知识 , 欢迎关注 。


    推荐阅读