写点什么

动态模型中嵌入静态模型实践

作者:FunTester
  • 2022 年 8 月 01 日
  • 本文字数:2014 字

    阅读完需:约 7 分钟

在之前的动态模型之动态增减【FunTester测试框架】中分享了动态的性能测试模型的实现,后面在实际工作中也是受益匪浅,有文为证动态压测模型让工作更轻松


这里再重复一下思路,就是通过异步线程接收控制台输入信息,然后对线程池的增减管理或者对 QPS 管理器的 QPS 进行干预。


相对一段时间来说只有一些简单的功能:


  1. 设置步长

  2. 增减步长

  3. 终止测试


很长一段时间内都够用了,但是随着测试的深入,可能需要执行更多动态用例,如果靠人力一个个输入会比较麻烦。这个时候我又想起来了静态模型的好处来。就是过程不需要中途干预,可以按照预定的测试计划执行。


那么问题来了,如何才能将动态模型和静态模型结合在一起呢?


经过权衡,还是将静态的模型融入动态模型比较方便,毕竟还是先启动再说,后续过程随意设置参数调整压力比较方便。

思路

非常简单,就是在异步线程中增加对命令的支持即可。经过一些考虑和实践,决定增加两种:一是以目标、持续时间为参数;二是以增量(减量)、持续时间为参数。


这里我以动态 QPS 模型为案例,修改异步控制器。


private class FunTester implements IFunController {
boolean inputKey = true;
/** * 控制 */ boolean autoKey = false
@Override public void run() { while (inputKey) { String input = getInput(); switch (input) { case "+": add(); break; case "-": reduce(); break; case "*": over(); break; case "/": autoKey = true break; default: if (Regex.isMatch(input, "(F|f)\\d+")) QPS_STEP = changeStringToInt(input.substring(1)); if (Regex.isMatch(input, "(T|t)\\d+(D|d)\\d+")) { def split = (input - "T" - "t").split(/(d|D)/) autoTarget(split[0] as int, split[1] as int) } if (Regex.isMatch(input, "(A|a)-{0,1}\\d+(D|d)\\d+")) { def split = (input - "A" - "a").split(/(d|D)/) autoAdd(split[0] as int, split[1] as int) } break; } } }
/** * 自动控制递增功能,以目标值计算 * @param target 目标QPS * @param duration 持续时间 * @return */ def autoTarget(int target, duration) { fun { for (i in 0..<duration) { if (autoKey) break qps += (target - qps) / duration sleep(1.0) } if (!autoKey) qps = target autoKey = false } }
/** * 自动控制递增功能,以增加值计算 * @param sum * @param duration * @return */ def autoAdd(int sum, duration) { fun { int q = qps for (i in 0..<duration) { if (autoKey) break qps += sum / duration sleep(1.0) } if (!autoKey) qps = q + sum autoKey = false } }
@Override public void add() { qps += QPS_STEP }
@Override public void reduce() { qps -= QPS_STEP if (qps < 1) over() }
@Override public void over() { inputKey = false key = false logger.info("动态结束任务!"); }
}
复制代码


这里我使用了Java自定义异步功能实践的功能,然后我留了一个终止的关键字/用来做终止的关键字符。这个主要是为了防止自动递增过程中触发阈值,作为暂停使用。这里的增加的方法也兼容了减少,只需要设置成负值即可。


FunTester 原创专题集锦


阅读原文,跳转我的仓库地址

发布于: 刚刚阅读数: 4
用户头像

FunTester

关注

公众号:FunTester,800篇原创,欢迎关注 2020.10.20 加入

Fun·BUG挖掘机·性能征服者·头顶锅盖·Tester

评论

发布
暂无评论
动态模型中嵌入静态模型实践_FunTester_InfoQ写作社区