在平时性能测试过程中,有时候由于无法对被测接口或者方法性能指标进行准确的预估,所以只能凭借经常进行压测参数的相关测试。有时候压测的时间和次数设置偏大或者已经达到了测试的目的,而测试需要被终止,但是又不想损失掉测试数据,我们就要对测出过程中的数据继续进行记录和统计,输出测试报告。

由此引出了终止性能测试并输出报告的题目,还有一个场景是在性能压测服务的运行过程中,我们不可能终止JVM的运行,所以只能通过终止标志来提前结束测试过程。

思路如下:在定时和定量压测模式实现 -- 视频讲解中,已经讲到了通过key来控制结束。

在本机压测的情况下,我们可以通过arthas修改JVM中静态变量的值或者调用stop()方法,具体实现如下:arthas 命令 ognl 视频演示;在性能服务运行过程中,我们依然可以通过上述方法达到目的,单更好的办法是对外提供一个终止接口,调用stop()方法。

终止测试运行不会影响后续数据的记录和测试结果的统计功能,具体的代码大家可以后台回复git查看全部开源框架内容,下面分享一下定量虚拟类的代码:

@Override
    public void run() {
        try {
            before();
            List<Long> t = new ArrayList<>();
            long ss = Time.getTimeStamp();
            for (int i = 0; i < times; i++) {
                try {
                    threadmark = mark == null ? EMPTY : this.mark.mark(this);
                    long s = Time.getTimeStamp();
                    doing();
                    long e = Time.getTimeStamp();
                    excuteNum++;
                    long diff = e - s;
                    t.add(diff);
                    if (diff > HttpClientConstant.MAX_ACCEPT_TIME) marks.add(diff + CONNECTOR + threadmark);
                    if (status() || key) break;
                } catch (Exception e) {
                    logger.warn("执行任务失败!", e);
                    logger.warn("执行失败对象的标记:{}", threadmark);
                    errorNum++;
                }
            }
            long ee = Time.getTimeStamp();
            logger.info("执行次数:{},错误次数: {},总耗时:{} s", times, errorNum, (ee - ss) / 1000 + 1);
            Concurrent.allTimes.addAll(t);
            Concurrent.requestMark.addAll(marks);
        } catch (Exception e) {
            logger.warn("执行任务失败!", e);
        } finally {
            after();
        }

    }

热文精选


↙↙↙阅读原文可查看相关链接,并与作者交流