需求:
1.生成一个10位(时间戳)随机且不重复参数赋值给Json中的ApiOrderId中
2.设置每秒一个线程(运行时间和线程数可配置),调用:test-exord.flytc.com/api/OrderSploadOrder接口,并设置响应超时时间为90s
3.打印出每次请求中的响应状态码和响应报文中的OrderId字段
4.生成测试报告:测试报告中需要记录每次的请求时间、用例是否通过(响应报文中Remark = ”订单上传成功“为用例通过)、测试耗时、平均响应时间
5.如果用例不通过,测试报告中需要打印接口响应报文。
6.测试报告生成成功后,保存在项目中的reports目录下
代码
import requests
import threading
import time
from datetime import datetime
import os
import json
import copy
class OrderIdGenerator:
def __init__(self):
self.lock = threading.Lock()
def generate(self):
with self.lock:
# 使用时间戳生成唯一的 ApiOrderId,取后 10 位,前缀为 FT
timestamp = str(int(time.time() * 1000)) # 毫秒级时间戳
return f"FT{timestamp[-10:]}" # 取后 10 位并拼接 FT
class TestRunner:
def __init__(self, duration=60, threads_per_second=1, timeout=90):
self.duration = duration
self.threads_per_second = threads_per_second
self.timeout = timeout
self.order_id_gen = OrderIdGenerator()
self.results = []
self.results_lock = threading.Lock()
self.report_dir = "reports"
if not os.path.exists(self.report_dir):
os.makedirs(self.report_dir)
# 从模板JSON构造请求体
self.order_template = json.loads('''{
"UAccount": "75324",
"Password": "F1764642F0A8904CD72CCC40194ED254",
"Token": "93B4DD39-A98D-35D5-AFC6-78F7F09B99C8",
"OrderList": [
{
"CiId": "LK",
"PtId": "SLLK-CD",
"ReceiverName": "Makoto Matsubara",
"County": "Western",
"City": "Kelaniya",
"District": "Las Higueras",
"Zip": "11600",
"Address1": "Calle 9 sur #79c-199",
"Address2": "2-11-8-603 3",
"Phone": "703688488",
"Email": "196bed2261f781f44032@members.ebay.com",
"ApiOrderId": "LL_202556461",
"OnlineShopName": "测试小店",
"PackType": 3,
"SalesPlatformFlag": 0,
"SyncPlatformFlag": "scb.logistics.banggood",
"OrderDetailList": [
{
"ItemName": "Final Fantasy",
"Price": 27.98,
"Sku": "567854354645",
"Quantities": "27"
}
],
"HaikwanDetialList": [
{
"ItemEnName": "Christmas Trees1",
"ItemCnName": "圣诞树1",
"Quantities": "1",
"UnitPrice": 1.23,
"CCode": "USD",
"HwCode": "392690",
"Weight": 1.35
}
],
"OrderVolumeWeights": [
{
"WeighingWeight": 0.234
}
]
}
]
}''')
def construct_payload(self, api_order_id):
payload = copy.deepcopy(self.order_template)
payload['OrderList'][0]['ApiOrderId'] = api_order_id
return payload
def send_request(self):
api_order_id = self.order_id_gen.generate()
url = "http://test-exorderwebapi.flytcloud.com/api/OrderSyn/ErpUploadOrder"
payload = self.construct_payload(api_order_id)
start_time = datetime.now()
try:
response = requests.post(url, json=payload, timeout=self.timeout)
end_time = datetime.now()
elapsed_time = (end_time - start_time).total_seconds()
status_code = response.status_code
response_body = response.text # 记录完整的响应报文
try:
response_json = response.json()
order_id = response_json.get('OrderId', '') # 提取OrderId
remark = response_json.get('Remark', '')
is_success = remark == "订单上传成功"
except json.JSONDecodeError:
order_id = ''
remark = ''
is_success = False
except requests.exceptions.Timeout:
end_time = datetime.now()
elapsed_time = (end_time - start_time).total_seconds()
status_code = 'Timeout'
order_id = ''
is_success = False
response_body = 'Request timed out'
except Exception as e:
end_time = datetime.now()
elapsed_time = (end_time - start_time).total_seconds()
status_code = 'Error'
order_id = ''
is_success = False
response_body = str(e)
with self.results_lock:
self.results.append({
'request_time': start_time.strftime('%Y-%m-%d %H:%M:%S'),
'status_code': status_code,
'order_id': order_id,
'is_success': is_success,
'elapsed_time': elapsed_time,
'response_body': response_body # 记录完整的响应报文
})
print(f"Status Code: {status_code}, OrderId: {order_id}, Response Body: {response_body}")
def run_test(self):
start_time = time.time()
end_time = start_time + self.duration
threads = []
while time.time() < end_time:
for _ in range(self.threads_per_second):
thread = threading.Thread(target=self.send_request)
thread.start()
threads.append(thread)
time.sleep(1)
for thread in threads:
thread.join()
self.generate_report()
def generate_report(self):
report_path = os.path.join(
self.report_dir,
f"report_{datetime.now().strftime('%Y%m%d%H%M%S')}.log"
)
total_requests = len(self.results)
total_time = sum(result['elapsed_time'] for result in self.results)
average_response_time = total_time / total_requests if total_requests > 0 else 0
with open(report_path, 'w', encoding='utf-8') as logfile:
for result in self.results:
logfile.write(f"Request Time: {result['request_time']}\n")
logfile.write(f"Status Code: {result['status_code']}\n")
logfile.write(f"Order ID: {result['order_id']}\n")
logfile.write(f"Pass/Fail: {'Pass' if result['is_success'] else 'Fail'}\n")
logfile.write(f"Elapsed Time: {result['elapsed_time']:.2f}s\n")
logfile.write(f"Response Body: {result['response_body']}\n")
logfile.write("-" * 50 + "\n") # 分隔线
logfile.write(f"Total Requests: {total_requests}\n")
logfile.write(f"Average Response Time: {average_response_time:.2f}s\n")
print(f"Report generated: {report_path}")
print(f"Total Requests: {total_requests}")
print(f"Average Response Time: {average_response_time:.2f}s")
if __name__ == "__main__":
runner = TestRunner(duration=1, threads_per_second=1, timeout=90)
runner.run_test()
运行结果
D:\PYTHON-学习\邮政接口压力测试脚本\pythonProject1\.venv\Scripts\python.exe D:\PYTHON-学习\邮政接口压力测试脚本\pythonProject1\test_73553\73553下单逻辑.py
Status Code: 200, OrderId: , Response Body: {"Success":true,"ErrorCode":null,"Remark":"订单上传成功","ErpSuccessOrders":[{"OrderId":"F753242503120001","TraceId":null,"ApiOrderId":"FT1747448297","Remark":"订单提交成功,该渠道为非即时返回跟踪号,请稍后再获取","Premium":0.0,"ExtendData1":null,"ExtendData2":null,"ExtendData3":null,"ExtendData4":null,"ExtendData5":null}],"ErpFailOrders":[]}
Report generated: reports\report_20250312104410.log
Total Requests: 1
Average Response Time: 2.11s
进程已结束,退出代码为 0