在接口测试过程中,某个线程连续两次请求中间都会消耗的时间,线程在收到响应进行第二次请求的时候会消耗一些时间,比如进行结果验证,日志存储,或者进行数据统计等等。
一般来讲这些时间都是微秒级别的,偶尔会遇到一些毫秒级别的,比如这次:线程安全类在性能测试中应用,中间参数签名的消耗时间在10ms级别,如果在并发的情况下甚至达到100ms,而且对本机的CPU资源消耗也比较厉害。
解决办法: 提前将数据签名,以空间换时间,先把所有的参数签名完毕,然后再去发送请求。
中间用到了线程安全的队列LinkedBlockingDeque,这个可以帮助我们解决掉数据可能会重复的问题。
新版发代码如下:
package com.okayqa.others.payyst
import com.alibaba.fastjson.JSONimport com.fun.base.constaint.ThreadLimitTimesCountimport com.fun.frame.excute.Concurrentimport com.fun.frame.httpclient.FanLibraryimport com.fun.utils.ArgsUtilimport com.fun.utils.RStringimport com.okayqa.common.RSAUtilLJTimport com.okayqa.common.Usersimport org.apache.http.client.methods.HttpPostimport org.slf4j.Logger
import java.util.concurrent.LinkedBlockingDequeimport 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。
- 郑重声明:禁止第三方(腾讯云除外)转载、发表。

















