版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
python脚本测试——接⼝⾼并发场景⼀、环境准备。1、下载安装python2,安装教程请⾃⾏百度3、IDEA在file–settings–Plugins中安装Python⼆、复⽤需要修改的地⽅:1、url路径2、token信息3、连接数据库的信息4、sql语句5、请求⽅式:get、post、delete、put6、⽤户username的特殊性规则7、并发线程数:concurrent_thread_count8、请求数据在RequestBody中还是在RequestParam中三、添加学⽣。1、设计思路设置线程数,作为循环次数,特殊值+i作为学号,性别取1、2的随机数2、实现代码如下
#并发测试框架//添加学⽣importpymysqlimportrequests,threadingimportrandom#接⼝路径和tokendata={"url":"http://。。。/base/add","header":{"X-Access-Token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9."},}#并发线程数concurrent_thread_count=1000#每个线程中循环测试接⼝的次数ONE_WORKER_NUM=1#测试代码deftest(username):random.randint(1,2)#获取试题接⼝#参数在请求体中时,使⽤bodysbodys={#请求体参数"num":username,"name":"随删数据","gender":random.randint(1,2)}print(bodys)response=requests.post(data["url"],json=bodys,headers=data["header"])#response=requests.get(data["url"]+'?userId='+resultSql[0],headers=data["header"])ifresponse.status_code==200:result=response.content.decode('utf-8')else:result="访问失败"print(threading.current_thread(),result)#单个线程,可以设置⼀个线程访问⼏次接⼝defworking(username):globalONE_WORKER_NUMforiinrange(0,ONE_WORKER_NUM):test(username)deft():Threads=[]#根据数据的数量当作循环次数,每次创建⼀个线程foriinrange(concurrent_thread_count):username=111111000+it=threading.Thread(target=working,args=(username,))t.setDaemon(True)Threads.append(t)fortinThreads:t.start()fortinThreads:t.join()if__name__=="__main__":t()四、获取试题。1、设计思路如下1、第⼀步:先执⾏查询数据库操作,查询出来⼀共有多少条符合条件的数据;数据总数作为循环的次数,每次循环起⼀个线程,线程中带有参数username,根据添加⽤户时账号的规律设置username=“”"’%s’"""%(111111000+i)当作参数传递2、第⼆步:每个线程中可以设置循环次数,每次调⽤具体⽅法3、第三步:测试代码部分,根据传递的username作为条件查询⽤户id;获取到⽤户id后当作参数去访问接⼝,打印返回值2、实现代码如下(使⽤多个不同的⽤户id做参数)#并发测试框架importpymysqlimportrequests,threading#接⼝路径和tokendata={"url":"http://。。。/mobile/getAll","header":{"X-Access-Token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9"},}#每个线程中循环测试接⼝的次数ONE_WORKER_NUM=1#测试代码deftest(username):#根据username查询idconn=pymysql.connect(host="192.168...",port=3306,user="root",passwd="...",db="jeecg")cur=conn.cursor()sql="SELECTidFROMuserWHEREusername="+username#print(sql)cur.execute(sql)resultSql=cur.fetchone()#获取试题接⼝#参数在请求体中时,使⽤bodys#bodys={##请求体参数#"userId":resultSql[0]#}#response=requests.get(data["url"]+'?userId='+resultSql[0],json=bodys,headers=data["header"])print(data["url"]+'?userId='+resultSql[0])response=requests.get(data["url"]+'?userId='+resultSql[0],headers=data["header"])ifresponse.status_code==200:result=response.content.decode('utf-8')else:result="访问失败"print(threading.current_thread(),result)#单个线程,可以设置⼀个线程访问⼏次接⼝defworking(username):globalONE_WORKER_NUMforiinrange(0,ONE_WORKER_NUM):test(username)deft():#查询符合条件的数据总数conn=pymysql.connect(host="192.168...",port=3306,user="root",passwd="...",db="jeecg")cur=conn.cursor()sql="SELECTCOUNT(*)FROMuserWHEREusernameLIKE'11111%'"sql="SELECTCOUNT(*)FROMuserWHEREusernameLIKE'11111%'"#打印SQL#print(sql)cur.execute(sql)result=cur.fetchone()#打印循环次数print(result[0])Threads=[]#根据数据的数量当作循环次数,每次创建⼀个线程foriinrange(result[0]):username="""'%s'"""%(111111000+i)t=threading.Thread(target=working,args=(username,))#使⽤setDaemon()和守护线程这⽅⾯知识有关,⽐如在启动线程前设置thread.setDaemon(True),就是设置该线程为守护线程,#表⽰该线程是不重要的进,程退出时不需要等待这个线程执⾏完成。#这样做的意义在于:避免⼦线程⽆限死循环,导致退不出程序,也就是避免楼上说的孤⼉进程。##thread.setDaemon()设置为True,则设为true的话则主线程执⾏完毕后会将⼦线程回收掉,#设置为false,主进程执⾏结束时不会回收⼦线程#setDaemon()说明:#setDaemon():设置此线程是否被主线程守护回收。默认False不回收,需要在start⽅法前调⽤;#设为True相当于像主线程中注册守护,主线程结束时会将其⼀并回收。t.setDaemon(True)#python中的append()⽅法⽤于在列表末尾添加新的对象。Threads.append(t)fortinThreads:#开始线程活动。#对每⼀个线程对象来说它只能被调⽤⼀次,它安排对象在⼀个另外的单独线程中调⽤run()⽅法(⽽⾮当前所处线程)。#当该⽅法在同⼀个线程对象中被调⽤超过⼀次时,会引RuntimeError(⼊运⾏时错误)。t.start()fortinThreads:t.join()if__name__=="__main__":t()五、删除学⽣。1、设计思路1、先查询数据库中有多少个需要删除的数据,作为循环次数,特殊值+i作为学号传到创建的线程⾥⾯2、再根据学号查学⽣的id,查到id后去请求删除接⼝2、代码实现如下#并发测试框架//删除学⽣importpymysqlimportrequests,threading#接⼝路径和tokendata={"url":"http://。。。/base/delete","header":{"X-Access-Token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9"},}#每个线程中循环测试接⼝的次数ONE_WORKER_NUM=1#测试代码deftest(username):#根据username查询idconn=pymysql.connect(host="。。。",port=3306,user="root",user="root",passwd="。。。",db="jeecg")cur=conn.cursor()sql="SELECTidFROMmes_stuWHEREnum="+username#print(sql)cur.execute(sql)resultSql=cur.fetchone()#获取试题接⼝#参数在请求体中时,使⽤bodys#bodys={##请求体参数#"userId":resultSql[0]#}#response=requests.get(data["url"]+'?userId='+resultSql[0],json=bodys,headers=data["header"])print(data["url"]+'?userId='+resultSql[0])response=requests.delete(data["url"]+'?id='+resultSql[0],headers=data["header"])ifresponse.status_code==200:result=response.content.decode('utf-8')else:result="访问失败"print(threading.current_thread(),result)#单个线程,可以设置⼀个线程访问⼏次接⼝defworking(username):globalONE_WORKER_NUMforiinrange(0,ONE_WORKER_NUM):test(username)deft():#查询符合条件的数据总数conn=pymysql.connect(host="。。。",port=3306,user="root",passwd="。。。",db="jeecg")cur=conn.cursor()sql="SELECTCOUNT(*)FROMmes_stuWHEREnumLIKE'11111%'"#打印SQL#print(sql)cur.execute(sql)result=cur.fetchone()#打印循环次数print(result[0])Threads=[]foriinrange(result[0]):#根据学号规律拼接username="""'%s'"""%(111111000+i)t=threading.Thread(target=working,args=(username,))t.setDaemon(True)Threads.append(t)fortinThreads:t.start()fortinThreads:t.join()if__name__=="__main__":t()六、直接并发(参数需要⾃⼰写)importrequestsfrommultiprocessingimportPooldata={"times":10,#并发量"method":"GET","url":"http://。。。/list","header":{#"X-Access-Token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9"},"body":{#参数}}defrun_task(idx):response=requests.get(data["url"],json=data["body"],headers=data["header"])ifresponse.status_code==200:result=response.content.decode('utf-8')else:result="访问失败"print("第%s次执⾏:%s\n"%(idx,result))if__name__=='__main__':p=Pool(data["times"])forindexinrange(data["times"]):p.apply_async(run_task,args=(index+1,))p.close()p.join()print("执⾏结束.")七、多个线程并⾏,每个线程内串⾏执⾏多次(可⼀次),参数需要⾃⼰写importthreadingimporttimeimportrequests#这段脚本是本机执⾏,请求QA100个线程并⾏,每个线程内串⾏执⾏100次,⼀共1W次接⼝调⽤环境,data={"url":"http://。。。/list","header":{#"X-Access-Token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9"},"body":{#参数}}#concurrentrequestnumberconcurrent_thread_count=5#loopineverythreaditerate_count=1classRequestThread(threading.Thread):def__init__(self,thread_name):threading.Thread.__init__(self)self.test_success_count=0self.test_fail_count=0defrun(self):i=0i=0whilei<iterate_count:self.test()i+=1deftest(self):try:conn=requests.get(data["url"],json=data["body"],
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年弋江区招聘警民联调室专职人民调解员备考题库完整答案详解
- 2026年上海益诺思生物技术股份有限公司招聘备考题库含答案详解
- 2026年宁夏贺兰工业园区管委会工作人员社会化公开招聘备考题库参考答案详解
- 2026年广西大学新校区建设项目招聘劳务派遣制工作人员备考题库及一套参考答案详解
- 2026年中车兰州机车有限公司招聘备考题库及答案详解参考
- 2026年农业农村部耕地质量和农田工程监督保护中心度面向社会公开招聘工作人员12人备考题库完整参考答案详解
- 2026年中国电子工程设计院股份有限公司河南分公司招聘备考题库及完整答案详解1套
- 2026年安徽皖信人力资源管理有限公司公开招聘电力工程设计技术人员5人备考题库(马鞍山)及一套答案详解
- 2026年广东省乐昌市校园公开招聘专任教师89人备考题库及答案详解1套
- 2026年中孚实业秋季招聘备考题库及1套参考答案详解
- 团队成员介绍课件
- 规划展馆改造项目方案(3篇)
- 玉米dh育种技术
- 头孢曲松钠过敏的观察与急救
- 幼儿园后勤人员培训会议记录2025
- 广告材料供货方案(3篇)
- 四上语文《快乐读书吧》作品导读《世界经典神话与传说》
- 母婴护理员职业道德课件
- 混合痔术后大出血的护理
- 咯血诊治专家共识解读
- 废旧锂电池拆解、破碎及梯次利用项目可行性研究报告模板-立项拿地
评论
0/150
提交评论