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}")
压力测试python脚本
最新推荐文章于 2025-03-30 17:37:07 发布