专栏首页FunTester性能测试如何减少本机误差

性能测试如何减少本机误差

在接口测试过程中,某个线程连续两次请求中间都会消耗的时间,线程在收到响应进行第二次请求的时候会消耗一些时间,比如进行结果验证,日志存储,或者进行数据统计等等。

一般来讲这些时间都是微秒级别的,偶尔会遇到一些毫秒级别的,比如这次:线程安全类在性能测试中应用,中间参数签名的消耗时间在10ms级别,如果在并发的情况下甚至达到100ms,而且对本机的CPU资源消耗也比较厉害。

解决办法: 提前将数据签名,以空间换时间,先把所有的参数签名完毕,然后再去发送请求。

中间用到了线程安全的队列LinkedBlockingDeque,这个可以帮助我们解决掉数据可能会重复的问题。

新版发代码如下:

package com.okayqa.others.payyst

import com.alibaba.fastjson.JSON
import com.fun.base.constaint.ThreadLimitTimesCount
import com.fun.frame.excute.Concurrent
import com.fun.frame.httpclient.FanLibrary
import com.fun.utils.ArgsUtil
import com.fun.utils.RString
import com.okayqa.common.RSAUtilLJT
import com.okayqa.common.Users
import org.apache.http.client.methods.HttpPost
import org.slf4j.Logger

import java.util.concurrent.LinkedBlockingDeque
import java.util.concurrent.atomic.AtomicInteger

class T extends FanLibrary {static Logger logger = getLogger(T.class)

    static LinkedBlockingDeque<Map<String, String>> ppp = new LinkedBlockingDeque<>()

    static AtomicInteger i = new AtomicInteger(111000);

    publicstaticvoid main(String[] args) {
        def argsUtil = new ArgsUtil(args)
        def thread = argsUtil.getIntOrdefault(0, 1)
        def times = argsUtil.getIntOrdefault(1, 100)

        def ps = []

        thread.times {
//            def mark = new HeaderMark("requestid")
            ps << new Thr(times)
        }

        new Concurrent(ps, "参数提前初始化").start()


        def reqs = []

        thread.times {
//            def mark = new HeaderMark("requestid")
            reqs << new Thr(times)
        }

        new Concurrent(reqs, "会员支付和续费接口").start()
        testOver()
    }

    publicstatic Map<String, String> getParams() {
        def add = i.getAndAdd(1)
        Map<String, String> p = new HashMap<>();
        p.put("days", "1");
        p.put("memberId", "208");
        p.put("orderNo", "F" + RString.getString(4) + add);
        p.put("orderPaySystemId", "85123213");
        p.put("orderPayTime", "2020-02-09 10:00:00");
        p.put("payMoney", "30");
        p.put("recordSources", "3");
        p.put("renewal", "false");
        def user = Users.getStuUser(add % 1000)
        p.put("systemId", user);
        String sign = RSAUtilLJT.sign(p, RSAUtilLJT.getPrivateKey(RSAUtilLJT.RSA_PRIVATE_KEY));
        p.put("sign", sign);
        return p;
    }


    staticclass P extends ThreadLimitTimesCount {public P(int times) {
            super(null, times, null);
        }

        @Overrideprotectedvoid doing() throws Exception {
            def add = i.getAndAdd(1)
            Map<String, String> p = new HashMap<>();
            p.put("days", "1");
            p.put("memberId", "208");
            p.put("orderNo", "F" + RString.getString(4) + add);
            p.put("orderPaySystemId", "85123213");
            p.put("orderPayTime", "2020-02-09 10:00:00");
            p.put("payMoney", "30");
            p.put("recordSources", "3");
            p.put("renewal", "false");
            def user = Users.getStuUser(add % 1000)
            p.put("systemId", user);
            String sign = RSAUtilLJT.sign(p, RSAUtilLJT.getPrivateKey(RSAUtilLJT.RSA_PRIVATE_KEY));
            p.put("sign", sign);
            ppp.add(p)
        }
    }

    staticclass Thr extends ThreadLimitTimesCount {static Logger logger = getLogger(Thr.class)

        public Thr(int times) {
            super(null, times, null);
        }

        @Overrideprotectedvoid doing() throws Exception {
            String url = com.okayqa.studentapd.base.OkayBase.HOST + "/api/member/createOrRenewMember"
            HttpPost post = getHttpPost(url, JSON.toJSONString(ppp.take()));
            def s = "F" + getNanoMark()
            post.addHeader(getHeader("requestid", s));

            def simlple = FanLibrary.excuteSimlple(post)
            if (!simlple.contains("success")) {
                logger.warn(s + OR + user + simlple.toString())
                fail()
            }
        }

    }
}

经过上期文章:利用微基准测试修正压测结果验证方法,稳稳的OK。


  • 郑重声明:文章首发于公众号“FunTester”,禁止第三方(腾讯云除外)转载、发表。

本文分享自微信公众号 - FunTester(NuclearTester),作者:八音弦

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-02-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何在Mac OS上使用UiAutomator快速调试类

    本人最近在Mac OS上使用UiAutomator快速调试类的时候发现跟Windows环境下使用有很大的区别,对于我这个Mac OS小白来说有很多坑要填,今天终...

    FunTester
  • 利用微基准测试修正压测结果

    前段时间做了一次参数需要签名的接口性能测试,有文为证:线程安全类在性能测试中应用。在处理测试结果时候遇到一个问题:因为本机签名耗时较多,10ms级别,并发情况能...

    FunTester
  • HTTP异步连接池和多线程实践

    今天在查询一个列表的时候,突然发现列表由于之前压测导致几万条脏数据积累。导致找一个数据比较麻烦,由于项目没有提供批量删除的功能,所以想了个办法通过接口把数据挨个...

    FunTester
  • shape文件上传与展示

    lzugis
  • react-create-app 中配置使用 Mobx

    FinGet
  • Java基于百度API的图片文字识别(支持中文,英文和中英文混合)

    具体文档:http://ai.baidu.com/docs#/OCR-API/e1bd77f3

    好好学java
  • Java基于百度API的图片文字识别

    http://ai.baidu.com/docs#/OCR-API/e1bd77f3

    Java团长
  • Android向Excel写入数据导出U盘并发送邮件

    本文实例为大家分享了Android向Excel写入数据导出并发送邮件的具体代码,供大家参考,具体内容如下

    砸漏
  • 【Java多线程】写入同一文件,自定义线程池与线程回收利用2 顶

    起初为了方便快捷,只为实现功能,写了很多垃圾的代码. 造成性能不高,可读性,可维护性不强。

    linapex
  • SpringBoot项目:RedisTemplate实现轻量级消息队列(含代码)

    1、excel文件读写--阿里easyexcel sdk 2、文件上传、下载--腾讯云对象存储 3、远程服务调用--restTemplate 4、生产者、消费者...

    搜云库技术团队

扫码关注云+社区

领取腾讯云代金券