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

Posted 钧漫元泷

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了性能测试如何减少本机误差相关的知识,希望对你有一定的参考价值。

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

一般来讲这些时间都是微秒级别的,偶尔会遇到一些毫秒级别的,比如这次:,中间参数签名的消耗时间在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”,禁止第三方(腾讯云除外)转载、发表。

技术类文章精选

非技术文章精选


以上是关于性能测试如何减少本机误差的主要内容,如果未能解决你的问题,请参考以下文章

模型评估与选择

如何减少用本机 Visual C++ 编写的大型项目的链接时间?

机器学习/数据挖掘/算法岗位面试题汇总

深度学习——机器学习策略

Keras 损失函数不会因均方误差而减少

交叉验证