使用python完成接口压测

工作过程中,有些接口需要进行压力测试。python可以借助爬虫来对 接口进行压力测试。详情请看下方代码。(通过多线程方式进行模拟接口访问。爬虫中添加了重试功能)

import time
import json
import requests
import threading


class PressTest(object):
    """
    并发压力测试
    """

    def __init__(self, test_url):
        self.test_url = test_url

    def test_interface(self):
        """压测接口"""
        global INDEX
        INDEX += 1

        global ERROR_NUM
        global TIME_LENS
        try:
            start = time.time()
            payload = json.dumps(data)
            response_content = self.do_request(self.test_url, payload)
            print(response_content)
            end = time.time()
            TIME_LENS.append(end - start)
            print('=======end=======')
        except Exception as e:
            ERROR_NUM += 1
            print(e)

    def test_one_work(self):
        """一次并发处理单个任务"""
        i = 0
        while i < ONE_WORKER_NUM:
            i += 1
            self.test_interface()
        time.sleep(LOOP_SLEEP)

    def do_request(self, url, payload):
        """通用http获取接口请求结果方法"""

        headers = {
            'Content-Type': 'application/json; charset=UTF-8'
            
        }
        response = requests.post(url=url, data=payload, headers=headers)
        retry_num = 0
        while retry_num < 3:
            response = requests.post(url=url, data=payload, headers=headers, timeout=3000)
            if not response or response.status_code == -1:
                time.sleep(1)
                retry_num = retry_num + 1
                continue
            else:
                break
        response_content = response.json()
        return response_content

    def run(self):
        """使用多线程进程并发测试"""
        t1 = time.time()
        Threads = []

        for i in range(THREAD_NUM):
            t = threading.Thread(target=self.test_one_work, name="T" + str(i))
            t.setDaemon(True)
            Threads.append(t)

        for t in Threads:
            t.start()
        for t in Threads:
            t.join()
        t2 = time.time()

        print("===============压测结果===================")
        print("URL:", self.test_url)
        print("任务数量:", THREAD_NUM, "*", ONE_WORKER_NUM, "=", THREAD_NUM * ONE_WORKER_NUM)
        print("总耗时(秒):", t2 - t1)
        print("每次请求耗时(秒):", (t2 - t1) / (THREAD_NUM * ONE_WORKER_NUM))
        print("每秒承载请求数:", 1 / ((t2 - t1) / (THREAD_NUM * ONE_WORKER_NUM)))
        print("错误数量:", ERROR_NUM)
        print("请求次数", INDEX)

你可能感兴趣的:(基础,python,开发语言)