当前位置:网站首页>动态接口比例性能测试实践
动态接口比例性能测试实践
2022-08-03 17:42:00 【InfoQ】
之前在性能测试中,我重新认识了随机数的功能
性能测试中的随机数性能问题探索
。但目前工作中接触到的都是静态的比例,即用例真正开始前,各个接口、场景的比例都是固定的。按照我的思路,旧会存在一个提前初始化完成的list,但是最近工作中遇到了需要在压测过程中(动态QPS模型),动态调整两个场景的比例值,计划是在某个范围内周期波动。
其实核心问题:如何在一个变动的list随机实践中,保证线程安全。
这里先分享一下从一个数组中随机取一个对象的思路,如下:
/**
* 随机选择某一个对象
*
* @param list
* @param <F>
* @return
*/
public static <F> F random(List<F> list) {
if (list == null || list.isEmpty()) ParamException.fail("数组不能为空!");
return list.get(getRandomIntZero(list.size()));
}
可以看出这个方案中十分依赖list的
size(),这也是在动态数组中随机面临的问题。我解决问题的方案是这样:
- 使用异步线程动态往list中添加和删除对应的元素
- 使用线程安全的类缓存list的
size()
- 使用缓存的size进行随机,在增减前后重置参数
这里再附加两个逻辑:
- 整个变化随着用例执行开始执行,用例结束而结束,使用同一个状态
- 间隔时间设置,间隔interval调整一次,调整N次之后倒置增减条件
下面是我的异步实践:
boolean upKey = false
fun {
//100s转变一次
while (FunQpsConcurrent.key) {
if (upKey) {
10.times {
sleep(10.0)
size.getAndAdd(-reduce)
reduce.times {
PriapiWriteApiQpsConfig.apiList.remove(13 as Integer)
}
add.times {
PriapiWriteApiQpsConfig.apiList.add(10)
}
size.getAndAdd(add)
}
} else {
10.times {
sleep(10.0)
reduce.times {
PriapiWriteApiQpsConfig.apiList.add(13 as Integer)
}
size.getAndAdd(reduce)
size.getAndAdd(-add)
add.times {
PriapiWriteApiQpsConfig.apiList.remove(10 as Integer)
}
}
}
upKey = !upKey
}
}
其中缓存size的代码:
static AtomicInteger size = new AtomicInteger()这里已经实现了预设需求。其中两点:
- 增加list长度,先调整list,然后调整缓存。减少list长度,先减少缓存,然后调整list。
- 这里使用了
java.util.concurrent.atomic.AtomicInteger,其实并不是必要的,可以使用int也是可以的。
下面是我的随机的方法:
PriapiWriteApiQpsConfig.apiList.get(getRandomIntZero(size.get()))这里可能有的小伙伴有个疑问,因为在这个线程执行的过程中,从list中随机的方法的QPS是非常高的。一定会有随机到100,但是刚好这个100的元素被移除这种情况。虽然我没有从现有资料中看到这个情况会get到null还是新的元素。但是据我自己的测试中,当随机方法在10万QPS的测试中,并没有发生。
FunTester原创专题集锦
- 性能测试专题
- Java、Groovy、Go、Python
- 单测&白盒
- FunTester社群风采
- 测试理论鸡汤
- 接口功能测试专题
- FunTester视频专题
- 案例分享:方案、BUG、爬虫
- UI自动化专题
- 测试工具专题
阅读原文,跳转我的仓库地址边栏推荐
- 【engine】RtcSyncCallback回调、回调容器RtcCallbackContainer及MediaPacketSenderImpl 中回调使用
- Halcon 小笔记 C# 图片是否有效
- es6新增-Generator(异步编程的解决方案2)
- 软件盘点企业使用服装ERP的好处
- CC2530_ZigBee+华为云IOT:设计一套属于自己的冷链采集系统
- 2021年数据泄露成本报告解读
- 什么是鉴权?一篇文章带你了解postman的多种方式
- 理想L9旗舰级的安全性有多强?守护一家人安全出行“底线”
- CC2530_ZigBee+HUAWEI CLOUD IOT: Design your own cold chain acquisition system
- 广告电商系统开发之会员系统板块
猜你喜欢
随机推荐
持续投入商品研发,叮咚买菜赢在了供应链投入上
广告电商系统开发之会员系统板块
WebGL管网展示(及TubeGeometry优化)
【保姆级示例向】观察者模式
【JS】利用JS给删除按钮添加提示框
工程仪器设备在线监测管理系统常见问题和注意事项
Is OnePlus Ace worth buying?Use strength to interpret the power of performance
PMP考试通关宝典-敏捷专题
2021年数据泄露成本报告解读
CAD如何自定义快捷键
【mysql】SIGN(x) function
全尺度表示的上下文非局部对齐,南科大&优图提出NAFS解决基于文本的Re ID
借助Web3盘活日本优质IP:UneMeta 与 OpenSea 的差异化竞争
一个域名对应多个IP地址
ICDAR competition technology sharing
383. Ransom Note
软件测试<用例篇>
mysql之的执行计划
AI智能剪辑,仅需2秒一键提取精彩片段
Crack: WebKitX ActiveX and WebKitX VHX









