因为locust更新了一版,之前的代码不是警告就是报错,很烦,然后各种找资料没找到,最后根据官方文档重新写了一个,希望对大家有帮助
需求:测试查看红包和抢红包的接口,难点是需要传用户的token和红包的id,解决办法是读取excel的值再处理存入栈中。
# encoding: utf-8
# @author: 山东少年先锋队
# @email: 1253039341@qq.com
# @time: 2020/6/28 16:26
import random
import subprocess
import json
from queue import Queue
from locust import HttpUser, task, between
from openpyxl import load_workbook
class ForumSection(HttpUser):
wait_time = between(0, 2) # 模拟用户在执行每个任务后等待0到2秒
ws = load_workbook("token.xlsx")['Sheet1'] #在相同文件夹下存放了token.xlsx文件,表名是Sheet1
first_column = ws['A'] # 读取excel的第一列
token_red = Queue(maxsize=0) # 先进先出,<1 是长度不限
start_num = 255
stop_num = 334
live_id = '17812'
for i in range(start_num, stop_num): # 取后台红包id,因为新建的红包时连续的
for x in range(len(first_column)):
data = [i, first_column[x].value]
token_red.put_nowait(data) # 产生数据(列表)红包id+token
@task(2) # 这个请求的数量是下面的两倍
# 这个是get请求
def red_detail(self):
item_id = random.randint(self.start_num, self.stop_num)
header = {
"cq-token": "{0}".format(token_1), # token
"orgid": "29", # 组织
}
with self.client.get(f"/v1/app/reddetail?red_id={item_id }", catch_response=True,
headers=header) as response:
if response.status_code == 200:
print("查看id是" + str(item_id ) + '的红包成功')
else:
assert response.status_code == 200
@task(1)
# 这个是post请求
def red_start(self):
token_1, red_1 = None, None
try:
data_one = self.token_red.get() # 消费数据
token_1 = data_one[1]
red_1 = data_one[0]
except self.token_red.empty(): # //队列取空后,直接退出
print('no data exist')
exit(0)
header = {
"Content-Type": "application/x-www-form-urlencoded",
"cq-token": "{0}".format(token_1), # token
"oid": "29", # 组织
}
body = {"live_id": self.live_id, # 直播id
"red_id": "{0}".format(red_1), # 红包id
}
print('token:' + str(token_1) + ' 红包id:' + str(red_1))
with self.client.post("/v1/app/grab", data=body, headers=header) as response:
try:
res = json.loads(response.text)
if response.status_code == 200:
if str(res['code']) == '1':
print('抢到了' + str(int(res['data']) / 100) + '元')
elif str(res['code']) == '0' and res['data'] == '红包已抢完':
print('红包已抢完')
else:
print('错误信息:' + res['data'])
else:
assert response.status_code == 200
except:
print('返回数据格式错误:' + response.text)
if __name__ == "__main__":
subprocess.Popen("locust -f hong.py", shell=True)