性能测试-locust
一个简单的示例
业务场景:转账(transfer),退款(return_money),收款(recv_money)三个接口。
退款和收款都要用到转账的返回值,使用USER_CREDENTIALS存储转账的返回值,退款和收款可以从这个参数取值。
import json
import random
import requests
from locust import HttpUser, task, between
from urllib3.exceptions import InsecureRequestWarning
USER_LIST = [900000000,900000001,...] # 转账账户
USER_CREDENTIALS=[]
headers = {
'Content-Type': 'application/octet-stream'
} # 请求头
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
class Demo(HttpUser):
wait_time = between(2, 5) # 模拟用户等待2到5s然后执行
host = "xxxx" # 此处写你项目的地址
@task(2)
def transfer(self):
headers.pop('UserId', None)
url = "xxxx" # 此处写你接口的地址
two_user = random.sample(USER_LIST, 2)
payload = {
"from_uid": str(two_user[0]),
"to_uid": str(two_user[1]),
"currency_type": "0",
"amount": "100",
"password": "123321",
"remark": "测试"
}
json_string = json.dumps(payload)
binary_data = json_string.encode('utf-8')
print(f'【{two_user[0]}】向【{two_user[1]}】转账')
with self.client.post(url=url, data=binary_data, headers=headers, verify=False, catch_response=True) as response:
if response.status_code == 200 and response.json()['code'] == 200:
response.success()
else:
print(response.text)
print('转账的返回结果:else:', response.json())
response.failure("Non-200 status code")
print('转账的返回结果:',response.json())
serial_number = response.json()['data']['serial_number']
USER_CREDENTIALS.append((two_user[1],serial_number))
print(USER_CREDENTIALS)
print(response.status_code, response.text[:1000]) # 打印状态码及返回text
@task()
def return_money(self):
url = "xxxx" # 此处写你接口的地址
if len(USER_CREDENTIALS) > 0:
UserId, serial_number = USER_CREDENTIALS.pop()
headers['UserId'] = str(UserId)
payload = {"serial_number": serial_number}
json_string = json.dumps(payload)
binary_data = json_string.encode('utf-8')
with self.client.post(url, binary_data, headers=headers,verify=False,
catch_response=True) as response:
if response.status_code == 200 and response.json()['code'] == 200:
response.success()
else:
print('--------------------------退款有问题的订单号:', serial_number)
response.failure("Non-200 status code")
assert response.status_code == 200 # 断言请求返回200
print(response.text)
# 断言返回的 code 是否等于预期值
# assert data['code'] == 200
print(response.status_code, response.text[:1000]) # 打印状态码及返回text
print(f'【{UserId}】操作退款')
@task()
def recv_money(self):
url = "xxxx" # 此处写你接口的地址
if len(USER_CREDENTIALS) > 0:
UserId, serial_number = USER_CREDENTIALS.pop(0)
headers['UserId'] = str(UserId)
payload = {"serial_number": serial_number}
json_string = json.dumps(payload)
binary_data = json_string.encode('utf-8')
with self.client.post(url, binary_data, headers=headers,verify=False,
catch_response=True) as response:
if response.status_code == 200 and response.json()['code'] == 200:
response.success()
else:
print('--------------------------收款有问题的订单号:',serial_number)
response.failure("Non-200 status code")
assert response.status_code == 200 # 断言请求返回200
print(response.text)
print(response.status_code, response.text[:1000]) # 打印状态码及返回text
print(f'【{UserId}】操作收款')
运行:命令行输入locust -f xxx.py