综合近来相关接口和性能相关的测试工作,今天突发“奇想”,总结出一套自己适用的性能测试套路。草草记录想法如下:
性能测试=接口+多线程+服务器监控 +java熟悉(问题定位)
当然以上目前已python脚本为主要工具。
所需要的辅助技术如下:
接口测试: 接口调用 python 、postman、jmeter、 接口分析:fiddler,chrome
多线程: 并发 锁
服务监控:linux资源 top命令 dstat命令 jmeter。 内存、磁盘、网络、cpu、gpu
java:gc 服务进程分析
接口模拟配合并发 完成压测环境的模拟和结果的获取分析。资源监控的了解可对服务是否正常是否存在异常瓶颈进行参看。因为目前大部分web项目使用java,所以了解gc和服务异常分析等对于定位问题很关键。
从目前个人使用来看还比较顺手。当然服务器监控和java方面还未进行过多的尝试。尤其java放下很久了…
这里python使用requests包进行接口模拟,需要对http请求相关header参数和尤其是Content-type类型进行了解。多线程threading中的锁和阻塞。接下来给个简单的接口模拟和多线程调用
脚本如下:
接口模拟:
#coding=utf-8
import requests
import time
import struct
import json
cookie ="JSESSIONID=6B2CECAE8A6182A2496E1C23C630FC35"
##上传单个文档进行翻译
def upfile_trans():
header = {
# "Content-type":"multipart/form-data; boundary=----WebKitFormBoundaryDiCQum0CmBUJMRZk",
"Cookie": cookie
}
####初始化一个任务 获取任务id 和批id
init_host="http://ip/zy/transTask/initTask"
init_body ={
"type":1
}
init_req= requests.get(url=init_host,data=init_body,headers=header)
print (init_req.text)
j_init_req_res = json.loads(init_req.text)
print (j_init_req_res)
task_id = j_init_req_res["data"]["taskId"]
batch_id = j_init_req_res["data"]["batchId"]
task_name = j_init_req_res["data"]["taskName"]
print (task_id,batch_id)
####上传文件
host = "http://ip/zy//transFile/uploadTransFile"
fbin = open("D:\英文文章.docx","rb")
files={"file":('英文文章.docx',fbin,'application/vnd.openxmlformats-officedocument.wordprocessingml.document,{}')}
body ={
"taskId":task_id,
"batchId":batch_id,
}
upfile_req_res = requests.post(url=host,data=body,headers=header,files=files)
print (upfile_req_res.text)
ids = json.loads(upfile_req_res.text)["data"]
time.sleep(5)
#####任务保存提交
sub_host="http://ip/zy/transTask/submitTransTask"
sub_body={
"language":"",
"taskId":task_id,
"batchId":batch_id,
"ids":ids,
"taskName":task_name,
"toLanguage":"cn",
"type":1
}
submit_req= requests.post(url=sub_host,data=sub_body,headers=header)
print (submit_req.text)
####获取任务翻译状态
task_status_host = "http://ip/zy/transFile/getTransFileList"
status_body ={
"fileName":"",
"pageNum":1,
"pageSize":10,
"taskId":task_id,
"language":"",
"fileStatus":""
}
status_req= requests.get(url=task_status_host,headers=header,params=status_body)
print (status_req.text)
####方法 在已经创建好的任务中 继续上传文件 并提交任务
def task_add_file(task_id,batch_id,task_name):
header = {
# "Content-type":"multipart/form-data; boundary=----WebKitFormBoundaryDiCQum0CmBUJMRZk",
"Cookie": cookie
}
##上传文件
host = "http://ip/zy//transFile/uploadTransFile"
fbin_1 = open("D:\\China Int\'l big data expo opens.docx", "rb")
files_2 = {"file": ('China Int\'l big data expo opens.docx', fbin_1,'application/vnd.openxmlformats-officedocument.wordprocessingml.document,{}')}
body = {
"taskId": task_id,
"batchId": batch_id,
}
upfile_req_res_1 = requests.post(url=host, data=body, headers=header, files=files_2)
print("上传文件结果",upfile_req_res_1.text)
ids_1 = json.loads(upfile_req_res_1.text)["data"]
###追加任务保存
add_host = "http://ip/zy/transTask/addTaskFile"
add_body_1 = {
"language": "",
"taskId": task_id,
"batchId": batch_id,
"ids": ids_1,
"taskName": task_name,
"toLanguage": "cn",
}
submit_req_1 = requests.post(url=add_host, data=add_body_1, headers=header)
print("追加文档任务提交结果", submit_req_1.text)
####获取任务翻译状态
task_status_host = "http://ip/zy/transFile/getTransFileList"
status_body = {
"fileName":" ",
"pageNum":1,
"pageSize":10,
"taskId":task_id,
"language":" ",
"fileStatus":" "
}
print ("消息为",status_body)
status_req = requests.get(url=task_status_host,params=status_body,headers=header)
print ("任务状态为",status_req.text)
# for i in range(10):
# upfile_trans()
#upfile_trans()
# for i in range(1):
# task_add_file("540e56d288254aac8462ee96dff54318","694930276698030080","文本翻译 14:30:59")
#upfile_trans()
线程调用如下:
#coding=utf-8
import threading
import time
import json
from ztxt import req_file_trans
class myThread(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self):
req_file_trans.upfile_trans()
thread_list =[]
#启动10个线程进行调用
for i in range(10):
thread_real = myThread()
thread_list.append(thread_real)
thread_list[i].start()
#print (len(thread_list))
这里还不涉及线程锁这块的内容(后续补充)。