这种估计是分段下载,部分数据包损坏,然后重新下载,导致总数据量比 APP 实际大小要大。
现在很多平台都是这样的吧,这样可以快速让用户知道有没有输入正确,有些 APP 都是把验证码单独放一个页面,验证正确就自动跳转;至于你说的暴力破解问题,这个肯定是限制了的。
<property name="jmeter.result.jtl.dir" value="/home/me/ant_build/jmeter_result/"/>
这就是个 html 模板啊
你可以配置一个 jtl 路径,生成出来是 csv 格式的数据,解析一下就行,jmeter 没有提供生成 json 的方法。
windows slave 要用 JNLP 方式连接,你用 SSH 肯定不行
多半是输入法的原因,或者是输入过快,1 个 1 个的输入试试
这个要看你们测试框架的设计是怎么样的。
如果是直接写脚本这种,那肯定要按照代码的语法规范来;
如果是类似于 BDD 这种的,可以使用自然语言来编写用例,跟手工测试用例类似。
嗯,可以这样理解,增加一层的目的主要还是为了解耦。
PO 和 TestCase 之间还可以加一层业务层封装,可以简化测试用例
如果不是真实支付的话,就可以了不用 Mock 了。
但是压测在测试环境进行的话,除非机器配置、服务环境、基础设施这些能和生产环境保持一致,否则测出来的结果也没太大的意义。
一般是这样的。如果真实支付的话,成本会比较大。
脚本中最好不要直接出现坐标定位,这种会很不稳定;对于无法使用 xpath 来定位的元素,可以参考 AirTest 里面 <模板匹配>
airtest/aircv/template.py 的实现,原理就是通过图标找到具体按钮的位置,然后再通过坐标点击,这种处理兼容性会好很多。
生成压测数据,最好是要符合线上的业务场景,否则测试出来的结果意义并不;
比如正常的业务流程:登录 - 多次查询 - 多次下单 - 多次支付 - 确认收货等,查询缓存实际上不会造成压测结果的不准确,因为线上就是这样的;如果每次都注册新账号来测试,每次查询都不经过缓存,测出来的结果反而会不准确;
如果确实是要测试某些极端场景,比如缓存击穿,所有请求同时去访问数据库,DB 是否能承受得住,这种情况可以通过业务开关,临时关闭缓存功能来测试。
测试数据可以通过脚本模拟生成,也可以直接 COPY 生产流量,脱敏后使用;
对于第三方服务,比如短信、支付、推送等,因为不是压测的重点,所以可以使用 Mock 来代替。
前段时间看过阿里的一篇文章 在阿里,我们如何管理测试环境,可以看一下。
主要就是 利用链路追踪 + 服务动态路由 来控制要调用的服务。
如果某个服务有三个分支 (test1, test2, test3),先在环境管理平台设置对应关系 (用户 ID/IP -> 实例 test1/test2/test3),那么在请求的入口 (网关) 通过设置对应的标识,然后在请求的链路中通过中间件动态路由根据设置的标识,去调用对应的服务。
不过要实现这些功能还得要基础设施支持才行。
这种可以通过前置条件来处理吧,封装通用的前置条件,比如 新增/获取 特定优惠券等。
但是这种条件多了,维护起来也麻烦。。
你本地的 JMeter 装了插件,服务器上没装,解析 jmx 报错
调试?是指运行吗?
点运行的话,脚本会自动保存在 根目录下的 backup 下
如果没有运行的话,那就是找不回来了。
代码中最后一句
sampler.getArguments().getArgument(0).setValue(out.toString(0));
就是把压缩的数据设置回去
你是要测试你的 APP,还是要测试 手机 web?
一般来说不会对单个参数做 gzip 压缩,都是直接压缩整个 Body 的
how-to-post-gzip-request-with-apache-jmeter
import org.apache.commons.io.IOUtils;
import java.util.zip.GZIPOutputStream;
String bodyString = sampler.getArguments().getArgument(0).getValue();
byte [] requestBody = bodyString.getBytes();
ByteArrayOutputStream out = new ByteArrayOutputStream(requestBody.length);
GZIPOutputStream gzip = new GZIPOutputStream(out);
gzip.write(requestBody);
gzip.close();
sampler.getArguments().getArgument(0).setValue(out.toString(0));
可以下载啊,因为是 AWS 的服务器,估计会有点慢,开个梯子吧
找了个接口试了下,是可以拿到数据的,这个要查下是不是后端接口本来就没返回数据。
python http 推荐用 requests
import json
import requests
headers = {
'Content-Type': 'application/json',
'appKey': 'appCF4QCVP',
'appSecret': '1548931565000',
'wjwAuthorization': '2dbc04dea23510f83390f5a749f5e9587d8984b397b3b4b695f3d835069f3544',
'cache-control': 'no-cache',
'User-Agent': 'Mozilla/5.0(Windows NT6.1;WOW64;Trident/7.0;rv:11.0)like Gecko',
'Accept-Encoding': 'gzip,deflate',
'Connection': 'Keep-Alive',
'Accept': '/'
}
data = {
"alarmId": "10-40-226.108-5117-4f5b-97b9-000000AAA1",
"alarmTypeCode": "403001",
"alarmTypeDesc": "描述1",
"alarmStartTime": 1548814332000,
"alarmEndTime": 1548817200000,
"alarmStatus": 0,
"relatedCameraIndexCode": "001130",
"relatedCameraName": "IPDOME-67.100"
}
resp = requests.post(
url='http://10.40.226.108/eop/services/common/post/audioAlarmReceive',
data=json.dumps(data, ensure_ascii=False).encode(),
headers=headers
)
print(resp.text)
pip install allure-pytest
OPTION 请求只有在第一次访问的时候会请求一次,后面就不会请求了。浏览器有缓存的。这个带来的性能消耗微乎其微。
如果请求跨域了,必须要有 OPTION,否则前端收不到数据,即使把数据类型改为 text/plain 也没有用。