大家好,我是谭叔。
今天,谭叔跟大家分享我在测试电脑软件(程序)时,模拟超时环境的N种尝试,以及电脑软件(程序)的MOCK测试方案。
超时环境
在日常测试工作中,弱网环境、超时请求等异常测试,是必不可少的,也是保证系统稳定性的重要环节。
比如有一些测试需求是这样的:
1、在一些特殊的测试场景中,需要模拟请求某服务超时,以查看软件是否能正常工作
2、有些场景,需要服务器返回某特定值,而这个特定值在异常情况下才会有(类似需要mock环境)
这里,谭叔推荐几种测试方法。
方法一:修改hosts
将本机hosts修改为一个无效的ip地址,以模拟超时。
优点:操作简单
缺点:仅能验证无法请求某服务的场景,无法验证某服务不可用的场景
方法二:停服
顾名思义,将测试环境的后端服务停掉。
优点:可以模拟真实的超时场景
缺点:会造成服务不可用,影响其他测试 or 开发的工作
方法三:路由器限速
顾名思义,搞一台wifi路由器,在路由器后台设置网速。
优点:限制wifi速度,操作简单
缺点:
1、无网卡的台式机无法使用
2、路由器限速最低0.01Mbps/s,即1.25kb/s,无法达到Byte级别,当请求体很小时,仍旧无法模拟超时
方法三:使用NetLimiter4
NetLimiter4是一款简单实用、方便易用的网络流量监控软件,可以限制程序的上下行网速。
NetLimiter4安装包(破解版):http://www.testtalking.com/#/data/data 【测试工具-NetLimiter4】
优点:
1、多版本可用(winXP、win7、win10),操作简单、使用方便
2、可以限制电脑软件的上传和下载速度,且能达到Byte/s级别
缺点:
网速限制全局有效,当该软件有其他ip地址+端口的请求时,会将该请求同时限制。无法模拟单个接口的超时场景。
方法五(推荐):Proxifier + Fiddler
Proxifer是一个socks5客户端,可以让不支持通过代理服务器工作的程序通过HTTPS或SOCKS代理。
Proxifier安装包:http://www.testtalking.com/#/data/data 【测试工具-Proxifier】
Fiddler是一款代理抓包软件(测试人应该都知道)。
01 实现原理
一般的PC客户端不能设置代理,因此只用Fiddler检测不到数据,需要配合Proxifier使用。Proxifier负责把所有的请求发给Fiddler,再在Fiddler上分析客户端请求,并利用Fiddler一些强大的功能,如打断点,篡改请求或者响应内容等来模拟我们需要的测试场景。
02 配置代理
如图,配置Proxifier的代理服务器和代理规则
使用方法
同Fiddler使用方法类似。
不会用Fiddler?请移步:http://testtalking.com/#/project/fiddler
①打断点进行调试,模拟超时
请求前断点(before response): bpu testgw.xxxx.com
响应后断点(after requests): bpafter testgw.xxxx.com
比如:命令行输入bpu testgw.xxxx.com
即,程序请求testgw.xxxx.com时,请求不会发到服务端,截留在Fiddler里,任君操作。
比如:命令行输入bpuafter testgw.xxxx.com
即,请求可以达到服务端,拿到响应,但可通过Fiddler篡改响应,将错误的超时响应返回给程序,以观察程序对该异常的处理情况。
{"code":"GW40000","msg":"服务超时,请稍后再试~(GW40000)","sourceMsg":"服务超时,请稍后再试~","data":null,"success":false,"breaker":false}
②模拟弱网
如果要限制网速来模拟弱网,可以不打断点,通过修改fiddler配置的方式实现。
搜索m_SimulateModem
if (m_SimulateModem) {
// Delay sends by 300ms per KB uploaded.
oSession["request-trickle-delay"] = "500";
// Delay receives by 150ms per KB downloaded.
oSession["response-trickle-delay"] = "500";
}
if (m_DisableCaching) {
oSession.oRequest.headers.Remove("If-None-Match");
oSession.oRequest.headers.Remove("If-Modified-Since");
oSession.oRequest["Pragma"] = "no-cache";
}
根据需求自行修改:上传1KB需要300ms,转化一下:1Kb/0.3s = 10/3=3.3(KB/s)
修改后,点击保存,并勾选生效
注意事项
01 proxifier默认占用8888端口,如果proxifier不可用,无法连接127.0.0.1:8888,需检查端口是否被占用。比如jupyter notebook服务会占用8888端口
02 使用NetLimiter4限速后,关闭NetLimiter4前,记得去勾选,否则会影响程序正常使用
MOCK方案
步骤五推荐的Fiddler+Proxifier给电脑软件打前后断点,可以模拟一些异常场景。
但是,如果接口的超时时间较短,使用此方法便捉襟见肘了,可能你还来不及篡改响应,流程就已走完,无法构造异常响应。
因此,我们需要引入MOCK测试。
什么是MOCK测试?
在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。比如
进行接口测试时:
- 无法控制第三方系统某接口的返回,返回的数据不满足要求
- 某依赖系统还未开发完成,就需要对被测系统进行测试
- 有些系统不支持重复请求,或有访问访问频次限制
等场景,我们可以使用MOCK测试方法。
也许,你听说过MOCK测试,并且做过接口的MOCK测试。
但是,电脑软件如何做?怎么做?
谭叔今天便分享一份电脑软件的MOCK方案,解决此类问题。
简单说来,我们需要:mock工具+代理工具。
环境搭建
一、mock环境
安装
Mockoon是在本地运行mock api最简单、最快的方法。无需远程部署,无需帐户,开源。
安装包:http://www.testtalking.com/#/data/data 【测试工具-Mockoon】
设置
设置端口+资源路径+response响应
例如:设置请求127.0.0.1:3355/hytrade/info的响应内容为一条异常json:
{"code":"TR10000","msg":"系统异常[com.xxxx.getTraceId()Ljava/lang/String;](TR10000)","sourceMsg":"系统异常[com.xxxx.getTraceId()Ljava/lang/String;](TR10000)","data":null,"success":false}
设置Headers
启动
验证
用postman调一下,可以拿到结果,证明服务启动成功
二、代理环境
安装
LightProxy 是 阿里巴巴 IFE 团队开发的一款基于 Electron 和 whistle 支持 Windows、Mac 的开源桌面代理软件 。LightProxy 可以自动完成证书安装和代理设置,让开发人员能够精确的掌握自己的开发环境,通过 HTTP代理使用规则转发、修改每一个请求和响应的内容。
安装包:http://www.testtalking.com/#/data/data 【测试工具-LightProxy】
设置
将本机访问的http://testgw.xxxx.com/hytrade/info代理到前面设置的mock服务http://127.0.0.1:3355/hytrade/info
http://testgw.xxxx.com/hytrade/info http://127.0.0.1:3355/hytrade/info
实操
打开你待测试的电脑软件,针对配置接口的实际业务,发起操作。
可以看到,软件拿到了异常的响应,并给出了提示。
查看程序日志,确实是拿到了mock的json串。
2021-04-06 13:45:17.709 [INFO]E:\Jenkins\workspace\qt_http_task.cpp[152] QtHttpTask::Post b7596ffd19a443ff886fb5784bf70751 start post param: http://testgw.xxxx.com/hytrade/info?param={xxxxxxxxxx}]}&sign=xxxxxxxxxx&lkToken=xxxxxxxxxx
2021-04-06 13:45:19.381 [INFO]E:\Jenkins\workspace\qt_http_task.cpp[438] QtHttpTask::SlotReplyFinished b7596ffd19a443ff886fb5784bf70751 -> {"code":"TR10000","msg":"系统异常[com.xxxx.getTraceId()Ljava/lang/String;](TR10000)","sourceMsg":"系统异常[com.xxxx.getTraceId()Ljava/lang/String;](TR10000)","data":null,"success":false}
至此,成功进行了一次mock测试,并且发现了一个问题:后端服务未兼容异常,易暴露堆栈信息。
后期规划
可考虑在服务器上搭建mock环境,大家统一维护mock环境,以减少重复操作。
一如既往,做个总结
方案是死的,人是活的多动脑筋,多想想解决之道,没有你不会做的工作;
多捣腾,才能多给开发提bug。