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


    在之前的动态模型之动态增减【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原创专题集锦

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

  • 相关阅读:
    优化SQL Server数据库的经验总结
    #main和.main区别
    通过SQL把n条记录插入表中
    11月6日到8日参加微软Tech.ED2008大会
    NOIP2017 D2T1奶酪
    NOIP2017 D1T2时间复杂度
    NOIP2017 D2T2宝藏
    NOIP2017 D1T1小凯的疑惑
    NOIP2017 D1T3逛公园
    NOIP2017 D2T3列队
  • 原文地址:https://www.cnblogs.com/FunTester/p/16540052.html
Copyright © 2020-2023  润新知