前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >性能测试中图形化输出测试数据

性能测试中图形化输出测试数据

作者头像
FunTester
发布2020-02-24 11:55:21
6910
发布2020-02-24 11:55:21
举报
文章被收录于专栏:FunTesterFunTester

在性能测试中,测试数据一般都是单独存在日志文件中,呈现出来的都是一些冰冷的数据,比如:

~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
>  {
>  ① . "rt":186,
>  ① . "total":3000,
>  ① . "qps":160.90075820012837,
>  ① . "excuteTotal":0,
>  ① . "failRate":0.0,
>  ① . "threads":30,
>  ① . "startTime":"2020-02-18 21:30:15",
>  ① . "endTime":"2020-02-18 21:31:15",
>  ① . "errorRate":0.0,
>  ① . "desc":"测试登录接口2020-02-18"
>  }
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~

虽然会把结果存在数据库中,结束之后也会通过Pythonplotly进行图形化处理,如下:

但是在实际工作中这样很费劲,因为极大可能测试数据都是在服务器上,如果在服务器上执行Groovy压测脚本再去调用Python脚本会比较麻烦,而且调试结果和查看内容也得借助测试服务文件映射来查看。

综上所诉,最好能找一个Groovy兼容、纯文本形式的结果展示图,这样可以在shell界面或者直接在邮件中发送更加直观的测试数据,经过尝试,我搞定了,先放图:

利用了特殊字符里面有一个全黑的正方形,分别有8等分的不同高度的横线,如下:

public static final String[] PERCENT = {" ", "▁", "▂", "▃", "▄", "▅", "▅", "▇", "█"};

思路如下:先对测试数据排序,平均分成23个桶,去每个桶的中位数作为代表。以最大的中位数为800,然后计算各个中位数对应的黑格数,剩下的填充空格,再将生成的string[]里面的每一个string对象转换成char[],实际操作中还是string[],只是每一个的length都等于1。这样我们就得到了一个二维数组string[][],但是这是横向的,我们需要竖排的,在对二维数组进行坐标转换就得到了最终的二维数组string[][],按照固定规则拼接StringBuffer即可。

下面是代码省去了测试数据的获取:


    /**
     * 将性能测试数据图表展示
     *
     * <p>
     * 将数据排序,然后按照循序分桶,选择桶中中位数作代码,通过二维数组转化成柱状图
     * </p>
     *
     * @param data 性能测试数据,也可以其他统计数据
     * @return
     */
    public static String statistics(List<Integer> data) {
        int size = data.size();
        int[] ints = range(1, BUCKET_SIZE + 1).map(x -> data.get(size * x / BUCKET_SIZE - size / BUCKET_SIZE / 2)).toArray();
        int largest = ints[BUCKET_SIZE - 1];
        String[][] map = Arrays.asList(ArrayUtils.toObject(ints)).stream().map(x -> getPercent(x, largest, BUCKET_SIZE)).collect(toList()).toArray(new String[BUCKET_SIZE][BUCKET_SIZE]);
        String[][] result = new String[BUCKET_SIZE][BUCKET_SIZE];
        /*将二维数组反转成竖排*/
        for (int i = 0; i < BUCKET_SIZE; i++) {
            for (int j = 0; j < BUCKET_SIZE; j++) {
                result[i][j] = getManyString(map[j][BUCKET_SIZE - 1 - i], 2) + SPACE_1;
            }
        }
        StringBuffer table = new StringBuffer(LINE + TAB + ">>响应时间分布图,横轴排序分成桶的序号,纵轴每个桶的中位数<<" + LINE + TAB + TAB + "--<中位数数据最小值为:" + ints[0] + " ms,最大值:" + ints[BUCKET_SIZE - 1] + " ms>--" + LINE);
        for (int i = 0; i < BUCKET_SIZE; i++) {
            table.append(TAB + Arrays.asList(result[i]).stream().collect(Collectors.joining()) + LINE);
        }
        return table.toString();
    }

    /**
     * 将数据转化成string数组
     *
     * @param part   数据
     * @param total  基准数据,默认最大的中位数
     * @param length
     * @return
     */
    public static String[] getPercent(int part, int total, int length) {
        int i = part * 8 * length / total;
        int prefix = i / 8;
        int suffix = i % 8;
        String s = getManyString(PERCENT[8], prefix) + (prefix == length ? EMPTY : PERCENT[suffix] + getManyString(SPACE_1, length - prefix - 1));
        return s.split(EMPTY);
    }

★不要问为啥选23,问就是计算式计算23是被除数时比较快。 ”

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-02-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FunTester 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
测试服务
测试服务 WeTest 包括标准兼容测试、专家兼容测试、手游安全测试、远程调试等多款产品,服务于海量腾讯精品游戏,涵盖兼容测试、压力测试、性能测试、安全测试、远程调试等多个方向,立体化安全防护体系,保卫您的信息安全。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档