压力测试python脚本

import concurrent.futures  
import requests  
import time  
from statistics import mean, median_low, median_high  
from sortedcontainers import SortedList  
  
def make_request(url, semaphore, results):  
    with semaphore:  
        start_time = time.time()  
        try:  
            response = requests.get(url)  
            response.raise_for_status()  # 如果请求失败,会抛出HTTPError异常  
            success = True  
            elapsed_time = time.time() - start_time  
        except requests.RequestException as e:  
            success = False  
            elapsed_time = time.time() - start_time  
            print(f"Request to {url} failed: {e}")  
        results.append((elapsed_time, success))  
  
def stress_test(url, num_requests, concurrent_users):  
    results = []  
    semaphore = concurrent.futures.Semaphore(concurrent_users)  # 限制并发数  
    with concurrent.futures.ThreadPoolExecutor(max_workers=concurrent_users) as executor:  
        futures = [executor.submit(make_request, url, semaphore, results) for _ in range(num_requests)]  
        concurrent.futures.wait(futures)  
      
    # 排序和计算统计数据  
    results.sort(key=lambda x: x[0])  # 按耗时排序  
    times = [r[0] for r in results]  
    successes = [r[1] for r in results]  
      
    total_requests = len(results)  
    tps = total_requests / (max(times) - min(times)) if times else 0  
    error_rate = 1 - (sum(successes) / total_requests)  
    p90 = times[int(0.9 * len(times))] if len(times) >= 10 else None  
    p95 = times[int(0.95 * len(times))] if len(times) >= 20 else None  
    p99 = times[int(0.99 * len(times))] if len(times) >= 100 else None  
    max_time = max(times) if times else None  
    min_time = min(times) if times else None  
    avg_time = mean(times) if times else None  
      
    return {  
        "total_requests": total_requests,  
        "tps": tps,  
        "error_rate": error_rate,  
        "p90": p90,  
        "p95": p95,  
        "p99": p99,  
        "max_time": max_time,  
        "min_time": min_time,  
        "avg_time": avg_time,  
    }  
  
if __name__ == "__main__":  
    url = "http://example.com"  # 替换为你想要测试的URL  
    num_requests = 1000  # 总共的请求数量  
    concurrent_users = 100  # 模拟的并发用户数  
  
    start_time = time.time()  
    stats = stress_test(url, num_requests, concurrent_users)  
    end_time = time.time()  
  
    print(f"Stress test completed in {end_time - start_time:.2f} seconds")  
    for key, value in stats.items():  
        print(f"{key}: {value}")
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值