在之前的动态模型之动态增减【FunTester 测试框架】中分享了动态的性能测试模型的实现,后面在实际工作中也是受益匪浅,有文为证动态压测模型让工作更轻松。
这里再重复一下思路,就是通过异步线程接收控制台输入信息,然后对线程池的增减管理或者对 QPS 管理器的 QPS 进行干预。文章源自玩技e族-https://www.playezu.com/193017.html
相对一段时间来说只有一些简单的功能:文章源自玩技e族-https://www.playezu.com/193017.html
- 设置步长
- 增减步长
- 终止测试
很长一段时间内都够用了,但是随着测试的深入,可能需要执行更多动态用例,如果靠人力一个个输入会比较麻烦。这个时候我又想起来了静态模型的好处来。就是过程不需要中途干预,可以按照预定的测试计划执行。文章源自玩技e族-https://www.playezu.com/193017.html
那么问题来了,如何才能将动态模型和静态模型结合在一起呢?文章源自玩技e族-https://www.playezu.com/193017.html
经过权衡,还是将静态的模型融入动态模型比较方便,毕竟还是先启动再说,后续过程随意设置参数调整压力比较方便。文章源自玩技e族-https://www.playezu.com/193017.html
思路
非常简单,就是在异步线程中增加对命令的支持即可。经过一些考虑和实践,决定增加两种:一是以目标、持续时间为参数;二是以增量(减量)、持续时间为参数。文章源自玩技e族-https://www.playezu.com/193017.html
这里我以动态 QPS 模型为案例,修改异步控制器。文章源自玩技e族-https://www.playezu.com/193017.html
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 自定义异步功能实践的功能,然后我留了一个终止的关键字/
用来做终止的关键字符。这个主要是为了防止自动递增过程中触发阈值,作为暂停使用。这里的增加的方法也兼容了减少,只需要设置成负值即可。文章源自玩技e族-https://www.playezu.com/193017.html
FunTester 原创专题集锦文章源自玩技e族-https://www.playezu.com/193017.html
- 性能测试专题
- Java、Groovy、Go、Python
- 单测&白盒
- FunTester 社群风采
- 测试理论鸡汤
- 接口功能测试专题
- FunTester 视频专题
- 案例分享:方案、BUG、爬虫
- UI 自动化专题
- 测试工具专题
阅读原文,跳转我的仓库地址
文章源自玩技e族-https://www.playezu.com/193017.html
软件功能测试
评论