场景介绍
对于构建在微信公众号的系统,帐号体系往往使用微信授权登录(如各类微信商城应用系统)。
这样操作不仅可以实现静默注册,对用户几乎是无感的,同时也达到了区分用户,获取用户基本信息(头像,昵称等)。
使用微信授权的模式可以说一次性替代用户注册及用户登录。
因为这种帐号体系是以微信帐号为主体的,平时我们如果要对该类系统进行测试,就必须使用到真实的微信帐号完成登录或注册。
如果想要对登录或注册曾经进行性能方面的测试那会比较棘手(因为我们可能没有足够的微信号)
以下图为例我们先分析这个注册/登录流程
如图上面的1,2,3步都是在微信APP里完成的(与我们作为测试对象的应用服务器未产生联系)
直到第4步骤微信浏览器才向我们的应用服务器发送了请求(该请求负责将前面步骤得到的code传递到我们自己的业务服务,该请求才是我们自己业务服务器开始验证登录的开始)
一般我们的服务器得到code后,会在向微信服务请求用户信息,拿到用户信息后处理自己的业务逻辑(注册或是登录)
所以能看出来,登录或测试的关键就是第4步这个接口。
我们在进行性能测试时,设计的登录或注册逻辑(事务)主要就在于第4步请求测试数据的准备。
因为我们应用服务从第4步拿到code后会用此code向微信查询用户信息,即这个code是微信即时生成的,我们是不可能提前拿到一批能用的code用来测试的。
现在如果为了测试可以选择修改服务逻辑让其接收虚拟code,对虚拟code进行特殊处理完成虚拟的注册。但是这样为了测试来改变远工程的逻辑是十分不可取的,测试的对象应尽量与实际用户使用到的维持一致,而且这里的场景就是为了测试注册或登录的性能,为了测试而故意改了一份针对测试的注册或登录的逻辑显然不合适。
我们进一步分析业务服务的逻辑,业务服务器会拿获得的code向微信换取用户信息
如上图业务服务器使用code向微信服务器换来了openid 及 access_token等关键信息 (第一幅图是微信接口说明,第二副图是应用服务器向微信请求的一个实例)
这时其实拿到openid即可以确定用户是新用户还是老用户,如果新用户可以进行新建用户的操作,如果是老用户则可以进行用户登录的逻辑。
当然现实中应用服务可能还会使用access_token去向微信拉取用户头像,昵称等信息(https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN),这取决于大家产品自己的业务。
如上所述不难发现,如果使用错误的code,微信服务一定会返回错误,导致注册或登录业务中断。现在我们要克服的就是,如何让错误的code也能有正常的返回。接口是微信的,微信显然不会做这种事情。那我们在不更改业务服务的任何逻辑的同时能不能在我们应用服务器的网络层面上mock微信的这个接口,让不被微信承认的code也能返回正常的数据。
下面以一个实际微信登录场景为例说明如何使用FreeHttp完成微信认证
1:配置代理(Fiddler)
为了完成需求,我们首先要为业务服务器配置HTTP代理到我们的Fiddler上。
一般我们的服务器都是Linux,这里我们以CentOS,应用容器Tomcat 为例说明代理配置过程
配置机器全局代理很容易
修改 /etc/profile 文件
添加上面的信息即可
不过JVM可能不会使用系统HTTP代理,所以我们需要单独配置Tomcat的代理
通过设置jvm的proxyhost来实现设置tomcat中引用程序的代理
在tomcat的配置文件catalina.bat/sh中设置-Dhttp.proxySet=true -Dhttp.proxyHost=proxyserver -Dhttp.proxyPort=8888
配置示例如上图在以上位置加上指定参数即可(不同应用容器或服务框架都有自己的代理设置方式,大家可以在网络上搜索到)
添加配置信息后重启tomcat即可(记得服务器与代理服务所在网络上必须是能连通的)
还有一步添加fiddler证书到服务器(为了能解析HTTPS请求)
如上图在我们自己的电脑中导出证书
在服务器上进行如下操作
yum install ca-certificates
- 启用 dynamic CA configuration
update-ca-trust enable
cp FiddlerRoot.cer /etc/pki/ca-trust/source/anchors/
update-ca-trust extract
以上步骤完成后可以测试一下Fiddler是否能获取服务器发送的请求
触发服务器向外发送请求,我们在Fiddler上应该能捕获相应请求(上图就是一个我们应用服务器发送给微信的https请求)
2:配置FreeHttp
按照我们前面的分析,实际应用服务器是需要向微信发送code(https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code)
应用服务器需要根据返回数据再进处理一步业务逻辑
那我们现在直接篡改这条请求返回值,让他对不合法code的请求也返回正常的返回数据
先添加一个参数化数据(用于使每次返回数据都不一样)
如上图,我们添加一个逐步递增的openid参数数据(按图标注1,2,3步骤添加即可,注意红框部分选择参数类型及参数的格式)
这个参数表示以0001开始每次取值逐步递增(在类表处选取该参数,可以重置或设置该参数的值)
再添加一个用于产生合规响应的Response Replace规则
如上图添加一个Response Replace规则
因为是替换响应不需要将真实发送到微信的服务器这里勾选Response Direct(同时为了模拟真实场景加上50ms的延时,反复测试微信的这条接口响应时间都控制在50ms到100ms)
在图最大编辑框中设置相应数据(正确响应数据应该是什么格式,抓取一个正常的请求就可以得到),同时我们为返回json里openid添加一个参数数化数据(实际就是TestOpenId加上一个递增的ID,这个递增ID就是前面设置的参数化数据,这里为了方便演示,仅对openid进行说明,实际其他几个返回项也是有意义的)
红线处*#test_openid(+)*#即表示前面添加的用户参数(因为使用到用户参数,需要鼠标右键在弹出框中把use Parameter Data 勾上)
设置完成后,点击右下角绿色确认按钮添加规则
完成以上设置后,后注意在右侧Response Rule列表处,设置启用Response Rule,及勾选需要执行的规则(上图红框区域)
3:测试规则
前面最开始我们也分析过https://业务域名及路径?code=061v6AGK1pOTj40nF0EK1LNwGK1v6AGV&state=辅助参数 (文中第一张图的第4步,这个地址也是在前面第2步的回调地址中设置的)
我们使用Fiddler的Composer构造这个请求(当然您可以通过其他测试工具甚至是浏览器构建请求进行调试)
如上图我们主要关注的code(我们这里自己构造code,实际这个code不是一个真实的code)
点击Execute发送测试请求
如上图,可以看到服务器发给微信的请求已经被我们替换掉了,而且返回我们设置的“合法数据”。(我们我应用服务器这个时候会认为是openid为TestOpenId0001的用户来登录或注册了,然后会进入相应的业务)
通过数据库验证用户是否成功创建成功(当然正常情况下按不同业务需求,注册一个用户还有许多数据需要验证)
4:开始登录测试
对登录业务进行压力测试,同样可以使用很多工具,我这里使用常用的JMeter进行演示
我们使用先使用JMeter依次发送https://业务域名及路径?code=TestOpenId0001&state= (使code逐步递增,这里递增是为了防止应用服务有缓存策略)
注意JMeter默认不使用系统代理,所以需要如上图手动配置代理
这里使用100个用户同时登录(持续时间30秒,当然实际测试中有更加复杂的业务,持续时间跟用户数也会更多)
通过对数据库的检查,我们基本上可以确认30秒里这10个用户创建了311个账户(而实际上我们并没有使用311个微信号)
简单的测试我们应用服已经表现出性能瓶颈(平均响应达到了8秒)
同时添加服务器监控,可以查看测试中服务器的压力情况(上图表面测试中应用线程数量明显增多,JVM的GC也加快了,可以反复尝试增加压力观察是否存在瓶颈)
最后我们就可以根据自己的业务,添加更多的业务场景进行有针对性的测试。
上面只是一个例子,演示如何通过截获服务器与微信认证服务器的请求,以达到测试自己业务微信认证登录的过程。
大家可以利用这个思路,结合自己的需求,进行有针对性的测试。
- Vue-router实现单页面应用在没有登录情况下,自动跳转到登录页面
这是我做前端一来的第一篇文章,都不知道该怎么开始了.那就直接奔主题吧.先讲讲这个功能的实现场景吧,我们小组使用vue全家桶实现了一个单页面应用,最初就考虑对登录状态做限制.比如登录后不能后退到登录页面 ...
- linux在telnet情况下root登录提示login incorrect
root登录时总是提示 login incorrect SSH可以登录 别的用户也可以通过telnet登录 唯独root不可以 解决方法: vi /etc/pam.d/login # auth r ...
- NodeJs 开发微信公众号(五)真实环境部署
在测试环境下开发完成代表着你离正式上线的目标不远了.接下来本章就主要谈一谈把测试环境的公众号升级为正式的公众号. 服务器和域名 目前为止我们只是在自己的电脑上完成了测试环境.真实的线上环境当然需要自己 ...
- 趣味测试类微信小程序
先说说项目需求吧, l 点击[再测一次],重新开始测试流程,主持人回复第一个题目,流程同上:答完全部题目后,底部不显示[立即开始分析]按钮,而是直接展示结果,且上一次测试内容不清空:如退出再进来,则 ...
- Java微信公众平台开发【番外篇】(七)--公众平台测试帐号的申请
转自:http://www.cuiyongzhi.com/post/45.html 前面几篇一直都在写一些比较基础接口的使用,在这个过程中一直使用的都是我个人微博认证的一个个人账号,原本准备这篇是写[ ...
- 微信公众号红包接口开发PHP开发 CA证书出错,请登陆微信支付商户平台下载证书
微信红包接口调试过程中一直提示“CA证书出错,请登陆微信支付商户平台下载证书”,经反复调试,大致解决方法如下: 1.首先确保CA证书的路径是否正确,一定得是绝对路径,因为是PHP开发的,这里需要三个p ...
- 类似UC天气下拉和微信下拉眼睛头部弹入淡出UI交互效果(开源项目)。
Android-PullLayout是github上的一个第三方开源项目,该项目主页是:https://github.com/BlueMor/Android-PullLayout 原作者项目意图实现 ...
- 仿UC天气下拉和微信下拉眼睛头部淡入淡出--第三方开源--PullLayout
Android-PullLayout是github上的一个第三方开源项目,该项目主页是:https://github.com/BlueMor/Android-PullLayout 原作者项目意图实现类 ...
- mock.js的真实数据模拟
哈哈,怎么说,这应该是我的第一个随笔了,毕竟前端之路上一直在学习并且各位大神们的经验,虽然也有不少的坑,但是总是收获比较多,所以我也想把一些收获记录下来,有需要的可以参考参考. 网上看了不少大神很多例 ...
随机推荐
- Python算法与数据结构--求所有子数组的和的最大值
Python算法与数据结构--求所有子数组的和的最大值 玄魂工作室-玄魂 玄魂工作室秘书 玄魂工作室 昨天 题目:输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个 ...
- Javascript高级编程学习笔记(99)—— WebGL(5) 绘图
绘图 WebGL只能绘制三种形状: 点 线 三角 其它的形状都是由上面的三种形状合成之后绘制到三维空间中的 执行绘图操作 WebGL 提供了两种方法: gl.drawElements() gl.dra ...
- C语言中的神兽strdup
C语言的确博大精深,在C语言的世界中遨游了那么多年,发现自己仍是菜鸟一枚,很多利器没有能够驾驭,今天介绍一个神兽,威力无比,但是却很少人能用得好. 函数原型: #include <string. ...
- 基于Cisco packet tracer的AAA认证
---恢复内容开始--- 1.Topology Diagram拓扑图 2.配置ip地址 3.路由互通 pc1--pc2 pc1--pc3 pc2--pc3 4.指令文件 R1: R1(config)# ...
- 微信小程序初体验,入门练手项目--通讯录,后台是阿里云服务器(一)
内容: 一.前言 二.相关概念 三.开始工作 四.启动项目起来 五.项目结构 六.设计理念 七.路由 八.部署线上后端服务 同步交流学习社区: https://www.mwcxs.top/page/4 ...
- .NET Core微服务之服务间的调用方式(REST and RPC)
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.REST or RPC ? 1.1 REST & RPC 微服务之间的接口调用通常包含两个部分,序列化和通信协议.常见的序列化 ...
- springboot~zuul实现网关
网关在微服务里的角色 在微服务架构体系里,网关是非常重要的一个环节,它主要实现了一些功能的统一处理,包括了: 统一授权 统一异常处理 路由导向 跨域处理 限流 实践一下 1 添加依赖 dependen ...
- vs2015安装编辑神器:resharper10.0
在平时的开发工作中,作为一名程序员,难免会想办法找到适合自己的开发编辑器.这款插件来自JetBrains公司.接下来就来教大家如何对这款软件进行安装与破解. 1:首先下载与安装.如果没有找到适合的资源 ...
- C# 插入文本框到PPT幻灯片
概述 在文本框中我们可以实现的操作有很多,如插入文字.图片.设置字体大小.颜色.文本框背景填充.边框设置等.下面的示例中,将介绍通过C# 在PPT幻灯片中插入幻灯片的方法. 示例中包含了以下要点: 插 ...
- Spring-注解实现IOC
一.定义 注解:是一种标记式的配置方式,与XML配置文件不同,注解提供了更大的便捷性,易于维护修改,但是耦合度高. 本质:是一个继承了 Annotation 接口的接口,注解本身并没有什么作用,通过特 ...