最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用python和asyncio打造接口并發(fā)測試GUI工具

 更新時間:2025年04月25日 08:39:15   作者:Python測試之道  
接口并發(fā)測試是測試工程師日常工作中的重要一環(huán),而一個直觀的 GUI 工具能有效提升工作效率和體驗,下面我們就來看看如何通過 PyQt5 和 asyncio打造一個這樣的工具吧

前言

接口并發(fā)測試是測試工程師日常工作中的重要一環(huán),而一個直觀的 GUI 工具能有效提升工作效率和體驗。本篇文章將帶你用 PyQt5 和 asyncio 從零實現一個美觀且功能實用的接口并發(fā)測試工具。

我們將實現以下功能:

請求方法選擇器

添加了一個下拉框 QComboBox,用戶可以選擇 GET、POST、PUT、DELETE 或 PATCH。

動態(tài)請求方法

根據用戶選擇的請求方法,在 send_request 函數中動態(tài)調用對應的 aiohttp 方法(如 session.get 或 session.post)。

異常處理

如果用戶選擇了不支持的請求方法,會返回 "Unsupported Method" 錯誤。

使用方法

在界面上輸入請求的 URL。

選擇所需的 請求方法(如 GET、POST 等)。

輸入 請求頭 和 請求參數(JSON 格式)。

設置 并發(fā)請求次數,點擊“開始測試”。

查看結果表格中每個請求的序號、狀態(tài)碼和響應時間。

下面是完整的代碼實現以及詳細的注釋,幫助你快速上手。

代碼實現

1. 安裝依賴

在開始之前,請確保安裝了必要的依賴庫:

pip install pyqt5 aiohttp

2. 主代碼

以下是完整的代碼實現:

import sys
import asyncio
import aiohttp
from PyQt5.QtWidgets import (
    QApplication, QWidget, QLabel, QLineEdit, QTextEdit, QVBoxLayout, QHBoxLayout, QPushButton, QSpinBox, QTableWidget, QTableWidgetItem
)
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QFont

class AsyncHttpTester(QWidget):
    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        """初始化用戶界面"""
        self.setWindowTitle("接口并發(fā)測試工具")
        self.setGeometry(100, 100, 800, 600)
        self.setFont(QFont("Arial", 10))

        # === 接口配置區(qū) ===
        url_label = QLabel("請求 URL:")
        self.url_input = QLineEdit()
        self.url_input.setPlaceholderText("請輸入接口 URL")

        headers_label = QLabel("請求頭 (JSON 格式):")
        self.headers_input = QTextEdit()
        self.headers_input.setPlaceholderText('例如:{"Content-Type": "application/json"}')

        params_label = QLabel("請求參數 (JSON 格式):")
        self.params_input = QTextEdit()
        self.params_input.setPlaceholderText('例如:{"key": "value"}')

        times_label = QLabel("發(fā)送次數:")
        self.times_input = QSpinBox()
        self.times_input.setRange(1, 1000)
        self.times_input.setValue(1)

        # === 開始按鈕 ===
        self.start_button = QPushButton("開始測試")
        self.start_button.clicked.connect(self.start_test)

        # === 結果展示區(qū) ===
        results_label = QLabel("測試結果:")
        self.results_table = QTableWidget()
        self.results_table.setColumnCount(3)
        self.results_table.setHorizontalHeaderLabels(["請求序號", "狀態(tài)碼", "響應時間 (秒)"])
        self.results_table.setColumnWidth(0, 100)
        self.results_table.setColumnWidth(1, 100)
        self.results_table.setColumnWidth(2, 150)

        # === 布局 ===
        layout = QVBoxLayout()

        # 接口配置布局
        config_layout = QVBoxLayout()
        config_layout.addWidget(url_label)
        config_layout.addWidget(self.url_input)
        config_layout.addWidget(headers_label)
        config_layout.addWidget(self.headers_input)
        config_layout.addWidget(params_label)
        config_layout.addWidget(self.params_input)
        config_layout.addWidget(times_label)
        config_layout.addWidget(self.times_input)

        # 添加開始按鈕
        config_layout.addWidget(self.start_button)

        # 結果展示布局
        results_layout = QVBoxLayout()
        results_layout.addWidget(results_label)
        results_layout.addWidget(self.results_table)

        # 整合布局
        layout.addLayout(config_layout)
        layout.addLayout(results_layout)
        self.setLayout(layout)

    async def send_request(self, session, url, headers, params, index):
        """發(fā)送單個 HTTP 請求"""
        try:
            async with session.post(url, json=params, headers=headers) as response:
                elapsed = response.elapsed.total_seconds() if response.elapsed else 0
                return index, response.status, elapsed
        except Exception as e:
            return index, f"Error: {str(e)}", 0

    async def start_async_requests(self, url, headers, params, times):
        """啟動并發(fā)請求"""
        tasks = []
        async with aiohttp.ClientSession() as session:
            for i in range(times):
                tasks.append(self.send_request(session, url, headers, params, i + 1))
            return await asyncio.gather(*tasks)

    def start_test(self):
        """開始測試按鈕事件"""
        url = self.url_input.text().strip()
        try:
            headers = eval(self.headers_input.toPlainText().strip()) if self.headers_input.toPlainText().strip() else {}
            params = eval(self.params_input.toPlainText().strip()) if self.params_input.toPlainText().strip() else {}
        except Exception as e:
            self.results_table.setRowCount(0)
            self.results_table.setRowCount(1)
            self.results_table.setItem(0, 0, QTableWidgetItem("Error"))
            self.results_table.setItem(0, 1, QTableWidgetItem(f"Invalid headers/params: {str(e)}"))
            return

        times = self.times_input.value()
        if not url:
            self.results_table.setRowCount(0)
            self.results_table.setRowCount(1)
            self.results_table.setItem(0, 0, QTableWidgetItem("Error"))
            self.results_table.setItem(0, 1, QTableWidgetItem("URL 不能為空"))
            return

        # 清空結果表
        self.results_table.setRowCount(0)

        # 啟動異步任務
        loop = asyncio.get_event_loop()
        results = loop.run_until_complete(self.start_async_requests(url, headers, params, times))

        # 更新結果表
        self.results_table.setRowCount(len(results))
        for i, (index, status, elapsed) in enumerate(results):
            self.results_table.setItem(i, 0, QTableWidgetItem(str(index)))
            self.results_table.setItem(i, 1, QTableWidgetItem(str(status)))
            self.results_table.setItem(i, 2, QTableWidgetItem(f"{elapsed:.2f}"))

if __name__ == "__main__":
    app = QApplication(sys.argv)
    tester = AsyncHttpTester()
    tester.show()
    sys.exit(app.exec_())

功能解析

1. 界面設計

使用 PyQt5 構建界面,布局由 QVBoxLayout 和 QHBoxLayout 組合,模塊化分為“配置區(qū)”和“結果區(qū)”。

支持輸入 URL、請求頭、請求參數、以及指定發(fā)送次數。

2. 異步請求

使用 aiohttp.ClientSession 實現非阻塞的 HTTP 請求。

通過 asyncio.gather 并發(fā)發(fā)送多個請求,收集結果。

3. 響應展示

結果以表格形式展示,包含請求序號、狀態(tài)碼、響應時間,方便對比和分析。

運行效果

啟動工具后,用戶可以在界面上輸入接口參數,例如 URL、請求頭、請求體等。

點擊“開始測試”后,工具會并發(fā)發(fā)送指定次數的請求,并實時展示結果。

總結

通過 PyQt5 和 asyncio,我們成功實現了一個美觀實用的接口并發(fā)測試工具。在這個項目中,測試工程師可以直觀地配置接口參數并分析響應結果,同時也能深入理解 Python 的異步編程原理。

到此這篇關于使用python和asyncio打造接口并發(fā)測試GUI工具的文章就介紹到這了,更多相關python asyncio接口并發(fā)測試內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Python利用Turtle繪制Technoblade的示例代碼

    Python利用Turtle繪制Technoblade的示例代碼

    國外一位在YouTube擁有上千萬粉絲的我的世界游戲主播Technoblade因癌癥與世長辭,為了紀念他,特地寫了這篇文章,教大家用Turtle繪制出Technoblade,快跟隨小編一起學習一下吧
    2023-01-01
  • python 通過視頻url獲取視頻的寬高方式

    python 通過視頻url獲取視頻的寬高方式

    今天小編就為大家分享一篇python 通過視頻url獲取視頻的寬高方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Python開發(fā)中使用read()讀取大文件導致內存溢出問題解決辦法

    Python開發(fā)中使用read()讀取大文件導致內存溢出問題解決辦法

    在處理大型Excel文件時,開發(fā)者常遇到程序崩潰或響應緩慢的問題,其核心原因在于內存溢出,這篇文章主要介紹了Python開發(fā)中使用read()讀取大文件導致內存溢出問題的解決辦法,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2026-06-06
  • Django視圖函數的具體使用

    Django視圖函數的具體使用

    這篇文章主要介紹了Django視圖函數的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • Python代碼風格與編程習慣重要嗎?

    Python代碼風格與編程習慣重要嗎?

    實現高內聚,低耦合、結構清晰不臃腫、可讀性高、數據冗余性低、高復用、易擴展的代碼,并非易事.上到設計模式,下到某個類、方法、函數的構造.在這里我分享一下我自己的代碼設計,編寫風格,讓我們互相學習,需要的朋友可以參考下
    2021-06-06
  • python 從csv讀數據到mysql的實例

    python 從csv讀數據到mysql的實例

    今天小編就為大家分享一篇python 從csv讀數據到mysql的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • Python input函數實現獲取鍵盤輸入的字符串流程講解

    Python input函數實現獲取鍵盤輸入的字符串流程講解

    這篇文章主要介紹了Python input函數實現獲取鍵盤輸入的字符串流程,input()是Python的內置函數,用于從控制臺讀取用戶輸入的內容。input()函數總是以字符串的形式來處理用戶輸入的內容,所以用戶輸入的內容可以包含任何字符
    2023-01-01
  • Python?+?Tkinter連接本地MySQL數據庫簡單實現注冊登錄

    Python?+?Tkinter連接本地MySQL數據庫簡單實現注冊登錄

    這篇文章主要介紹了Python?+?Tkinter連接本地MySQL數據庫簡單實現注冊登錄。下面文章著情介紹,需要的小伙伴可以參考一下
    2022-01-01
  • python3格式化字符串 f-string的高級用法(推薦)

    python3格式化字符串 f-string的高級用法(推薦)

    從Python 3.6開始,f-string是格式化字符串的一種很好的新方法。與其他格式化方式相比,它們不僅更易讀,更簡潔,不易出錯,而且速度更快!本文重點給大家介紹python3格式化字符串 f-string的高級用法,一起看看吧
    2020-03-03
  • Python安裝Bs4的多種方法

    Python安裝Bs4的多種方法

    這篇文章主要介紹了Python安裝Bs4幾種方法,本文通過多種方法給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11

最新評論

绥中县| 安图县| 社旗县| 榆中县| 盐山县| 永善县| 施秉县| 建阳市| 万荣县| 县级市| 民丰县| 柳州市| 六枝特区| 汝城县| 遂宁市| 民权县| 开远市| 平陆县| 阳西县| 兰西县| 佛冈县| 香格里拉县| 靖江市| 精河县| 凌云县| 邢台市| 赣榆县| 遵义县| 浪卡子县| 望奎县| 和龙市| 孝感市| 额敏县| 古浪县| 从江县| 北海市| 重庆市| 四川省| 保康县| 安庆市| 崇明县|