App在使用的过程中,难免会遇到不同的弱网络环境,像在公车上、在地铁、地下车库等。在这种情况下,手机常常会出现网络抖动、上行或下行超时,导致APP应用中出现丢包延迟,从而影响用户体验。
作为软件测试工程师,我们要在app上线前做一定弱网络环境场景模拟,查看app在弱网络环境下是否存在某些未知的问题。
例如:
一般应用低于2G速率的都属于弱网,也可以将3G划分为弱网。除此之外, 弱信号的Wifi通常也会被纳入到弱网测试场景中。
目前在测试移动设备上进行弱网络专项测试的方案主要有两种:
方案一:通过手机设备连接到PC上进行弱网络测试,比如Fiddler,Charles、NET-Simulator等。
基本思路是在PC电脑上装一个Fiddler网络抓包工具,然后再将手机设备的网络代理到PC电脑上,通过在电脑上的Fiddler设置延时来进行弱网络模拟。
方案二:在专有服务器上构建弱网络WiFi。
用移动设备连接该WiFi进行弱网络测试,相关的技术方案有Facebook的ATC和腾讯的WeTest-WiFi。
以上方案缺点:
(1)需要额外的PC或者服务器,弱网环境构建成本高;
(2)需要安装、部署额外的工具,并且弱网络环境需要在PC上或者Web上进行配置,使用成本高;
(3)弱网络环境功能并不完善,比如Fiddler不支持丢包、抖动等弱网环境。
鉴于以上方案存在的缺点,Qnet这款工具可以完美解决,并且界面操作也非常简单,易于上手。
官网地址: https://wetest.qq.com/product/qnet ,支持android和ios。
注意:安装包获取,需要在官网申请试用,填写问卷,经审核后会发送安装包到邮箱。

点击Qnet App,进入登录界面,勾选同意协议并点击【QQ登录】按钮,授权QQ或TIM账号进行登录。若本地未安装QQ或TIM,会弹出二维码页面扫码登录。
登录之后会记录此次登录,7天内不需重复登录。
【设置】页面-注销, 进行退出登录或切换登录用户,回到登录页面。
点击可选:单一应用/全部应用
这里默认系统常用网络测试模板,也可通过右上角[新增]自己设置弱网模板、或【网络场景】中“添加”系统推荐的弱网测试模板

点击模板的右侧文字,进入编辑页面更新模板
向左滑动要删除的模板,出现[删除]按钮,点击可删除
当添加的模板较多,可通过上方搜索框输入模板名称关键字,完成搜索

3.1 系统推荐模板
【网络场景】页是系统已配置好的模板,供参考选择使用,覆盖常用的极差网络、正常网络模板,断线重连、wifi与4G切换、100%丢包模板等等。
点击【添加】,【保存】后,添加已有模板到【工作台】以供选择。
3.2 新增弱网模板
若系统提供的模板,不满足弱网场景模拟需求,可新增弱网模板。主要包含两种:【场景模板】和【自定义模板】。
入口1:【工作台】页和【网络场景】页右上角的【新增】按钮。
入口2:【网络场景】页中每一项推荐模板的右下角【添加】按钮,点击按钮后【编辑】-【新增】。

提供了网络选择(服务器所处地区、客户端所处地区、运营商类型、网络类型)、场景选择(电梯、地铁、高铁、地下停车场、wifi穿墙、视频网络标准、语音网络标准等),最后填写对应的【模板描述】,【保存】按钮。

提供了多种弱网参数:
网络带宽 (单位kbps,限制当前网络上下行最大的带宽容量)
网络延时 (单位ms,当前网络的上下行延时约等于设置值)
延时抖动 (对每个数据包以设置的概率进行抖动选择,延时范围在0~抖动值之间随机产生)
随机丢包 (按设置的概率对每个包进行丢包)
周期弱网 (按照放行时长、弱网时长设置交替切换,根据弱网类型进行弱网)
协议控制 (支持对不同协议的弱网控制,协议类型包括TCP\UDP\ICMP\DNS)
弱网ip (可针对IP进行弱网控制,多个IP以|分割)
可以根据自己公司产品的测试需要,组合填写对应的参数,最后点击【保存】。

准备工作:QQ登录后,在[设置]页,勾选测试报告、网络抓包、控制悬浮窗、信息悬浮窗
第1步:选择待测应用
【工作台页】点击[点击选择应用],选择测试APP:例如柠檬班app。
第2步:选择弱网测试模板
将需要测试的网络场景模板添加到工作台,点击选择自己所需的网络场景模板。
第3步:启动
第一次开启时会弹出请求【悬浮窗权限】,勾选允许悬浮窗功能。再次点击启动,第一次运行时会弹出请求【VPN权限】,点击【确定】则QNET启动成功
第4步:操作待测APP,关注软件情况
启动后,QNET会自动拉起待测APP,页面会显示控制悬浮窗,信息悬浮窗(若设置页面未勾选则不显示)。
第5步:停止
测试完毕,双击[控制悬浮窗]Qnet图标,回到Qnet[工作台]页面,点击停止。
停止后,测试报告可以去/storage/emulated/0/qnet_save/report中获取查看。
停止后,网络抓包可以去/storage/emulated/0/qnet_save/pcap中获取查看。
前提: 确保本地电脑已安装好adb运行环境(自行百度)。
功能介绍: ADB指令执行功能可以自动化的启用弱网,帮助用户可以接入进行自动化测试弱网。功能包括adb命令行发送指令启动弱网、停止弱网、更新弱网模板等功能。
参数传递方式:
--[类型] [key] [value]
--ei:表示参数值为int
--es:表示参数值为string
详细参数可以参照官网。
首先执行命令启动QNET进程:
adb shell am start {--[类型] [key] [value]} com.tencent.qnet/.Component.AdbStartActivity
--ei:表示参数值为int --es:表示参数值为string
使用示例:针对柠檬班app进行上下行100ms延时抓包,并显示信息悬浮窗
adb shell am start --es "package_name" "com.lemontestv2.lemonban" --ei "out_delay" 100 --ei "in_delay" 100 --ei "dump_pcap" 1 --ei "info_float_window" 1 com.tencent.qnet/.Component.AdbStartActivity
结束弱网并退出进程:
adb shell am broadcast -a "qnet.boradcast.drive" --include-stopped-packages {--[类型] [key] [value]} com.tencent.qnet
使用示例:结束弱网
adb shell am broadcast -a "qnet.boradcast.drive" --include-stopped-packages --es "command" "stop_service" com.tencent.qnet
以上就是关于Qnet这款弱网测试神器的详细说明,官网也有对应的操作文档,工作中有需要进行APP弱网测试的,可以好好利用起来了!为了便于大家更好地进行实操,我也同步录制了一套弱网测试视频(有需要的可以来领取),不仅包含Qnet这款工具的操作,也给大家覆盖讲到了Fiddler、Charles等工具弱网场景模拟的操作;还包括项目实操、结果分析。视频内容见下图:

很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。
我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere
Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/
我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test
我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r
我在app/helpers/sessions_helper.rb中有一个帮助程序文件,其中包含一个方法my_preference,它返回当前登录用户的首选项。我想在集成测试中访问该方法。例如,这样我就可以在测试中使用getuser_path(my_preference)。在其他帖子中,我读到这可以通过在测试文件中包含requiresessions_helper来实现,但我仍然收到错误NameError:undefinedlocalvariableormethod'my_preference'.我做错了什么?require'test_helper'require'sessions_hel
只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您
我有:When/^(?:|I)follow"([^"]*)"(?:within"([^"]*)")?$/do|link,selector|with_scope(selector)doclick_link(link)endend我打电话的地方:Background:GivenIamanexistingadminuserWhenIfollow"CLIENTS"我的HTML是这样的:CLIENTS我一直收到这个错误:.F-.F--U-----U(::)failedsteps(::)nolinkwithtitle,idortext'CLIENTS'found(Capybara::Element