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

引言

程序员很难发现自己写的bug,这是一条难破的槛。所以要写测试,要让自己的程序给别人测试,
思路不同,实现方法不同,才能发现业务逻辑中的不合理和bug。

图片

laravel集成了PHPunit测试框架可方便书写测试用例。本文就来个抛砖引玉式的简介。

代码时间

laravel应用安装完毕之后,在 vendor/bin/ 目录内已经内置了 phpunit 文件,
在windows平台下,使用 phpunit.bat 文件。

打开命令行工具,进入到laravel工作根目录,运行命令:

./vendor/bin/phpunit

默认应用只写了两个测试用例,所以输出结果如下图:

image-20200922161802039

文件上传测试

我们先来模拟一个虚拟的文件,执行表单文件上传功能。这里构造文件对象,使用 Symfony UploadedFile 对象,
下面的代码中,我们假设存在 storage/tests 目录。该目录下放置一个 for-tests.jpg 图片文件。

下面是一个测试方法:

image-20200922161815268

我们首先构造了一个 UploadFile 对象,然后调用 post 方法访问 upload-route
并将上传参数正确地填写。最后验证上传是否成功。

很多时候测试路由要求必须有真是的文件存在,比如对于用户,我们要求其必须有一个头像文件。
laravel使用了Faker库用于伪数据的生成,我们通过一个工厂方法,实现为每个用户创建头像的需求。

image-20200922162752225

上述方法,从源目录内随机地获取一张图片,并拷贝到目标路径,并使用用户名进行区分。

然后构造测试用例,创建一个新的用户,访问用户的个人信息页面,并查看头像是否存在。

image-20200922162844239

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名全局不加密,
但是对于专门在测试时不使用加密的方法,有些矫枉过正。所以我们需要在测试用例中,
实时声明不加密,那么只需在测试方法中这样实现:

image-20200922172503129

在中间件内实时声明cookie名不加密,然后请求url并传入cookie,最后断言cookie的值。

如果出于一些考虑,在全局不加密的情况下,要测试单个加密的cookie值,
那么可以手动加密字符串并传入url中:

$encryptedBaz = app(Encrypter::class)->encrypt('baz');

Encrypter就是laravel框架用来加密cookie值的方法。

写在最后

本文通过对网页端的session,cookie,cache等组件值的测试,
演示了常用的构造测试用例的方法。在测试之前,需要大家对laravel的框架中,
处理此种缓存数据的方法有所深入了解。

Happy coding 😃

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值