单个接口压力测试代码——线程数和运行时间可配置

需求:

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

报告截图

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值