目录引言场景思路场景思路Demo实现控制台输出引言在经历过一些尝试之后,觉得在当下的项目中运用链路压测的能力,不等着其他人了。链路这个词其实不如路径通俗易懂,跟产品沟通这个比较有效率。具体的操作路径,...
目录
引言场景思路
场景
思路
Demo实现
控制台输出
引言
在经历过一些尝试之后,觉得在当下的项目中运用链路压测的能力,不等着其他人了。
链路这个词其实不如路径通俗易懂,跟产品沟通这个比较有效率。具体的操作路径,产品会给一份出来,但是这都是基于UI和产品思维的文档,跟接口测试区别还是很大的,只能提供参考依据。
需要端上测试协作,有些业务细节还得端上测试同学帮忙补充一下。还需要运维同事帮忙理一下各个接口的请求量比例,这次的比例我是依据灵光一现写出来,然后大家一起调整的。
本次由于比较初级,所以这块文档就不写出来了,放一个图来表达一下这个链路做了些什么,PS:我现在很喜欢用图而不是文字,沟通效率太高了。推荐工具draw.io,感兴趣的可以参考文末的热文中两张架构图中的介绍。

资源库1.4链路压测方案
这次把登录剔除了,因为太慢了,对测试结果影响比较大。
场景思路
场景
场景就是老师登录,首先会请求一个知识点列表,然后通过知识点属性筛选推荐课程列表,在对课程列表中的数据进行收藏和取消收藏,在获取自己当前知识点下的课程列表(包含原创和收藏)。
思路
本次依然采取固定线程的压测模型,本人预估线程200左右,测试用户600备用,列表页保证2页数据。
每个线程绑定一个用户,然后用户开始循环链路执行步骤,执行一次当做一次Q。单次Q包含9次HTTP接口请求(放弃了Socket接口,以后有需求再添加Socket接口到链路中),其中3次修改操作,6次查询操作。
具体的逻辑通过内部静态类实现,然后多一个K类,用来存储每次获取的知识点属性,方便调用。由于接口请求方法都是用基础数据类型和String作为参数,所以调用时候会显得有点啰嗦。但无伤大雅,脚本写出来,本来就是用完就扔到仓库里面,改天再用再优化。
Demo实现
packagecom.okayqa.composer.performance.resource1_4
importcom.alibaba.fastjson.JSON
importcom.alibaba.fastjson.JSONObject
importjavascriptcom.funtester.base.bean.AbstractBean
importcom.funtester.base.constaint.ThreadLimitTimesCount
importcom.funtester.frame.execute.Concurrent
importcom.funtester.httpclient.ClientManage
importcom.funtester.utils.ArgsUtil
importcom.okaypythonqa.composer.base.OkayBase
importcom.okayqa.composer.function.Mirro
importcom.okayqa.composer.function.OKClass
classLogin_collect_uncollectextendsOkayBase{
publicstaticvoidmain(String[]args){
ClientManage.init(10,5,0,"",0)
defutil=newArgsUtil(args)
defthread=util.getIntOrdefault(0,30)
deftimes=util.getIntOrdefault(1,40)
deftasks=[]
thread.times{
tasks<<newFunTester(it,times)
}
newConcurrent(tasks,"资源库1.4登录>查询>收藏>取消收藏链路压测").start()
allOver()
}
privatestaticclassFunTesterextendsThreadLimitTimesCount<Integer>{
OkayBasebase
defmirro
defclazz
FunTester(Integerinteger,inttimes){
super(integer,times,null)
}
@Override
voidbefore(){
super.before()
base=getBase(t)
mirro=newMirro(base)
clazz=newOKClass(base)
}
@Override
protectedvoiddoing()throwsException{
defklist=mirro.getKList()</code><code>mirro.getKList()
defkarray=klist.getJSONArray("data")
Kks
karray.each{
JSONObjectparse=JSON.parse(JSON.toJSONString(it))
if(ks==null){
deflevel=parse.getIntValue("node_level")
deftype=parse.getIntValue("ktype")
defid=parse.getIntValue("id")
ks=newK(id,type,level)
}
}
JSONObjectresponse=clazz.recommend(ks.id,ks.type,ks.level)</code><code>clazz.recommend(ks.id,ks.type,ks.level)clazz.recommend(ks.id,ks.type,ks.level)
defminis=[]
inti=0
response.getJSONArray("data").each{
if(i++<2){
JSONObjectparse=JSON.parse(JSON.toJSONString(it))
intvalue=parse.getIntValue("minicourse_id")
minis<<value
}
}
clazz.unCollect(random(minis))
mirro.getMiniCourseListV3(ks.id,ks.type,0,ks.level)mirro.getMiniCourseListV3(ks.id,ks.type,0,ks.level)
}
}
privatestaticclassKextendsAbstractBean{
intid
inttype
intlevel
K(intid,inttype,intlevel){
this.id=id
this.type=type
this.level=level
}
}
}
其中AbstractBean类是一个抽象类,用于一些bean的方法封装,就是为了省事儿。
packagecom.funtester.base.bean
importcom.alibaba.fastjson.JSON
importcom.alibaba.fastjson.JPzCYzaTGSONObject
importcom.funtester.frame.Save
importcom.funtester.frame.SourceCode
importorg.slf4j.Logger
importorg.slf4j.LoggerFactory
importorg.springframework.beans.BeanUtils
/**
*bean的基类
*/
abstractclassAbstractBean{
staticfinalLoggerlogger=LoggerFactory.getLogger(AbstractBean.class)
/**
*将bean转化为json,为了进行数据处理和打印
*
*@return
*/
JSONObjecttoJson(){
JSONObject.parseobject(JSONObject.toJSONString(this))
}
/**
*文本形式保存
*/
defsave(){
Save.saveJson(this.toJson(),this.getClass().toString()+SourceCode.getMark());
}
/**
*控制台打印,使用WARN记录,以便查看
*/
defprint(){
logger.warn(this.getClass().toString()+":"+this.toString());
}
definitFrom(Stringstr){
JSONObject.parseObject(str,this.getClass())
}
definitFrom(Objectstr){
initFrom(JSON.toJSONString(str))
}
defcopyFrom(AbstractBeansource){
BeanUtils.copyProperties(source,this)
}
defcopyTo(AbstractBeantarget){
BeanUtils.copyProperties(this,target)
}
/**
*这里bean的属性必需是可以访问的,不然会返回空json串
*@return
*/
@Override
StringtoString(){
JSONObject.toJSONString(this)
}
@Override
protectedObjectclone(){
initFrom(this)
}
}
控制台输出
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
> {
> js① . "rt":1665,
> ① . "total":1188,
> ① . "qps":18.018,
> ① . "failRate":0.0,
> ① . "threads":30,
> ① . "startTime":"2021-02-24 16:57:23",
> ① . "endTime":"2021-02-24 16:58:34",
> ① . "errorRate":1.01,
> ① . "executeTotal":1188,
> ① . "mark":"资源库1.4登录>查询>收藏>取消收藏链路压测241657",
> ① . "table":"eJzj5VLAD15sbXm2a8LTXZMN9Uyez9z9dO9Uu2fzl75Yv8ju2ZRtL6b32z3tn/ZsWweE83Lyvhfb1z/t6362tZvT2EChJKMoNaWYgA0KvFy8+F0RlFpckJ9XnKoQkpmbaqVQoVucwpSZmKOQV5qro1Cpm5uakpmYR8gOQq5QyM3MU4AYZWVhYqmQW6yTm1hhZWxoaQxkE9RNjA2UgEfTOoBo1JZRW2hmRSSQ0ccmsBW0tgnVQzS1DatVtLMRn3W0sPXRtCYgAlLtQITXWura/mhaMxCRYC+VXUGyv2nhmkfTGoGI0rCgrsseTWsBImLSIZ1dCA8sOjmMXNfCU9ZAupNYV8MdC4106qdA2vkAniAGq6OJ8AlVi6GB99FgSvTU8BU8egaBg6jsO3iWHwSuoZUPB4EzRn046sNRHw68M0Z9OOrDEe5DABkr1eo="
> }
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~

以上就是python单链路性能测试实践的详细内容,更多关于python单链路性能测试的资料请关注我们其它相关文章!










