关注我,每天分享软件测试技术干货,面试经验,想要领取测试资料,进入软件测试交流群的可以直接私信我哦~~
一、测试场景压测“用户登陆”的场景,在用户登陆后,会调用大量的接口,以便测试该场景的负载
方案1。直接使用Jmeter接口压测,但Jmeter在一个线程中的调用多个接口是同步的,故压测出来的结果不准确。
方案2。Jmeter用多个线程组压测,但这种方案压测出来是并行的,并不符合场景,因为浏览器虽然是初始化调用,但本质上也是一个线程执行。
三、最终方案Jmeter结合Python3.x的asyncio和aiohttp结合。
因为Python的asyncio可模拟浏览器的初始化调用方式
四、用例设计1步[User]:使用CSV数据配置读取用户名和密码
2步[加密密码]:使用BeanShell调用加密的JAR为密码加密
3步[登录临床页面]:登陆系统
4步[登录设计]:选择登陆类别
Jmeter部分
使用到的组件:事务控制器,HttpSampler,BeanShell采样器,响应断言
交易控制器
有两部分组成
- HttpSampler
这部分用户名和密码登录校验接口
- BeanShell采样器
说明:为什么使用BeanShell Sampler而不是JSR,因为JSR不支持Python 3.x
关键代码说明:
1:预设Python的参数
#访问的服务器地址
字符串主机=“ 200.200.101.97”;
#执行的Python文件
字符串pyPath =“ D:\\ sites \\ eClinical4.0_testing \\ PT \\ py_script \\ asyncio_http.py”;
#需要异步初始化的接口,配置在一个json文件中
字符串apis =“ D:\\ sites \\ eClinical4.0_testing \\ PT \\ py_script \\ admin_login_api.json”;
2:启动Python过程
8-10行
3:等待Python进度返回,并把结果保存在变量” $ {name} _admin_login”中
11-23行
回应断言
通过字符串判断Python的返回,如果所有接口返回正常,则变量” $ {name} _admin_login”包含API OK
Python部分
1.使用的库
导入json
导入aiohttp
导入系统
导入异步
2.根据需要访问的接口,生成初始任务,并调用
异步定义async_run(host,apis,headers):
结果= []
协程= []
对于apis.values()中的信息:
如果info.get(“ method”)==“ GET”:
coroutines.append(asyncio.create_task(get(“ {0} / {1}”。format(host,info.get(“ url”)),headers,info.get(“ params”),results))))
elif info.get(“ method”)==“ POST”:
coroutines.append(asyncio.create_task(post(“ {0} / {1}”。format(host,info.get(“ url”)),headers,info.get(“ params”),results))))
其他:通过
等待asyncio.gather(*协程)
退回结果:
如果type(ret)==例外:引发ret
最后2行,如果返回的Exception,则引发异常
3.封装Post,Get请求,大同小异,故只贴出Get请求
异步def get(url,headers,params,results):
与aiohttp.ClientSession()作为会话异步:
与session.get(url,headers = headers,json = params)异步为rsp:
r =等待rsp.text()
ret = json.loads(r)
如果ret.get(“ procCode”)!= 200:
e = Exception()
e.args =(“ {0} {1}”。format(ret.get(“ procCode”),url),ret.get(“ exception”))
results.append(e)
别的:
results.append(ret)
如果接口返回不正正确!= 200,则生成一个异常实例,保存在结果中,如果返回正常,则将返回结果直接保存在结果中
4.主要函数
host =“ http:// {0}” .format(sys.argv [1])
授权= sys.argv [2]
apis_path = sys.argv [3]
与open(apis_path,“ r”)为f:
apis = json.load(f)
标头= {
“授权”:授权,
“ Accept”:“ application / json,text / plain,* / *”,
“ Content-Type”:“ application / json”
}
尝试:
asyncio.run(async_run(host,apis,headers))
打印(json.dumps(dict(procCode =“ API OK”)))
例外,例如e:
如果len(e.args)== 1:print(json.dumps(dict(procCode = e.args [0])))
其他:print(json.dumps(dict(procCode = e.args [0],exception = e.args [1])))
根据jmeter的参数来配置执行参数和读取json文件
如果无错误,则通过print输出到jmeter
如果有错误,错误参数有1个,为网络错误,通过print输出
错误参数有2个,为接口返回,通过print输出
最后:软件测试资料分享一波!技术行业,一定要提升技术功底,丰富自动化项目实战经验,这对于你未来几年职业规划,以及测试技术掌握的深度非常有帮助。
金九银十面试季,跳槽季,整理面试题已经成了我多年的习惯!下面有我近几年的收集和整理,整体是围绕着【软件测试】来进行整理的,主体内容包含:python自动化测试专属视频、Python自动化详细资料、全套面试题等知识内容。
愿你我相遇,皆有所获! 如果对软件测试、接口测试、自动化测试、面试经验交流。关注微信公众号:【伤心的辣条】 免费领取一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!交流学习裙:313782132
推荐好文:包装成1年工作经验的测试工程师,我给他的面试前的建议如下
自动化测试到底要学什么?
为何跳槽不考虑腾讯?聊聊我和鹅厂的一点往事
自动化测试和手动测试哪个更高级?
新手必看:怎么写一个合格的测试用例?
python登录接口测试问题记录与解决 ( 干 货 )