tps_util.py 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import concurrent.futures
  2. import requests
  3. import time
  4. import statistics
  5. def call_api(url, method, params, json, print_res):
  6. start = time.time()
  7. response = requests.request(method, url, params=params, json=json)
  8. if print_res:
  9. print(response.json())
  10. end = time.time()
  11. return (end - start) * 1000, response.status_code, len(response.content)
  12. def test_api_tps(url, method, params=None, json=None, concurrency=1, duration=1, print_res=False):
  13. """
  14. 测试 API 的 TPS 等并发数据
  15. :param url: url示例:baidu.com
  16. :param method: 请求方式: get/post
  17. :param params: url参数:{"id":1}
  18. :param json: jsonBody参数:{"id":1}
  19. :param concurrency: 并发数
  20. :param duration: 持续时间 秒
  21. :param print_res: 是否打印api的返回值
  22. :return:
  23. """
  24. successes = 0
  25. failures = 0
  26. times = []
  27. data_lengths = []
  28. with concurrent.futures.ThreadPoolExecutor(max_workers=concurrency) as executor:
  29. start = time.time()
  30. futures = [executor.submit(call_api, url, method, params, json, print_res) for i in range(concurrency)]
  31. while time.time() - start < duration:
  32. completed, futures = concurrent.futures.wait(futures, timeout=0)
  33. for future in completed:
  34. elapsed, status, length = future.result()
  35. times.append(elapsed)
  36. data_lengths.append(length)
  37. if status == 200:
  38. successes += 1
  39. else:
  40. failures += 1
  41. futures.add(executor.submit(call_api, url, method, params, json, print_res))
  42. # Wait for the remaining futures to complete
  43. if futures:
  44. completed, _ = concurrent.futures.wait(futures)
  45. for future in completed:
  46. elapsed, status, length = future.result()
  47. times.append(elapsed)
  48. data_lengths.append(length)
  49. if status == 200:
  50. successes += 1
  51. else:
  52. failures += 1
  53. total = successes + failures
  54. tps = total / duration
  55. mean = statistics.mean(times)
  56. min_time = min(times)
  57. max_time = max(times)
  58. print(f'TPS:{tps}; ', end=' ')
  59. print(f'平均时间(ms): {mean:.0f}; ', end=' ')
  60. print(f'最小时间(ms): {min_time:.0f}; ', end=' ')
  61. print(f'最大时间(ms): {max_time:.0f}; ', end=' ')
  62. print(f'成功数: {successes}; ', end=' ')
  63. print(f'失败数: {failures}; ', end=' ')
  64. print(f'总数据长度: {sum(data_lengths)}; ', end=' ')
  65. if __name__ == '__main__':
  66. test_api_tps('https://httpbin.tianyunperfect.cn/get', 'get', params={"a": 1}, duration=2)