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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351