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

在之前的动态模型之动态增减【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原创专题集锦 - 性能测试专题 - Java、Groovy、Go、Python - 单测&白盒 - FunTester社群风采 - 测试理论鸡汤 - 接口功能测试专题 - FunTester视频专题 - 案例分享:方案、BUG、爬虫 - UI自动化专题 - 测试工具专题

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