From 1f147e1a9d1f8a15d09475c4b2f4cd48de787f75 Mon Sep 17 00:00:00 2001 From: JE-Chen Date: Fri, 7 Nov 2025 23:32:52 +0800 Subject: [PATCH 1/5] Update dev version * Add comments * improve code --- dev_requirements.txt | 1 + .../gui/load_density_gui_thread.py | 61 +++- je_load_density/gui/log_to_ui_filter.py | 28 +- je_load_density/gui/main_widget.py | 92 ++++-- je_load_density/gui/main_window.py | 34 +- .../callback/callback_function_executor.py | 86 +++-- .../utils/executor/action_executor.py | 129 +++++--- .../file_process/create_project_structure.py | 38 ++- .../utils/file_process/get_dir_file_list.py | 38 ++- .../generate_report/generate_html_report.py | 301 ++++++------------ .../generate_report/generate_json_report.py | 108 ++++--- .../generate_report/generate_xml_report.py | 67 ++-- .../utils/get_data_strcture/get_api_data.py | 61 ++-- .../utils/json/json_file/json_file.py | 61 ++-- .../utils/logging/loggin_instance.py | 67 +++- .../package_manager/package_manager_class.py | 56 +++- .../utils/project/create_project_structure.py | 73 +++-- .../load_density_socket_server.py | 102 ++++-- .../utils/test_record/test_record_class.py | 33 +- .../change_xml_structure.py | 71 +++-- .../utils/xml/xml_file/xml_file.py | 93 ++++-- .../create_locust_env/create_locust_env.py | 6 +- je_load_density/wrapper/event/request_hook.py | 38 ++- je_load_density/wrapper/proxy/proxy_user.py | 48 ++- .../proxy/user/fast_http_user_proxy.py | 31 +- .../wrapper/proxy/user/http_user_proxy.py | 41 ++- .../wrapper/start_wrapper/start_test.py | 73 +++-- .../user_template/fast_http_user_template.py | 38 ++- .../user_template/http_user_template.py | 37 ++- pyproject.toml | 8 +- dev.toml => stable.toml | 8 +- .../unit_test/scheduler_test/sec_cron_test.py | 12 - .../scheduler_test/sec_interval_test.py | 12 - .../user_test/fast_http_user_test.py | 2 +- test/unit_test/user_test/http_user_test.py | 2 +- 35 files changed, 1234 insertions(+), 722 deletions(-) rename dev.toml => stable.toml (91%) delete mode 100644 test/unit_test/scheduler_test/sec_cron_test.py delete mode 100644 test/unit_test/scheduler_test/sec_interval_test.py diff --git a/dev_requirements.txt b/dev_requirements.txt index 371d98e..d2286ac 100644 --- a/dev_requirements.txt +++ b/dev_requirements.txt @@ -3,3 +3,4 @@ sphinx twine sphinx-rtd-theme build +pytest diff --git a/je_load_density/gui/load_density_gui_thread.py b/je_load_density/gui/load_density_gui_thread.py index ed20b54..dd858cc 100644 --- a/je_load_density/gui/load_density_gui_thread.py +++ b/je_load_density/gui/load_density_gui_thread.py @@ -1,26 +1,59 @@ from PySide6.QtCore import QThread from je_load_density.wrapper.start_wrapper.start_test import start_test +# 定義常數,避免硬編碼字串 +# Define constant to avoid hard-coded string +DEFAULT_USER_TYPE = "fast_http_user" + class LoadDensityGUIThread(QThread): + """ + GUI 測試執行緒 + GUI Test Thread + + 用於在背景執行負載測試,避免阻塞主介面。 + Used to run load tests in the background without blocking the main GUI. + """ - def __init__(self): + def __init__(self, + request_url: str = None, + test_duration: int = None, + user_count: int = None, + spawn_rate: int = None, + http_method: str = None): + """ + 初始化執行緒參數 + Initialize thread parameters + + :param request_url: 測試目標 URL (Target request URL) + :param test_duration: 測試持續時間 (Test duration in seconds) + :param user_count: 使用者數量 (Number of simulated users) + :param spawn_rate: 使用者生成速率 (User spawn rate) + :param http_method: HTTP 方法 (HTTP method, e.g., "GET", "POST") + """ super().__init__() - self.url = None - self.test_time = None - self.user_count = None - self.spawn_rate = None - self.method = None + self.request_url = request_url + self.test_duration = test_duration + self.user_count = user_count + self.spawn_rate = spawn_rate + self.http_method = http_method def run(self): + """ + 執行負載測試 + Run the load test + """ + if not self.request_url or not self.http_method: + # 基本檢查,避免傳入 None + # Basic validation to avoid None values + raise ValueError("Request URL and HTTP method must be provided.") + start_test( - { - "user": "fast_http_user", - }, - self.user_count, self.spawn_rate, self.test_time, - **{ - "tasks": { - self.method: {"request_url": self.url}, - } + {"user": DEFAULT_USER_TYPE}, # 使用者類型 (User type) + self.user_count, + self.spawn_rate, + self.test_duration, + tasks={ + self.http_method: {"request_url": self.request_url} } ) \ No newline at end of file diff --git a/je_load_density/gui/log_to_ui_filter.py b/je_load_density/gui/log_to_ui_filter.py index ffefbcc..16b7291 100644 --- a/je_load_density/gui/log_to_ui_filter.py +++ b/je_load_density/gui/log_to_ui_filter.py @@ -1,10 +1,30 @@ import logging import queue -locust_log_queue = queue.Queue() +# 建立一個佇列,用來存放攔截到的日誌訊息 +# Create a queue to store intercepted log messages +log_message_queue: queue.Queue[str] = queue.Queue() + class InterceptAllFilter(logging.Filter): + """ + 攔截所有日誌訊息並存入佇列 + Intercept all log messages and store them into a queue + + 此 Filter 可用於將 logging 模組的輸出導向 GUI 或其他處理流程。 + This filter can be used to redirect logging outputs to a GUI or other processing pipelines. + """ + + def filter(self, record: logging.LogRecord) -> bool: + """ + 攔截日誌紀錄並存入佇列 + Intercept log record and put it into the queue - def filter(self, record): - locust_log_queue.put(record.getMessage()) - return False + :param record: logging.LogRecord 物件 (Log record object) + :return: False → 阻止訊息繼續傳遞到其他 Handler + False → Prevents the message from propagating to other handlers + """ + # 只存放訊息文字,也可以改成存整個 record 以保留更多資訊 + # Only store the message text; alternatively, store the whole record for more details + log_message_queue.put(record.getMessage()) + return False \ No newline at end of file diff --git a/je_load_density/gui/main_widget.py b/je_load_density/gui/main_widget.py index 99f8534..8542b4c 100644 --- a/je_load_density/gui/main_widget.py +++ b/je_load_density/gui/main_widget.py @@ -1,27 +1,52 @@ import logging +import queue +from typing import Optional from PySide6.QtCore import QTimer from PySide6.QtGui import QIntValidator -from PySide6.QtWidgets import QWidget, QFormLayout, QLineEdit, QComboBox, QPushButton, QTextEdit, QVBoxLayout, QLabel +from PySide6.QtWidgets import ( + QWidget, QFormLayout, QLineEdit, QComboBox, + QPushButton, QTextEdit, QVBoxLayout, QLabel, QMessageBox +) from je_load_density.gui.load_density_gui_thread import LoadDensityGUIThread from je_load_density.gui.language_wrapper.multi_language_wrapper import language_wrapper -from je_load_density.gui.log_to_ui_filter import InterceptAllFilter, locust_log_queue +from je_load_density.gui.log_to_ui_filter import InterceptAllFilter, log_message_queue class LoadDensityWidget(QWidget): + """ + 負載測試 GUI 控制元件 + Load Test GUI Widget - def __init__(self, parent=None): + 提供使用者輸入測試參數並啟動負載測試, + 並將日誌訊息即時顯示在 GUI 中。 + Provides input fields for test parameters, starts load tests, + and displays log messages in real-time. + """ + + def __init__(self, parent: Optional[QWidget] = None): super().__init__(parent) - # from + + # === 表單區域 (Form Section) === form_layout = QFormLayout() + + # URL 輸入框 (Target URL input) self.url_input = QLineEdit() + + # 測試時間 (Test duration, must be int) self.test_time_input = QLineEdit() self.test_time_input.setValidator(QIntValidator()) + + # 使用者數量 (User count) self.user_count_input = QLineEdit() self.user_count_input.setValidator(QIntValidator()) + + # 生成速率 (Spawn rate) self.spawn_rate_input = QLineEdit() self.spawn_rate_input.setValidator(QIntValidator()) + + # HTTP 方法選擇 (HTTP method selection) self.method_combobox = QComboBox() self.method_combobox.addItems([ language_wrapper.language_word_dict.get("get"), @@ -32,50 +57,75 @@ def __init__(self, parent=None): language_wrapper.language_word_dict.get("head"), language_wrapper.language_word_dict.get("options"), ]) + + # 將元件加入表單 (Add widgets to form layout) form_layout.addRow(language_wrapper.language_word_dict.get("url"), self.url_input) form_layout.addRow(language_wrapper.language_word_dict.get("test_time"), self.test_time_input) form_layout.addRow(language_wrapper.language_word_dict.get("user_count"), self.user_count_input) form_layout.addRow(language_wrapper.language_word_dict.get("spawn_rate"), self.spawn_rate_input) form_layout.addRow(language_wrapper.language_word_dict.get("test_method"), self.method_combobox) + # === 啟動按鈕 (Start button) === self.start_button = QPushButton(language_wrapper.language_word_dict.get("start_button")) self.start_button.clicked.connect(self.run_load_density) - # Log panel + # === 日誌面板 (Log panel) === self.log_panel = QTextEdit() self.log_panel.setReadOnly(True) - # Add widget to vertical layout + # === 主版面配置 (Main layout) === main_layout = QVBoxLayout() main_layout.addLayout(form_layout) main_layout.addWidget(self.start_button) main_layout.addWidget(QLabel(language_wrapper.language_word_dict.get("log"))) main_layout.addWidget(self.log_panel) - # Param - self.run_load_density_thread = None + # === 執行緒與計時器 (Thread & Timer) === + self.run_load_density_thread: Optional[LoadDensityGUIThread] = None self.pull_log_timer = QTimer() - self.pull_log_timer.setInterval(20) + self.pull_log_timer.setInterval(50) # 稍微放大間隔,避免 UI 卡頓 self.pull_log_timer.timeout.connect(self.add_text_to_log) self.setLayout(main_layout) - def run_load_density(self): + def run_load_density(self) -> None: + """ + 啟動負載測試 + Start the load test + """ + try: + test_time = int(self.test_time_input.text()) + user_count = int(self.user_count_input.text()) + spawn_rate = int(self.spawn_rate_input.text()) + except ValueError: + QMessageBox.warning(self, "Invalid Input", "請輸入有效的數字\nPlease enter valid numbers") + return + self.run_load_density_thread = LoadDensityGUIThread() - self.run_load_density_thread.url = self.url_input.text() - self.run_load_density_thread.test_time = int(self.test_time_input.text()) - self.run_load_density_thread.user_count = int(self.user_count_input.text()) - self.run_load_density_thread.spawn_rate = int(self.spawn_rate_input.text()) - self.run_load_density_thread.method = self.method_combobox.currentText().lower() - log_handler_list = [handler for handler in logging.getLogger("root").handlers if handler.name == "log_reader"] + self.run_load_density_thread.request_url = self.url_input.text() + self.run_load_density_thread.test_duration = test_time + self.run_load_density_thread.user_count = user_count + self.run_load_density_thread.spawn_rate = spawn_rate + self.run_load_density_thread.http_method = self.method_combobox.currentText().lower() + + # 設定日誌攔截器 (Attach log filter) + root_logger = logging.getLogger("root") + log_handler_list = [handler for handler in root_logger.handlers if handler.name == "log_reader"] if log_handler_list: log_handler = log_handler_list[0] - log_handler.addFilter(InterceptAllFilter()) + # 避免重複新增 Filter (Prevent duplicate filters) + if not any(isinstance(f, InterceptAllFilter) for f in log_handler.filters): + log_handler.addFilter(InterceptAllFilter()) + + # 啟動執行緒與計時器 (Start thread & timer) self.run_load_density_thread.start() - self.pull_log_timer.stop() self.pull_log_timer.start() self.log_panel.clear() - def add_text_to_log(self): - if not locust_log_queue.empty(): - self.log_panel.append(locust_log_queue.get_nowait()) + def add_text_to_log(self) -> None: + """ + 將日誌訊息加入到 GUI 面板 + Append log messages to GUI panel + """ + while not log_message_queue.empty(): + self.log_panel.append(log_message_queue.get_nowait()) \ No newline at end of file diff --git a/je_load_density/gui/main_window.py b/je_load_density/gui/main_window.py index 2c4e167..8d14828 100644 --- a/je_load_density/gui/main_window.py +++ b/je_load_density/gui/main_window.py @@ -1,6 +1,7 @@ import sys +from typing import Optional -from PySide6.QtWidgets import QMainWindow, QApplication +from PySide6.QtWidgets import QMainWindow, QApplication, QWidget from qt_material import QtStyleTools from je_load_density.gui.language_wrapper.multi_language_wrapper import language_wrapper @@ -8,18 +9,41 @@ class LoadDensityUI(QMainWindow, QtStyleTools): + """ + 負載測試主視窗 + Load Test Main Window - def __init__(self): - super().__init__() + 提供 GUI 介面,整合測試控制元件與樣式設定。 + Provides the main GUI window, integrating the load test widget and applying styles. + """ + + def __init__(self, parent: Optional[QWidget] = None): + super().__init__(parent) + + # 應用程式名稱 (Application name) self.id = language_wrapper.language_word_dict.get("application_name") + + # 在 Windows 平台設定 AppUserModelID,讓工作列顯示正確的應用程式名稱 + # Set AppUserModelID on Windows so the taskbar shows the correct application name if sys.platform in ["win32", "cygwin", "msys"]: from ctypes import windll windll.shell32.SetCurrentProcessExplicitAppUserModelID(self.id) + + # 設定字體樣式 (Set font style) self.setStyleSheet( - f"font-size: 12pt;" - f"font-family: 'Lato';" + "font-size: 12pt;" + "font-family: 'Lato';" ) + + # 套用 qt-material 樣式 (Apply qt-material theme) self.apply_stylesheet(self, "dark_amber.xml") + + # 建立並設定主要控制元件 (Create and set main widget) self.load_density_widget = LoadDensityWidget() self.setCentralWidget(self.load_density_widget) +if __name__ == "__main__": + app = QApplication(sys.argv) + window = LoadDensityUI() + window.show() + sys.exit(app.exec()) \ No newline at end of file diff --git a/je_load_density/utils/callback/callback_function_executor.py b/je_load_density/utils/callback/callback_function_executor.py index a206b19..4807fe1 100644 --- a/je_load_density/utils/callback/callback_function_executor.py +++ b/je_load_density/utils/callback/callback_function_executor.py @@ -1,18 +1,41 @@ import typing from sys import stderr -from je_load_density.utils.exception.exception_tags import get_bad_trigger_function, get_bad_trigger_method +from je_load_density.utils.exception.exception_tags import ( + get_bad_trigger_function, + get_bad_trigger_method, +) from je_load_density.utils.exception.exceptions import CallbackExecutorException -from je_load_density.utils.generate_report.generate_html_report import generate_html, generate_html_report -from je_load_density.utils.generate_report.generate_json_report import generate_json, generate_json_report -from je_load_density.utils.generate_report.generate_xml_report import generate_xml, generate_xml_report +from je_load_density.utils.generate_report.generate_html_report import ( + generate_html, + generate_html_report, +) +from je_load_density.utils.generate_report.generate_json_report import ( + generate_json, + generate_json_report, +) +from je_load_density.utils.generate_report.generate_xml_report import ( + generate_xml, + generate_xml_report, +) from je_load_density.wrapper.start_wrapper.start_test import start_test -class CallbackFunctionExecutor(object): +class CallbackFunctionExecutor: + """ + 回呼函式執行器 + Callback Function Executor - def __init__(self): - self.event_dict: dict = { + 提供事件觸發與回呼機制,先執行指定的 trigger function, + 再執行 callback function。 + Provides a mechanism to trigger a function from event_dict, + then execute a callback function. + """ + + def __init__(self) -> None: + # 事件字典,定義可觸發的函式 + # Event dictionary, defines available trigger functions + self.event_dict: dict[str, typing.Callable] = { "user_test": start_test, "LD_generate_html": generate_html, "LD_generate_html_report": generate_html_report, @@ -23,25 +46,36 @@ def __init__(self): } def callback_function( - self, - trigger_function_name: str, - callback_function: typing.Callable, - callback_function_param: [dict, None] = None, - callback_param_method: str = "kwargs", - **kwargs - ): + self, + trigger_function_name: str, + callback_function: typing.Callable, + callback_function_param: typing.Optional[typing.Union[dict, list]] = None, + callback_param_method: str = "kwargs", + **kwargs, + ) -> typing.Any: """ - :param trigger_function_name: what function we want to trigger only accept function in event_dict - :param callback_function: what function we want to callback - :param callback_function_param: callback function's param only accept dict - :param callback_param_method: what type param will use on callback function only accept kwargs and args - :param kwargs: trigger_function's param - :return: + 執行事件函式並呼叫回呼函式 + Execute trigger function and then call callback function + + :param trigger_function_name: 事件函式名稱 (must exist in event_dict) + :param callback_function: 回呼函式 (callback function to execute) + :param callback_function_param: 回呼函式參數 (dict for kwargs, list for args) + :param callback_param_method: 參數傳遞方式 ("kwargs" or "args") + :param kwargs: 傳給事件函式的參數 (parameters for trigger function) + :return: 事件函式的回傳值 (return value of trigger function) """ try: - if trigger_function_name not in self.event_dict.keys(): + # 檢查事件函式是否存在 + # Validate trigger function existence + if trigger_function_name not in self.event_dict: raise CallbackExecutorException(get_bad_trigger_function) - execute_return_value = self.event_dict.get(trigger_function_name)(**kwargs) + + # 執行事件函式 + # Execute trigger function + execute_return_value = self.event_dict[trigger_function_name](**kwargs) + + # 執行回呼函式 + # Execute callback function if callback_function_param is not None: if callback_param_method not in ["kwargs", "args"]: raise CallbackExecutorException(get_bad_trigger_method) @@ -51,9 +85,15 @@ def callback_function( callback_function(*callback_function_param) else: callback_function() + return execute_return_value + except Exception as error: + # 目前只輸出錯誤,可以改成 logging 或 raise + # Currently prints error; can be replaced with logging or re-raise print(repr(error), file=stderr) -callback_executor = CallbackFunctionExecutor() +# 建立全域執行器實例 +# Create global executor instance +callback_executor = CallbackFunctionExecutor() \ No newline at end of file diff --git a/je_load_density/utils/executor/action_executor.py b/je_load_density/utils/executor/action_executor.py index 5537710..4bb19ee 100644 --- a/je_load_density/utils/executor/action_executor.py +++ b/je_load_density/utils/executor/action_executor.py @@ -4,21 +4,43 @@ from inspect import getmembers, isbuiltin from typing import Union, Any -from je_load_density.utils.exception.exception_tags import executor_data_error, add_command_exception_tag -from je_load_density.utils.exception.exception_tags import executor_list_error +from je_load_density.utils.exception.exception_tags import ( + executor_data_error, + add_command_exception_tag, + executor_list_error, +) from je_load_density.utils.exception.exceptions import LoadDensityTestExecuteException -from je_load_density.utils.generate_report.generate_html_report import generate_html, generate_html_report -from je_load_density.utils.generate_report.generate_json_report import generate_json, generate_json_report -from je_load_density.utils.generate_report.generate_xml_report import generate_xml, generate_xml_report +from je_load_density.utils.generate_report.generate_html_report import ( + generate_html, + generate_html_report, +) +from je_load_density.utils.generate_report.generate_json_report import ( + generate_json, + generate_json_report, +) +from je_load_density.utils.generate_report.generate_xml_report import ( + generate_xml, + generate_xml_report, +) from je_load_density.utils.json.json_file.json_file import read_action_json from je_load_density.utils.package_manager.package_manager_class import package_manager from je_load_density.wrapper.start_wrapper.start_test import start_test -class Executor(object): +class Executor: + """ + 執行器 (Executor) + Event-driven executor - def __init__(self): - self.event_dict = { + 提供事件字典 (event_dict),可根據動作名稱執行對應函式, + 並支援批次執行與檔案驅動。 + Provides an event dictionary to execute functions by name, + supporting batch execution and file-driven execution. + """ + + def __init__(self) -> None: + # 初始化事件字典 (Initialize event dictionary) + self.event_dict: dict[str, Any] = { "LD_start_test": start_test, "LD_generate_html": generate_html, "LD_generate_html_report": generate_html_report, @@ -26,21 +48,29 @@ def __init__(self): "LD_generate_json_report": generate_json_report, "LD_generate_xml": generate_xml, "LD_generate_xml_report": generate_xml_report, - # Execute + # Executor internal methods "LD_execute_action": self.execute_action, "LD_execute_files": self.execute_files, "LD_add_package_to_executor": package_manager.add_package_to_executor, } - # get all builtin function and add to event dict - for function in getmembers(builtins, isbuiltin): - self.event_dict.update({str(function[0]): function[1]}) - def _execute_event(self, action: list): + # 將所有 Python 內建函式加入事件字典 + # Add all Python built-in functions to event_dict + for name, func in getmembers(builtins, isbuiltin): + self.event_dict[name] = func + + def _execute_event(self, action: list) -> Any: """ - :param action: execute action - :return: what event return + 執行單一事件 + Execute a single event + + :param action: 事件結構,例如 ["function_name", {"param": value}] + :return: 事件回傳值 (return value of executed event) """ event = self.event_dict.get(action[0]) + if event is None: + raise LoadDensityTestExecuteException(executor_data_error + " " + str(action)) + if len(action) == 2: if isinstance(action[1], dict): return event(**action[1]) @@ -51,68 +81,87 @@ def _execute_event(self, action: list): else: raise LoadDensityTestExecuteException(executor_data_error + " " + str(action)) - def execute_action(self, action_list: [list, dict]) -> dict: + def execute_action(self, action_list: Union[list, dict]) -> dict[str, Any]: """ - execute all action in action list - :param action_list: like this structure - [ - ["method on event_dict", {"param": params}], - ["method on event_dict", {"param": params}] - ] - for loop and use execute_event function to execute - :return: recode string, response as list + 執行多個事件 + Execute multiple actions + + :param action_list: 事件列表,例如: + [ + ["LD_start_test", {"param": value}], + ["LD_generate_json", {"param": value}] + ] + :return: 執行紀錄字典 (execution record dict) """ if isinstance(action_list, dict): action_list = action_list.get("load_density", None) if action_list is None: raise LoadDensityTestExecuteException(executor_list_error) - execute_record_dict = dict() + + execute_record_dict: dict[str, Any] = {} + try: - if len(action_list) == 0 or isinstance(action_list, list) is False: + if not isinstance(action_list, list) or len(action_list) == 0: raise LoadDensityTestExecuteException(executor_list_error) except Exception as error: print(repr(error), file=sys.stderr) + for action in action_list: try: event_response = self._execute_event(action) - execute_record = "execute: " + str(action) - execute_record_dict.update({execute_record: event_response}) + execute_record = f"execute: {action}" + execute_record_dict[execute_record] = event_response except Exception as error: print(repr(error), file=sys.stderr) print(action, file=sys.stderr) - execute_record = "execute: " + str(action) - execute_record_dict.update({execute_record: repr(error)}) + execute_record = f"execute: {action}" + execute_record_dict[execute_record] = repr(error) + + # 輸出執行結果 (Print execution results) for key, value in execute_record_dict.items(): print(key) print(value) + return execute_record_dict - def execute_files(self, execute_files_list: list): + def execute_files(self, execute_files_list: list[str]) -> list[dict[str, Any]]: """ - execute action on all file in execute_files_list - :param execute_files_list: list include execute files path - :return: every execute detail as list + 執行檔案中的事件 + Execute actions from files + + :param execute_files_list: 檔案路徑列表 (list of file paths) + :return: 每個檔案的執行結果列表 (list of execution results per file) """ - execute_detail_list = list() + execute_detail_list: list[dict[str, Any]] = [] for file in execute_files_list: execute_detail_list.append(self.execute_action(read_action_json(file))) return execute_detail_list + +# 建立全域執行器 (Global executor instance) executor = Executor() package_manager.executor = executor -def add_command_to_executor(command_dict: dict): +def add_command_to_executor(command_dict: dict[str, Any]) -> None: + """ + 新增自訂命令到執行器 + Add custom commands to executor + + :param command_dict: {command_name: function} + """ for command_name, command in command_dict.items(): if isinstance(command, (types.MethodType, types.FunctionType)): - executor.event_dict.update({command_name: command}) + executor.event_dict[command_name] = command else: raise LoadDensityTestExecuteException(add_command_exception_tag) -def execute_action(action_list: list) -> dict: +def execute_action(action_list: list) -> dict[str, Any]: + """全域執行事件 (Global execute action)""" return executor.execute_action(action_list) -def execute_files(execute_files_list: list) -> list: - return executor.execute_files(execute_files_list) +def execute_files(execute_files_list: list[str]) -> list[dict[str, Any]]: + """全域執行檔案事件 (Global execute files)""" + return executor.execute_files(execute_files_list) \ No newline at end of file diff --git a/je_load_density/utils/file_process/create_project_structure.py b/je_load_density/utils/file_process/create_project_structure.py index 52828bb..af6ba05 100644 --- a/je_load_density/utils/file_process/create_project_structure.py +++ b/je_load_density/utils/file_process/create_project_structure.py @@ -1,17 +1,35 @@ from pathlib import Path +from typing import Optional +# 定義常數,避免硬編碼 +# Define constant to avoid hard-coded string +TEMPLATE_DIR = "je_load_density/template" -def _create_dir(dir_name: str): + +def _create_dir(dir_name: str) -> Optional[Path]: """ - create project dir - :param dir_name: create dir use dir name - :return: None + 建立專案目錄 + Create project directory + + :param dir_name: 要建立的目錄名稱 (Directory name to create) + :return: 成功建立或已存在的 Path 物件 (Path object if created/existed), None if failed """ - Path(dir_name).mkdir( - parents=True, - exist_ok=True - ) + try: + path = Path(dir_name) + path.mkdir(parents=True, exist_ok=True) + return path + except Exception as error: + # 錯誤處理:避免因權限或路徑問題導致程式崩潰 + # Error handling: prevent crash due to permission or path issues + print(f"Failed to create directory {dir_name}: {error}") + return None -def create_template_dir(): - _create_dir("je_load_density/template") +def create_template_dir() -> Optional[Path]: + """ + 建立模板目錄 + Create template directory + + :return: Path 物件或 None (Path object or None) + """ + return _create_dir(TEMPLATE_DIR) \ No newline at end of file diff --git a/je_load_density/utils/file_process/get_dir_file_list.py b/je_load_density/utils/file_process/get_dir_file_list.py index aa28fe6..690de02 100644 --- a/je_load_density/utils/file_process/get_dir_file_list.py +++ b/je_load_density/utils/file_process/get_dir_file_list.py @@ -1,18 +1,28 @@ -from os import getcwd -from os import walk -from os.path import abspath -from os.path import join +from pathlib import Path +from typing import List -def get_dir_files_as_list(dir_path: str = getcwd(), default_search_file_extension: str = ".json") -> list: +def get_dir_files_as_list( + dir_path: str = str(Path.cwd()), + default_search_file_extension: str = ".json" +) -> List[str]: """ - get dir file when end with default_search_file_extension - :param dir_path: which dir we want to walk and get file list - :param default_search_file_extension: which extension we want to search - :return: [] if nothing searched or [file1, file2.... files] file was searched + 取得指定目錄下所有符合副檔名的檔案清單 + Get all files in a directory that end with the given extension + + :param dir_path: 要搜尋的目錄路徑 (Directory path to search) + :param default_search_file_extension: 要搜尋的副檔名 (File extension to search, e.g. ".json") + :return: 檔案絕對路徑清單 (List of absolute file paths) """ - return [ - abspath(join(dir_path, file)) for root, dirs, files in walk(dir_path) - for file in files - if file.endswith(default_search_file_extension.lower()) - ] + try: + path_obj = Path(dir_path) + if not path_obj.exists() or not path_obj.is_dir(): + raise FileNotFoundError(f"Directory not found: {dir_path}") + + return [ + str(file.resolve()) + for file in path_obj.rglob(f"*{default_search_file_extension.lower()}") + ] + except Exception as error: + print(f"Error while scanning directory {dir_path}: {error}") + return [] \ No newline at end of file diff --git a/je_load_density/utils/generate_report/generate_html_report.py b/je_load_density/utils/generate_report/generate_html_report.py index 08525b2..e5097bb 100644 --- a/je_load_density/utils/generate_report/generate_html_report.py +++ b/je_load_density/utils/generate_report/generate_html_report.py @@ -1,222 +1,129 @@ import sys from threading import Lock +from typing import List, Tuple from je_load_density.utils.exception.exceptions import LoadDensityHTMLException from je_load_density.utils.exception.exception_tags import html_generate_no_data_tag from je_load_density.utils.test_record.test_record_class import test_record_instance -_html_string_head = \ - """ - - - - - Load Density Report - - - -

- Test Report -

- """.strip() +# HTML 標頭 (HTML head) +_HTML_STRING_HEAD = """ + + + + Load Density Report + + + +

Test Report

+""".strip() -_html_string_bottom = \ - """ - - - """.strip() +# HTML 結尾 (HTML bottom) +_HTML_STRING_BOTTOM = """""".strip() -_success_table = \ - r""" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Test Report
Method{Method}
test_url{test_url}
name{name}
status_code{status_code}
text{text}
content{content}
headers{headers}
-
- """.strip() +# 成功測試表格模板 (Success table template) +_SUCCESS_TABLE = r""" + + + + + + + + + + + + + +
Test Report
Method{Method}
test_url{test_url}
name{name}
status_code{status_code}
text{text}
content{content}
headers{headers}
+
+""".strip() -_failure_table = \ - r""" - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Test Report
http_method{http_method}
test_url{test_url}
name{name}
status_code{status_code}
error{error}
-
- """.strip() +# 失敗測試表格模板 (Failure table template) +_FAILURE_TABLE = r""" + + + + + + + + + + + +
Test Report
http_method{http_method}
test_url{test_url}
name{name}
status_code{status_code}
error{error}
+
+""".strip() -def generate_html(): +def generate_html() -> Tuple[List[str], List[str]]: """ - :return: success_test_dict, failure_test_dict + 產生 HTML 片段 (Generate HTML fragments) + + :return: (成功測試清單, 失敗測試清單) + (list of success test HTML fragments, list of failure test HTML fragments) """ - if len(test_record_instance.test_record_list) == 0 and len(test_record_instance.error_record_list) == 0: + if not test_record_instance.test_record_list and not test_record_instance.error_record_list: raise LoadDensityHTMLException(html_generate_no_data_tag) - else: - success_list = list() - for record_data in test_record_instance.test_record_list: - success_list.append( - _success_table.format( - Method=record_data.get("Method"), - test_url=record_data.get("test_url"), - name=record_data.get("name"), - status_code=record_data.get("status_code"), - text=record_data.get("text"), - content=record_data.get("content"), - headers=record_data.get("headers"), - ) - ) - failure_list = list() - if len(test_record_instance.error_record_list) == 0: - pass - else: - for record_data in test_record_instance.error_record_list: - failure_list.append( - _failure_table.format( - http_method=record_data.get("Method"), - test_url=record_data.get("test_url"), - name=record_data.get("name"), - status_code=record_data.get("status_code"), - error=record_data.get("error"), - ) - ) + + success_list: List[str] = [ + _SUCCESS_TABLE.format( + Method=record.get("Method"), + test_url=record.get("test_url"), + name=record.get("name"), + status_code=record.get("status_code"), + text=record.get("text"), + content=record.get("content"), + headers=record.get("headers"), + ) + for record in test_record_instance.test_record_list + ] + + failure_list: List[str] = [ + _FAILURE_TABLE.format( + http_method=record.get("Method"), + test_url=record.get("test_url"), + name=record.get("name"), + status_code=record.get("status_code"), + error=record.get("error"), + ) + for record in test_record_instance.error_record_list + ] + return success_list, failure_list -def generate_html_report(html_name: str = "default_name"): +def generate_html_report(html_name: str = "default_name") -> str: """ - format html_string and output html file - :param html_name: save html file name - :return: html_string + 產生完整 HTML 報告並輸出檔案 + Generate full HTML report and save to file + + :param html_name: 輸出檔案名稱 (Output file name, without extension) + :return: HTML 字串 (HTML string) """ _lock = Lock() success_list, failure_list = generate_html() + try: - _lock.acquire() - with open(html_name + ".html", "w+") as file_to_write: - file_to_write.writelines( - _html_string_head - ) - for success in success_list: - file_to_write.write(success) - for failure in failure_list: - file_to_write.write(failure) - file_to_write.writelines( - _html_string_bottom - ) + with _lock: # 使用 with 確保自動 acquire/release + html_path = f"{html_name}.html" + with open(html_path, "w+", encoding="utf-8") as file_to_write: + file_to_write.write(_HTML_STRING_HEAD) + file_to_write.writelines(success_list) + file_to_write.writelines(failure_list) + file_to_write.write(_HTML_STRING_BOTTOM) + return html_path except Exception as error: print(repr(error), file=sys.stderr) - finally: - _lock.release() + return "" \ No newline at end of file diff --git a/je_load_density/utils/generate_report/generate_json_report.py b/je_load_density/utils/generate_report/generate_json_report.py index ad1be6c..e082d13 100644 --- a/je_load_density/utils/generate_report/generate_json_report.py +++ b/je_load_density/utils/generate_report/generate_json_report.py @@ -1,72 +1,76 @@ import json import sys from threading import Lock +from typing import Tuple, Dict from je_load_density.utils.exception.exception_tags import cant_generate_json_report from je_load_density.utils.exception.exceptions import LoadDensityGenerateJsonReportException from je_load_density.utils.test_record.test_record_class import test_record_instance -def generate_json(): - if len(test_record_instance.test_record_list) == 0 and len(test_record_instance.error_record_list) == 0: +def generate_json() -> Tuple[Dict[str, dict], Dict[str, dict]]: + """ + 產生測試紀錄的 JSON 結構 + Generate JSON structure for test records + + :return: (成功測試字典, 失敗測試字典) + (success_dict, failure_dict) + """ + if not test_record_instance.test_record_list and not test_record_instance.error_record_list: raise LoadDensityGenerateJsonReportException(cant_generate_json_report) - else: - success_dict = dict() - failure_dict = dict() - failure_count: int = 1 - failure_test_str: str = "Failure_Test" - success_count: int = 1 - success_test_str: str = "Success_Test" - for record_data in test_record_instance.test_record_list: - success_dict.update( - { - success_test_str + str(success_count): { - "Method": str(record_data.get("Method")), - "test_url": str(record_data.get("test_url")), - "name": str(record_data.get("name")), - "status_code": str(record_data.get("status_code")), - "text": str(record_data.get("text")), - "content": str(record_data.get("content")), - "headers": str(record_data.get("headers")) - } - } - ) - success_count = success_count + 1 - for record_data in test_record_instance.error_record_list: - failure_dict.update( - { - failure_test_str + str(failure_count): { - "Method": str(record_data.get("Method")), - "test_url": str(record_data.get("test_url")), - "name": str(record_data.get("name")), - "status_code": str(record_data.get("status_code")), - "error": str(record_data.get("error")) - } - } - ) - failure_count = failure_count + 1 + + success_dict: Dict[str, dict] = {} + failure_dict: Dict[str, dict] = {} + + # 成功測試紀錄 (Success records) + for idx, record_data in enumerate(test_record_instance.test_record_list, start=1): + success_dict[f"Success_Test{idx}"] = { + "Method": str(record_data.get("Method")), + "test_url": str(record_data.get("test_url")), + "name": str(record_data.get("name")), + "status_code": str(record_data.get("status_code")), + "text": str(record_data.get("text")), + "content": str(record_data.get("content")), + "headers": str(record_data.get("headers")), + } + + # 失敗測試紀錄 (Failure records) + for idx, record_data in enumerate(test_record_instance.error_record_list, start=1): + failure_dict[f"Failure_Test{idx}"] = { + "Method": str(record_data.get("Method")), + "test_url": str(record_data.get("test_url")), + "name": str(record_data.get("name")), + "status_code": str(record_data.get("status_code")), + "error": str(record_data.get("error")), + } + return success_dict, failure_dict -def generate_json_report(json_file_name: str = "default_name"): +def generate_json_report(json_file_name: str = "default_name") -> Tuple[str, str]: """ - :param json_file_name: save json file's name + 輸出測試紀錄 JSON 報告 + Generate JSON report files for test records + + :param json_file_name: 輸出檔案名稱前綴 (Output file name prefix) + :return: (成功檔案路徑, 失敗檔案路徑) """ lock = Lock() success_dict, failure_dict = generate_json() + + success_path = f"{json_file_name}_success.json" + failure_path = f"{json_file_name}_failure.json" + try: - lock.acquire() - with open(json_file_name + "_success.json", "w+") as file_to_write: - json.dump(dict(success_dict), file_to_write, indent=4) - except Exception as error: - print(repr(error), file=sys.stderr) - finally: - lock.release() - try: - lock.acquire() - with open(json_file_name + "_failure.json", "w+") as file_to_write: - json.dump(dict(failure_dict), file_to_write, indent=4) + with lock: # 使用 with 確保自動 acquire/release + with open(success_path, "w+", encoding="utf-8") as file_to_write: + json.dump(success_dict, file_to_write, indent=4, ensure_ascii=False) + + with open(failure_path, "w+", encoding="utf-8") as file_to_write: + json.dump(failure_dict, file_to_write, indent=4, ensure_ascii=False) + + return success_path, failure_path + except Exception as error: print(repr(error), file=sys.stderr) - finally: - lock.release() + return "", "" \ No newline at end of file diff --git a/je_load_density/utils/generate_report/generate_xml_report.py b/je_load_density/utils/generate_report/generate_xml_report.py index cc9fb1b..11dd7c0 100644 --- a/je_load_density/utils/generate_report/generate_xml_report.py +++ b/je_load_density/utils/generate_report/generate_xml_report.py @@ -1,45 +1,58 @@ import sys from threading import Lock from xml.dom.minidom import parseString +from typing import Tuple + from je_load_density.utils.generate_report.generate_json_report import generate_json from je_load_density.utils.xml.change_xml_structure.change_xml_structure import dict_to_elements_tree -def generate_xml(): +def generate_xml() -> Tuple[str, str]: """ - :return: + 產生 XML 字串 (Generate XML strings) + + :return: (成功測試 XML 字串, 失敗測試 XML 字串) + (success_xml_str, failure_xml_str) """ success_dict, failure_dict = generate_json() - success_dict = dict({"xml_data": success_dict}) - failure_dict = dict({"xml_data": failure_dict}) - success_json_to_xml = dict_to_elements_tree(success_dict) - failure_json_to_xml = dict_to_elements_tree(failure_dict) - return success_json_to_xml, failure_json_to_xml + # 包裝成 xml_data 根節點 (Wrap into xml_data root node) + success_dict = {"xml_data": success_dict} + failure_dict = {"xml_data": failure_dict} + + success_xml_str = dict_to_elements_tree(success_dict) + failure_xml_str = dict_to_elements_tree(failure_dict) + + return success_xml_str, failure_xml_str -def generate_xml_report(xml_file_name: str = "default_name"): + +def generate_xml_report(xml_file_name: str = "default_name") -> Tuple[str, str]: """ - :param xml_file_name: + 輸出 XML 報告檔案 (Generate XML report files) + + :param xml_file_name: 輸出檔案名稱前綴 (Output file name prefix) + :return: (成功檔案路徑, 失敗檔案路徑) """ - success_xml, failure_xml = generate_xml() - success_xml = parseString(success_xml) - failure_xml = parseString(failure_xml) - success_xml = success_xml.toprettyxml() - failure_xml = failure_xml.toprettyxml() + success_xml_str, failure_xml_str = generate_xml() + + # 使用 minidom 美化輸出 (Pretty print XML using minidom) + success_xml = parseString(success_xml_str).toprettyxml() + failure_xml = parseString(failure_xml_str).toprettyxml() + lock = Lock() + success_path = f"{xml_file_name}_success.xml" + failure_path = f"{xml_file_name}_failure.xml" + try: - lock.acquire() - with open(xml_file_name + "_failure.xml", "w+") as file_to_write: - file_to_write.write(failure_xml) - except Exception as error: - print(repr(error), file=sys.stderr) - finally: - lock.release() - try: - lock.acquire() - with open(xml_file_name + "_success.xml", "w+") as file_to_write: - file_to_write.write(success_xml) + with lock: # 使用 with 確保自動 acquire/release + with open(failure_path, "w+", encoding="utf-8") as file_to_write: + file_to_write.write(failure_xml) + + with open(success_path, "w+", encoding="utf-8") as file_to_write: + file_to_write.write(success_xml) + + return success_path, failure_path + except Exception as error: print(repr(error), file=sys.stderr) - finally: - lock.release() + return "", "" \ No newline at end of file diff --git a/je_load_density/utils/get_data_strcture/get_api_data.py b/je_load_density/utils/get_data_strcture/get_api_data.py index db68bf9..c8b3d5f 100644 --- a/je_load_density/utils/get_data_strcture/get_api_data.py +++ b/je_load_density/utils/get_data_strcture/get_api_data.py @@ -1,34 +1,59 @@ +import requests import requests.exceptions +from typing import Union, Dict -def get_api_response_data(response: requests.Response, - start_time: [str, float, int], - end_time: [str, float, int]) -> dict: +def get_api_response_data( + response: requests.Response, + start_time: Union[str, float, int], + end_time: Union[str, float, int] +) -> Dict[str, Union[str, int, dict, bytes]]: """ - use requests response to create data dict - :param response: requests response - :param start_time: test start time - :param end_time: test end time - :return: data dict include [status_code, text, content, headers, history, encoding, cookies, - elapsed, request_time_sec, request_method, request_url, request_body, start_time, end_time] + 使用 requests.Response 建立測試資料字典 + Create a data dictionary from requests.Response + + :param response: requests response 物件 (requests response object) + :param start_time: 測試開始時間 (test start time) + :param end_time: 測試結束時間 (test end time) + :return: 包含以下欄位的字典 (dictionary including): + - status_code + - text + - content + - headers + - encoding + - cookies + - elapsed + - history + - request_method + - request_url + - request_body + - start_time + - end_time + - json (if status_code == 200 and response.json() is valid) """ - response_data = { + response_data: Dict[str, Union[str, int, dict, bytes]] = { "status_code": response.status_code, "text": response.text, "content": response.content, - "headers": response.headers, + "headers": dict(response.headers), "encoding": response.encoding, + "cookies": response.cookies.get_dict(), + "elapsed": response.elapsed.total_seconds() if response.elapsed else None, + "history": [r.url for r in response.history] if response.history else [], "request_method": response.request.method, "request_url": response.request.url, "request_body": response.request.body, "start_time": start_time, - "end_time": end_time + "end_time": end_time, } + + # 嘗試解析 JSON (Try parsing JSON) try: - if response_data.get("status_code") == 200: - response_data.update({"json": response.json()}) + if response.status_code == 200: + response_data["json"] = response.json() else: - response_data.update({"json": None}) - except requests.exceptions.JSONDecodeError: - response_data.update({"json": None}) - return response_data + response_data["json"] = None + except (requests.exceptions.JSONDecodeError, ValueError): + response_data["json"] = None + + return response_data \ No newline at end of file diff --git a/je_load_density/utils/json/json_file/json_file.py b/je_load_density/utils/json/json_file/json_file.py index 146c1e2..a71c678 100644 --- a/je_load_density/utils/json/json_file/json_file.py +++ b/je_load_density/utils/json/json_file/json_file.py @@ -1,42 +1,49 @@ import json from pathlib import Path from threading import Lock +from typing import Any, Union from je_load_density.utils.exception.exceptions import LoadDensityTestJsonException -from je_load_density.utils.exception.exception_tags import cant_find_json_error -from je_load_density.utils.exception.exception_tags import cant_save_json_error +from je_load_density.utils.exception.exception_tags import cant_find_json_error, cant_save_json_error -def read_action_json(json_file_path: str): +def read_action_json(json_file_path: str) -> Union[dict, list]: """ - read json include actions - :param json_file_path json file's path to read + 讀取 JSON 檔案並回傳內容 + Read JSON file and return its content + + :param json_file_path: JSON 檔案路徑 (path to JSON file) + :return: JSON 內容 (dict or list) + :raises LoadDensityTestJsonException: 當檔案不存在或無法讀取時 (if file not found or cannot be read) """ - _lock = Lock() + lock = Lock() try: - _lock.acquire() - file_path = Path(json_file_path) - if file_path.exists() and file_path.is_file(): - with open(json_file_path) as read_file: - return json.load(read_file) - except LoadDensityTestJsonException: - raise LoadDensityTestJsonException(cant_find_json_error) - finally: - _lock.release() + with lock: + file_path = Path(json_file_path) + if file_path.exists() and file_path.is_file(): + with open(json_file_path, "r", encoding="utf-8") as read_file: + return json.load(read_file) + else: + raise LoadDensityTestJsonException(cant_find_json_error) + except Exception as error: + # 捕捉所有錯誤並轉換成自訂例外 + # Catch all errors and raise custom exception + raise LoadDensityTestJsonException(f"{cant_find_json_error}: {error}") -def write_action_json(json_save_path: str, action_json: list): +def write_action_json(json_save_path: str, action_json: Union[dict, list]) -> None: """ - write json file - :param json_save_path json save path - :param action_json the json str include action to write + 將資料寫入 JSON 檔案 + Write data into JSON file + + :param json_save_path: JSON 檔案儲存路徑 (path to save JSON file) + :param action_json: 要寫入的資料 (data to write, dict or list) + :raises LoadDensityTestJsonException: 當檔案無法寫入時 (if file cannot be saved) """ - _lock = Lock() + lock = Lock() try: - _lock.acquire() - with open(json_save_path, "w+") as file_to_write: - file_to_write.write(json.dumps(action_json, indent=4)) - except LoadDensityTestJsonException: - raise LoadDensityTestJsonException(cant_save_json_error) - finally: - _lock.release() + with lock: + with open(json_save_path, "w+", encoding="utf-8") as file_to_write: + json.dump(action_json, file_to_write, indent=4, ensure_ascii=False) + except Exception as error: + raise LoadDensityTestJsonException(f"{cant_save_json_error}: {error}") \ No newline at end of file diff --git a/je_load_density/utils/logging/loggin_instance.py b/je_load_density/utils/logging/loggin_instance.py index dfbbde8..23feede 100644 --- a/je_load_density/utils/logging/loggin_instance.py +++ b/je_load_density/utils/logging/loggin_instance.py @@ -1,15 +1,58 @@ import logging import sys +from logging.handlers import RotatingFileHandler -load_density_logger = logging.getLogger("LoadDensity") -load_density_logger.setLevel(logging.INFO) -formatter = logging.Formatter('%(asctime)s | %(name)s | %(levelname)s | %(message)s') -# Stream handler -stream_handler = logging.StreamHandler(stream=sys.stderr) -stream_handler.setFormatter(formatter) -stream_handler.setLevel(logging.WARNING) -load_density_logger.addHandler(stream_handler) -# File handler -file_handler = logging.FileHandler(filename="LoadDensity.log", mode="w") -file_handler.setFormatter(formatter) -load_density_logger.addHandler(file_handler) + +class LoadDensityLogger: + """ + 封裝日誌系統 + Encapsulated logging system with rotating file handler + """ + + def __init__(self, + logger_name: str = "LoadDensity", + log_file: str = "LoadDensity.log", + max_bytes: int = 1024 * 1024 * 1024, # 1GB + backup_count: int = 5): + """ + 初始化 Logger + Initialize logger + + :param logger_name: Logger 名稱 (Logger name) + :param log_file: 日誌檔案名稱 (Log file name) + :param max_bytes: 單一檔案最大大小 (Max file size in bytes) + :param backup_count: 保留檔案數量 (Number of backup files) + """ + self.logger = logging.getLogger(logger_name) + self.logger.setLevel(logging.INFO) + + formatter = logging.Formatter( + '%(asctime)s | %(name)s | %(levelname)s | %(message)s' + ) + + # Stream handler (輸出到 stderr) + stream_handler = logging.StreamHandler(stream=sys.stderr) + stream_handler.setFormatter(formatter) + stream_handler.setLevel(logging.WARNING) + + # Rotating file handler (檔案大小限制 + 輪替) + file_handler = RotatingFileHandler( + filename=log_file, + mode="a", + maxBytes=max_bytes, + backupCount=backup_count, + encoding="utf-8" + ) + file_handler.setFormatter(formatter) + file_handler.setLevel(logging.INFO) + + # 加入 handlers + self.logger.addHandler(stream_handler) + self.logger.addHandler(file_handler) + + def get_logger(self) -> logging.Logger: + """取得 logger 實例 (Get logger instance)""" + return self.logger + + +load_density_logger = LoadDensityLogger().get_logger() diff --git a/je_load_density/utils/package_manager/package_manager_class.py b/je_load_density/utils/package_manager/package_manager_class.py index a9a1ee4..a461774 100644 --- a/je_load_density/utils/package_manager/package_manager_class.py +++ b/je_load_density/utils/package_manager/package_manager_class.py @@ -2,35 +2,61 @@ from importlib.util import find_spec from inspect import getmembers, isfunction from sys import stderr +from typing import Optional, Any -class PackageManager(object): +class PackageManager: + """ + 套件管理器 + Package Manager - def __init__(self): - self.installed_package_dict = { - } - self.executor = None + 用於動態載入套件並將其函式加入到 Executor 的事件字典。 + Used to dynamically load packages and register their functions into an Executor. + """ - def check_package(self, package: str): - if self.installed_package_dict.get(package, None) is None: + def __init__(self) -> None: + # 已載入的套件字典 (Dictionary of loaded packages) + self.installed_package_dict: dict[str, Any] = {} + # Executor 參考 (Reference to Executor instance) + self.executor: Optional[Any] = None + + def load_package_if_available(self, package: str) -> Optional[Any]: + """ + 嘗試載入套件 (Try to load a package) + + :param package: 套件名稱 (Package name) + :return: 套件模組或 None (Loaded module or None) + """ + if package not in self.installed_package_dict: found_spec = find_spec(package) if found_spec is not None: try: installed_package = import_module(found_spec.name) - self.installed_package_dict.update({found_spec.name: installed_package}) + self.installed_package_dict[found_spec.name] = installed_package except ModuleNotFoundError as error: print(repr(error), file=stderr) - return self.installed_package_dict.get(package, None) + return None + else: + return None + return self.installed_package_dict.get(package) + + def add_package_to_executor(self, package: str) -> None: + """ + 將套件的所有函式加入 Executor 的事件字典 + Add all functions from a package into the Executor's event dictionary - def add_package_to_executor(self, package): - installed_package = self.check_package(package) + :param package: 套件名稱 (Package name) + """ + installed_package = self.load_package_if_available(package) if installed_package is not None and self.executor is not None: - for function in getmembers(installed_package, isfunction): - self.executor.event_dict.update({str(function): function}) + for name, function in getmembers(installed_package, isfunction): + self.executor.event_dict[name] = function elif installed_package is None: print(repr(ModuleNotFoundError(f"Can't find package {package}")), file=stderr) else: - print(f"Executor error {self.executor}", file=stderr) + print(f"Executor error: {self.executor}", file=stderr) -package_manager = PackageManager() +# 建立全域 PackageManager 實例 +# Create global PackageManager instance +package_manager = PackageManager() \ No newline at end of file diff --git a/je_load_density/utils/project/create_project_structure.py b/je_load_density/utils/project/create_project_structure.py index 94cb525..efa35f6 100644 --- a/je_load_density/utils/project/create_project_structure.py +++ b/je_load_density/utils/project/create_project_structure.py @@ -1,58 +1,73 @@ from os import getcwd from pathlib import Path from threading import Lock +from typing import Optional from je_load_density.utils.json.json_file.json_file import write_action_json -from je_load_density.utils.project.template.template_executor import executor_template_1, \ - executor_template_2 -from je_load_density.utils.project.template.template_keyword import template_keyword_1, \ - template_keyword_2 +from je_load_density.utils.project.template.template_executor import executor_template_1, executor_template_2 +from je_load_density.utils.project.template.template_keyword import template_keyword_1, template_keyword_2 def create_dir(dir_name: str) -> None: """ - :param dir_name: create dir use dir name - :return: None + 建立目錄 + Create directory + + :param dir_name: 要建立的目錄名稱 (Directory name to create) """ - Path(dir_name).mkdir( - parents=True, - exist_ok=True - ) + Path(dir_name).mkdir(parents=True, exist_ok=True) + +def create_template(parent_name: str, project_path: Optional[str] = None) -> None: + """ + 建立模板檔案 (Create template files) -def create_template(parent_name: str, project_path: str = None) -> None: + :param parent_name: 專案主目錄名稱 (Project parent folder name) + :param project_path: 專案路徑 (Project path), 預設為當前工作目錄 (default: current working directory) + """ if project_path is None: project_path = getcwd() - keyword_dir_path = Path(project_path + "/" + parent_name + "/keyword") - executor_dir_path = Path(project_path + "/" + parent_name + "/executor") - lock = Lock() + + project_root = Path(project_path) / parent_name + keyword_dir_path = project_root / "keyword" + executor_dir_path = project_root / "executor" + + # 建立 keyword JSON 檔案 if keyword_dir_path.exists() and keyword_dir_path.is_dir(): - write_action_json(project_path + "/" + parent_name + "/keyword/keyword1.json", template_keyword_1) - write_action_json(project_path + "/" + parent_name + "/keyword/keyword2.json", template_keyword_2) - if executor_dir_path.exists() and keyword_dir_path.is_dir(): - lock.acquire() - try: - with open(project_path + "/" + parent_name + "/executor/executor_one_file.py", "w+") as file: + write_action_json(str(keyword_dir_path) + "keyword1.json", template_keyword_1) + write_action_json(str(keyword_dir_path) + "keyword2.json", template_keyword_2) + + # 建立 executor Python 檔案 + if executor_dir_path.exists() and executor_dir_path.is_dir(): + lock = Lock() + with lock: + with open(executor_dir_path / "executor_one_file.py", "w+", encoding="utf-8") as file: file.write( executor_template_1.replace( "{temp}", - project_path + "/" + parent_name + "/keyword/keyword1.json" + str(keyword_dir_path / "keyword1.json") ) ) - with open(project_path + "/" + parent_name + "/executor/executor_folder.py", "w+") as file: + with open(executor_dir_path / "executor_folder.py", "w+", encoding="utf-8") as file: file.write( executor_template_2.replace( "{temp}", - project_path + "/" + parent_name + "/keyword" + str(keyword_dir_path) ) ) - finally: - lock.release() -def create_project_dir(project_path: str = None, parent_name: str = "LoadDensity") -> None: +def create_project_dir(project_path: Optional[str] = None, parent_name: str = "LoadDensity") -> None: + """ + 建立專案目錄結構 (Create project directory structure) + + :param project_path: 專案路徑 (Project path), 預設為當前工作目錄 (default: current working directory) + :param parent_name: 專案主目錄名稱 (Project parent folder name) + """ if project_path is None: project_path = getcwd() - create_dir(project_path + "/" + parent_name + "/keyword") - create_dir(project_path + "/" + parent_name + "/executor") - create_template(parent_name) + + project_root = Path(project_path) / parent_name + create_dir(str(project_root) + "keyword") + create_dir(str(project_root) + "executor") + create_template(parent_name, project_path) \ No newline at end of file diff --git a/je_load_density/utils/socket_server/load_density_socket_server.py b/je_load_density/utils/socket_server/load_density_socket_server.py index 3f412a8..16a3a5e 100644 --- a/je_load_density/utils/socket_server/load_density_socket_server.py +++ b/je_load_density/utils/socket_server/load_density_socket_server.py @@ -1,6 +1,7 @@ import json import sys from socket import AF_INET, SOCK_STREAM +from typing import Any import gevent from gevent import monkey @@ -9,53 +10,86 @@ from je_load_density.utils.executor.action_executor import execute_action -class TCPServer(object): +class TCPServer: + """ + 基於 gevent 的 TCP 伺服器 + TCP server based on gevent - def __init__(self): + - 接收 JSON 指令並執行對應動作 + - 支援 "quit_server" 指令來關閉伺服器 + """ + + def __init__(self) -> None: self.close_flag: bool = False self.server: socket.socket = socket.socket(AF_INET, SOCK_STREAM) - def socket_server(self, host: str, port: int): + def socket_server(self, host: str, port: int) -> None: + """ + 啟動伺服器 + Start the TCP server + + :param host: 伺服器主機位址 (Server host) + :param port: 伺服器埠號 (Server port) + """ self.server.bind((host, port)) self.server.listen() + print(f"Server started on {host}:{port}", flush=True) + while not self.close_flag: - connection = self.server.accept()[0] - gevent.spawn(self.handle, connection) - sys.exit(0) - - def handle(self, connection): - connection_data = connection.recv(8192) - command_string = str(connection_data.strip(), encoding="utf-8") - print("command is: " + command_string, flush=True) - if command_string == "quit_server": - connection.close() - self.close_flag = True - self.server.close() - print("Now quit server", flush=True) - else: try: - execute_str = json.loads(command_string) - if execute_str is not None: - for execute_return in execute_action(execute_str).values(): - connection.send(str(execute_return).encode("utf-8")) - connection.send("\n".encode("utf-8")) - connection.send("Return_Data_Over_JE".encode("utf-8")) - connection.send("\n".encode("utf-8")) + connection, _ = self.server.accept() + gevent.spawn(self.handle, connection) except Exception as error: + print(f"Server error: {error}", file=sys.stderr) + break + + self.server.close() + print("Server shutdown complete", flush=True) + + def handle(self, connection: socket.socket) -> None: + """ + 處理單一連線 + Handle a single connection + + :param connection: 客戶端連線 (Client connection) + """ + try: + connection_data = connection.recv(8192) + if not connection_data: + return + + command_string = connection_data.strip().decode("utf-8") + print(f"Command received: {command_string}", flush=True) + + if command_string == "quit_server": + self.close_flag = True + connection.send(b"Server shutting down\n") + print("Now quit server", flush=True) + else: try: - connection.send(str(error).encode("utf-8")) - connection.send("\n".encode("utf-8")) - connection.send("Return_Data_Over_JE".encode("utf-8")) - connection.send("\n".encode("utf-8")) + execute_str: Any = json.loads(command_string) + if execute_str is not None: + for execute_return in execute_action(execute_str).values(): + connection.send(f"{execute_return}\n".encode("utf-8")) + connection.send(b"Return_Data_Over_JE\n") except Exception as error: - print(repr(error)) - sys.exit(1) - finally: - connection.close() + connection.send(f"Error: {error}\n".encode("utf-8")) + connection.send(b"Return_Data_Over_JE\n") + + finally: + connection.close() + +def start_load_density_socket_server(host: str = "localhost", port: int = 9940) -> TCPServer: + """ + 啟動 LoadDensity TCP 伺服器 + Start LoadDensity TCP server -def start_load_density_socket_server(host: str = "localhost", port: int = 9940): + :param host: 主機位址 (Host) + :param port: 埠號 (Port) + :return: TCPServer 實例 (TCPServer instance) + """ monkey.patch_all() server = TCPServer() server.socket_server(host, port) - return server + return server \ No newline at end of file diff --git a/je_load_density/utils/test_record/test_record_class.py b/je_load_density/utils/test_record/test_record_class.py index 751cf87..6427873 100644 --- a/je_load_density/utils/test_record/test_record_class.py +++ b/je_load_density/utils/test_record/test_record_class.py @@ -1,15 +1,30 @@ -class TestRecord(object): +from typing import List, Dict + + +class TestRecord: """ - data class to record success and failure test + 測試紀錄類別 + Test record class + + 用來保存成功與失敗的測試紀錄。 + Used to store success and failure test records. """ - def __init__(self): - self.test_record_list = list() - self.error_record_list = list() + def __init__(self) -> None: + # 成功測試紀錄 (Success test records) + self.test_record_list: List[Dict] = [] + # 失敗測試紀錄 (Failure test records) + self.error_record_list: List[Dict] = [] - def clean_record(self): - self.test_record_list = list() - self.error_record_list = list() + def clear_records(self) -> None: + """ + 清除所有測試紀錄 + Clear all test records + """ + self.test_record_list.clear() + self.error_record_list.clear() -test_record_instance = TestRecord() +# 建立全域測試紀錄實例 +# Create global test record instance +test_record_instance = TestRecord() \ No newline at end of file diff --git a/je_load_density/utils/xml/change_xml_structure/change_xml_structure.py b/je_load_density/utils/xml/change_xml_structure/change_xml_structure.py index fcb33ab..4c4a3af 100644 --- a/je_load_density/utils/xml/change_xml_structure/change_xml_structure.py +++ b/je_load_density/utils/xml/change_xml_structure/change_xml_structure.py @@ -1,61 +1,82 @@ from collections import defaultdict from xml.etree import ElementTree +from typing import Union, Dict, Any -def elements_tree_to_dict(elements_tree): +def elements_tree_to_dict(elements_tree: ElementTree.Element) -> Dict[str, Any]: """ - :param elements_tree: full xml string - :return: xml str to dict + 將 XML ElementTree 轉換為字典 + Convert XML ElementTree to dictionary + + :param elements_tree: XML ElementTree 元素 (XML ElementTree element) + :return: 對應的字典結構 (Dictionary representation) """ - elements_dict: dict = {elements_tree.tag: {} if elements_tree.attrib else None} - children: list = list(elements_tree) + elements_dict: Dict[str, Any] = {elements_tree.tag: {} if elements_tree.attrib else None} + children = list(elements_tree) + + # 遞迴處理子節點 (Recursively process children) if children: default_dict = defaultdict(list) for dc in map(elements_tree_to_dict, children): for key, value in dc.items(): default_dict[key].append(value) - elements_dict: dict = { - elements_tree.tag: {key: value[0] if len(value) == 1 else value for key, value in default_dict.items()}} + elements_dict[elements_tree.tag] = { + key: value[0] if len(value) == 1 else value + for key, value in default_dict.items() + } + + # 加入屬性 (Add attributes) if elements_tree.attrib: - elements_dict[elements_tree.tag].update(('@' + key, value) for key, value in elements_tree.attrib.items()) + elements_dict[elements_tree.tag].update( + {f"@{key}": value for key, value in elements_tree.attrib.items()} + ) + + # 加入文字內容 (Add text content) if elements_tree.text: text = elements_tree.text.strip() if children or elements_tree.attrib: if text: - elements_dict[elements_tree.tag]['#text'] = text + elements_dict[elements_tree.tag]["#text"] = text else: elements_dict[elements_tree.tag] = text + return elements_dict -def dict_to_elements_tree(json_dict: dict): +def dict_to_elements_tree(json_dict: Dict[str, Any]) -> str: """ - :param json_dict: json dict - :return: json dict to xml string + 將字典轉換為 XML 字串 + Convert dictionary to XML string + + :param json_dict: JSON 格式字典 (Dictionary in JSON-like format) + :return: XML 字串 (XML string) """ - def _to_elements_tree(json_dict: dict, root): + def _to_elements_tree(json_dict: Any, root: ElementTree.Element) -> None: if isinstance(json_dict, str): root.text = json_dict elif isinstance(json_dict, dict): for key, value in json_dict.items(): - assert isinstance(key, str) - if key.startswith('#'): - assert key == '#text' and isinstance(value, str) + if key.startswith("#"): # 處理文字節點 + if key != "#text" or not isinstance(value, str): + raise TypeError(f"Invalid text node: {key} -> {value}") root.text = value - elif key.startswith('@'): - assert isinstance(value, str) + elif key.startswith("@"): # 處理屬性 + if not isinstance(value, str): + raise TypeError(f"Invalid attribute value: {key} -> {value}") root.set(key[1:], value) - elif isinstance(value, list): - for elements in value: - _to_elements_tree(elements, ElementTree.SubElement(root, key)) - else: + elif isinstance(value, list): # 處理子節點清單 + for element in value: + _to_elements_tree(element, ElementTree.SubElement(root, key)) + else: # 處理單一子節點 _to_elements_tree(value, ElementTree.SubElement(root, key)) else: - raise TypeError('invalid type: ' + str(type(json_dict))) + raise TypeError(f"Invalid type in dict_to_elements_tree: {type(json_dict)}") + + if not isinstance(json_dict, dict) or len(json_dict) != 1: + raise ValueError("Input must be a dictionary with a single root element") - assert isinstance(json_dict, dict) and len(json_dict) == 1 tag, body = next(iter(json_dict.items())) node = ElementTree.Element(tag) _to_elements_tree(body, node) - return str(ElementTree.tostring(node), encoding="utf-8") + return ElementTree.tostring(node, encoding="utf-8").decode("utf-8") \ No newline at end of file diff --git a/je_load_density/utils/xml/xml_file/xml_file.py b/je_load_density/utils/xml/xml_file/xml_file.py index 93400bc..216ace1 100644 --- a/je_load_density/utils/xml/xml_file/xml_file.py +++ b/je_load_density/utils/xml/xml_file/xml_file.py @@ -1,67 +1,96 @@ import xml.dom.minidom from xml.etree import ElementTree +from xml.etree.ElementTree import ParseError +from typing import Optional -from je_load_density.utils.exception.exception_tags import cant_read_xml_error -from je_load_density.utils.exception.exception_tags import xml_type_error -from je_load_density.utils.exception.exceptions import XMLException -from je_load_density.utils.exception.exceptions import XMLTypeException +from je_load_density.utils.exception.exception_tags import cant_read_xml_error, xml_type_error +from je_load_density.utils.exception.exceptions import XMLException, XMLTypeException -def reformat_xml_file(xml_string: str): +def reformat_xml_file(xml_string: str) -> str: + """ + 將 XML 字串重新格式化為漂亮的排版 + Reformat XML string into pretty-printed format + + :param xml_string: 原始 XML 字串 (Raw XML string) + :return: 格式化後的 XML 字串 (Pretty-printed XML string) + """ dom = xml.dom.minidom.parseString(xml_string) - return dom.toprettyxml() + return dom.toprettyxml(indent=" ") + +class XMLParser: + """ + XML 解析器 + XML Parser -class XMLParser(object): + 支援從字串或檔案解析 XML,並能將 XML 寫入檔案。 + Supports parsing XML from string or file, and writing XML to file. + """ - def __init__(self, xml_string: str, xml_type: str = "string"): + def __init__(self, xml_string: str, xml_type: str = "string") -> None: """ - :param xml_string: full xml string - :param xml_type: file or string + 初始化 XMLParser + Initialize XMLParser + + :param xml_string: XML 字串或檔案路徑 (XML string or file path) + :param xml_type: "string" 或 "file" (Parse from string or file) """ - self.element_tree = ElementTree - self.tree = None - self.xml_root = None - self.xml_from_type = "string" - self.xml_string = xml_string.strip() + self.tree: Optional[ElementTree.ElementTree] = None + self.xml_root: Optional[ElementTree.Element] = None + self.xml_from_type: str = "string" + self.xml_string: str = xml_string.strip() + xml_type = xml_type.lower() if xml_type not in ["file", "string"]: raise XMLTypeException(xml_type_error) + if xml_type == "string": self.xml_parser_from_string() else: self.xml_parser_from_file() - def xml_parser_from_string(self, **kwargs): + def xml_parser_from_string(self, **kwargs) -> ElementTree.Element: """ - :param kwargs: any another param - :return: xml root element tree + 從字串解析 XML + Parse XML from string + + :param kwargs: 額外參數 (extra parameters) + :return: XML 根節點 (XML root element) """ try: self.xml_root = ElementTree.fromstring(self.xml_string, **kwargs) - except XMLException: - raise XMLException(cant_read_xml_error) + except ParseError as error: + raise XMLException(f"{cant_read_xml_error}: {error}") return self.xml_root - def xml_parser_from_file(self, **kwargs): + def xml_parser_from_file(self, **kwargs) -> ElementTree.Element: """ - :param kwargs: any another param - :return: xml root element tree + 從檔案解析 XML + Parse XML from file + + :param kwargs: 額外參數 (extra parameters) + :return: XML 根節點 (XML root element) """ try: self.tree = ElementTree.parse(self.xml_string, **kwargs) - except XMLException: - raise XMLException(cant_read_xml_error) + except (ParseError, OSError) as error: + raise XMLException(f"{cant_read_xml_error}: {error}") self.xml_root = self.tree.getroot() self.xml_from_type = "file" return self.xml_root - def write_xml(self, write_xml_filename: str, write_content: str): + def write_xml(self, write_xml_filename: str, write_content: str) -> None: """ - :param write_xml_filename: xml file name - :param write_content: content to write + 將 XML 字串寫入檔案 + Write XML string into file + + :param write_xml_filename: 輸出檔案名稱 (Output file name) + :param write_content: XML 字串內容 (XML string content) """ - write_content = write_content.strip() - content = self.element_tree.fromstring(write_content) - tree = self.element_tree.ElementTree(content) - tree.write(write_xml_filename, encoding="utf-8") + try: + content = ElementTree.fromstring(write_content.strip()) + tree = ElementTree.ElementTree(content) + tree.write(write_xml_filename, encoding="utf-8", xml_declaration=True) + except ParseError as error: + raise XMLException(f"{cant_read_xml_error}: {error}") \ No newline at end of file diff --git a/je_load_density/wrapper/create_locust_env/create_locust_env.py b/je_load_density/wrapper/create_locust_env/create_locust_env.py index 601f580..abe59a2 100644 --- a/je_load_density/wrapper/create_locust_env/create_locust_env.py +++ b/je_load_density/wrapper/create_locust_env/create_locust_env.py @@ -1,3 +1,5 @@ +from typing import List + import gevent from locust import User from locust import events @@ -10,7 +12,7 @@ setup_logging("INFO", None) -def prepare_env(user_class: [User], user_count: int = 50, spawn_rate: int = 10, test_time: int = 60, +def prepare_env(user_class: List[User], user_count: int = 50, spawn_rate: int = 10, test_time: int = 60, web_ui_dict: dict = None, **kwargs): """ @@ -37,7 +39,7 @@ def prepare_env(user_class: [User], user_count: int = 50, spawn_rate: int = 10, env.web_ui.stop() -def create_env(user_class: [User], another_event: events = events): +def create_env(user_class: List[User], another_event: events = events): """ :param another_event: you can use your locust event setting but don't change locust request event :param user_class: locust user class diff --git a/je_load_density/wrapper/event/request_hook.py b/je_load_density/wrapper/event/request_hook.py index bb0c48b..3dab409 100644 --- a/je_load_density/wrapper/event/request_hook.py +++ b/je_load_density/wrapper/event/request_hook.py @@ -4,37 +4,45 @@ @events.request.add_listener def request_hook( - start_time, - url, - request_type, - name, - context, - response, - exception, - response_length, - response_time, - **kwargs + start_time, + url, + request_type, + name, + context, + response, + exception, + response_length, + response_time, + **kwargs ): + """ + Locust request hook + 將每個 request 的結果紀錄到 test_record_instance + """ + if exception is None: + # 成功紀錄 (Success record) test_record_instance.test_record_list.append( { "Method": str(request_type), "test_url": str(url), "name": str(name), + "status_code": str(response.status_code), "text": str(response.text), "content": str(response.content), "headers": str(response.headers), - "status_code": str(response.status_code), - "error": str(exception) + "error": None, # 成功時 error 為 None } ) else: + # 失敗紀錄 (Failure record) test_record_instance.error_record_list.append( { "Method": str(request_type), "test_url": str(url), "name": str(name), - "status_code": str(response.status_code), - "text": str(response.text) + "status_code": str(response.status_code) if response else None, + "text": str(response.text) if response else None, + "error": str(exception), # 失敗時紀錄 exception } - ) + ) \ No newline at end of file diff --git a/je_load_density/wrapper/proxy/proxy_user.py b/je_load_density/wrapper/proxy/proxy_user.py index 40c7a84..6f1e2e3 100644 --- a/je_load_density/wrapper/proxy/proxy_user.py +++ b/je_load_density/wrapper/proxy/proxy_user.py @@ -1,17 +1,45 @@ +from typing import Dict, Any from je_load_density.wrapper.proxy.user.fast_http_user_proxy import ProxyFastHTTPUser from je_load_density.wrapper.proxy.user.http_user_proxy import ProxyHTTPUser -class LocustUserProxy(object): +class LocustUserProxy: + """ + Locust 使用者代理容器 + Locust User Proxy Container - def __init__(self): - self.user_dict = dict() - self.user_dict.update( - { - "fast_http_user": ProxyFastHTTPUser(), - "http_user": ProxyHTTPUser() - } - ) + 用來保存並管理 FastHTTPUser 與 HTTPUser 的代理。 + Used to store and manage FastHTTPUser and HTTPUser proxies. + """ + def __init__(self) -> None: + # 使用者代理字典 (User proxy dictionary) + self.user_dict: Dict[str, Any] = { + "fast_http_user": ProxyFastHTTPUser(), + "http_user": ProxyHTTPUser(), + } -locust_wrapper_proxy = LocustUserProxy() + def get_user(self, user_type: str) -> Any: + """ + 取得指定類型的使用者代理 + Get specified user proxy + + :param user_type: "fast_http_user" 或 "http_user" + :return: 對應的使用者代理 (Corresponding user proxy) + """ + return self.user_dict.get(user_type) + + def set_user(self, user_type: str, user_instance: Any) -> None: + """ + 設定或替換使用者代理 + Set or replace user proxy + + :param user_type: 使用者類型 (User type key) + :param user_instance: 使用者代理實例 (User proxy instance) + """ + self.user_dict[user_type] = user_instance + + +# 建立全域代理容器實例 +# Create global proxy container instance +locust_wrapper_proxy = LocustUserProxy() \ No newline at end of file diff --git a/je_load_density/wrapper/proxy/user/fast_http_user_proxy.py b/je_load_density/wrapper/proxy/user/fast_http_user_proxy.py index ff5ad38..d645a2e 100644 --- a/je_load_density/wrapper/proxy/user/fast_http_user_proxy.py +++ b/je_load_density/wrapper/proxy/user/fast_http_user_proxy.py @@ -1,9 +1,28 @@ -class ProxyFastHTTPUser(object): +from typing import Dict, Any, List, Optional - def __init__(self): - self.user_detail_dict = None - self.tasks = None - def setting(self, user_detail_dict: dict, tasks): +class ProxyFastHTTPUser: + """ + 代理使用者類別 + Proxy Fast HTTP User class + + 用來保存使用者細節與任務設定。 + Used to store user details and tasks configuration. + """ + + def __init__(self) -> None: + # 使用者細節 (User details) + self.user_detail_dict: Optional[Dict[str, Any]] = None + # 任務列表 (Tasks list) + self.tasks: Optional[List[Any]] = None + + def configure(self, user_detail_dict: Dict[str, Any], tasks: List[Any]) -> None: + """ + 設定使用者細節與任務 + Configure user details and tasks + + :param user_detail_dict: 使用者細節字典 (User details dictionary) + :param tasks: 任務列表 (List of tasks) + """ self.user_detail_dict = user_detail_dict - self.tasks = tasks + self.tasks = tasks \ No newline at end of file diff --git a/je_load_density/wrapper/proxy/user/http_user_proxy.py b/je_load_density/wrapper/proxy/user/http_user_proxy.py index fe26fd1..2caadb2 100644 --- a/je_load_density/wrapper/proxy/user/http_user_proxy.py +++ b/je_load_density/wrapper/proxy/user/http_user_proxy.py @@ -1,9 +1,40 @@ -class ProxyHTTPUser(object): +from typing import Dict, Any, Callable, List, Optional - def __init__(self): - self.user_detail_dict = None - self.tasks = None - def setting(self, user_detail_dict: dict, tasks: dict): +class ProxyHTTPUser: + """ + 代理 HTTP 使用者類別 + Proxy HTTP User class + + 用來保存使用者細節與任務設定。 + Used to store user details and tasks configuration. + """ + + def __init__(self) -> None: + # 使用者細節 (User details) + self.user_detail_dict: Optional[Dict[str, Any]] = None + # 任務列表 (Tasks list, 可是函式或其他可呼叫物件) + self.tasks: Optional[List[Callable]] = None + + def configure(self, user_detail_dict: Dict[str, Any], tasks: List[Callable]) -> None: + """ + 設定使用者細節與任務 + Configure user details and tasks + + :param user_detail_dict: 使用者細節字典 (User details dictionary) + :param tasks: 任務列表 (List of tasks, functions or callables) + """ self.user_detail_dict = user_detail_dict self.tasks = tasks + + def run_tasks(self) -> None: + """ + 執行所有任務 + Run all tasks + """ + if not self.tasks: + print("No tasks configured.") + return + for task in self.tasks: + if callable(task): + task(self.user_detail_dict) \ No newline at end of file diff --git a/je_load_density/wrapper/start_wrapper/start_test.py b/je_load_density/wrapper/start_wrapper/start_test.py index c2423b0..2eeb3e6 100644 --- a/je_load_density/wrapper/start_wrapper/start_test.py +++ b/je_load_density/wrapper/start_wrapper/start_test.py @@ -1,3 +1,4 @@ +from typing import Dict, Any, Optional from je_load_density.utils.logging.loggin_instance import load_density_logger from je_load_density.wrapper.create_locust_env.create_locust_env import prepare_env from je_load_density.wrapper.user_template.fast_http_user_template import FastHttpUserWrapper, set_wrapper_fasthttp_user @@ -5,37 +6,63 @@ def start_test( - user_detail_dict: dict, - user_count: int = 50, spawn_rate: int = 10, test_time: int = 60, - web_ui_dict: dict = None, - **kwargs -): + user_detail_dict: Dict[str, Any], + user_count: int = 50, + spawn_rate: int = 10, + test_time: Optional[int] = 60, + web_ui_dict: Optional[Dict[str, Any]] = None, + **kwargs +) -> Dict[str, Any]: """ - :param user_detail_dict: dict use to create user - :param user_count: how many user we want to spawn - :param spawn_rate: one time will spawn how many user - :param test_time: total test run time - :param web_ui_dict: web ui dict include host and port like {"host": "127.0.0.1", "port": 8089} - :param kwargs: to catch unknown param - :return: None + 啟動壓力測試 + Start load test + + :param user_detail_dict: 使用者設定字典 (User detail dictionary) + :param user_count: 使用者數量 (Number of users to spawn) + :param spawn_rate: 每秒生成使用者數量 (Spawn rate per second) + :param test_time: 測試持續時間 (Test duration in seconds) + :param web_ui_dict: Web UI 設定,例如 {"host": "127.0.0.1", "port": 8089} + :param kwargs: 其他參數 (extra parameters) + :return: 測試設定摘要字典 (Summary dictionary of test configuration) """ load_density_logger.info( - f"start_test, user_detail_dict: {user_detail_dict}, user_count: {user_count}, " - f"spawn_rate: {spawn_rate}, test_time: {test_time}, web_ui_dict: {web_ui_dict}, " - f"params: {kwargs}" + f"start_test, user_detail_dict={user_detail_dict}, user_count={user_count}, " + f"spawn_rate={spawn_rate}, test_time={test_time}, web_ui_dict={web_ui_dict}, params={kwargs}" ) + + # 使用者類型映射 (User type mapping) user_dict = { "fast_http_user": {"actually_user": FastHttpUserWrapper, "init": set_wrapper_fasthttp_user}, - "http_user": {"actually_user": HttpUserWrapper, "init": set_wrapper_http_user} + "http_user": {"actually_user": HttpUserWrapper, "init": set_wrapper_http_user}, } - user = user_dict.get(user_detail_dict.get("user", "fast_http_user")) - actually_user = user.get("actually_user", "actually_user") - init_function = user.get("init", "init") + + user_type = user_detail_dict.get("user", "fast_http_user") + user = user_dict.get(user_type) + + if user is None: + raise ValueError(f"Unsupported user type: {user_type}") + + actually_user = user["actually_user"] + init_function = user["init"] + + # 初始化使用者設定 (Initialize user configuration) init_function(user_detail_dict, **kwargs) + # 建立並執行測試環境 (Create and run test environment) prepare_env( - user_class=actually_user, user_count=user_count, spawn_rate=spawn_rate, test_time=test_time, - web_ui_dict=web_ui_dict, **kwargs + user_class=actually_user, + user_count=user_count, + spawn_rate=spawn_rate, + test_time=test_time, + web_ui_dict=web_ui_dict, + **kwargs ) - return str(user_detail_dict) + " " + "user_count: " + str(user_count) + " spawn_rate: " + str( - spawn_rate) + " test_time: " + str(test_time) + + # 回傳結構化結果 (Return structured result) + return { + "user_detail": user_detail_dict, + "user_count": user_count, + "spawn_rate": spawn_rate, + "test_time": test_time, + "web_ui": web_ui_dict, + } \ No newline at end of file diff --git a/je_load_density/wrapper/user_template/fast_http_user_template.py b/je_load_density/wrapper/user_template/fast_http_user_template.py index eab3d3d..9e90614 100644 --- a/je_load_density/wrapper/user_template/fast_http_user_template.py +++ b/je_load_density/wrapper/user_template/fast_http_user_template.py @@ -1,24 +1,30 @@ -from locust import FastHttpUser, between -from locust import task - +from typing import Dict, Any +from locust import FastHttpUser, between, task from je_load_density.wrapper.proxy.proxy_user import locust_wrapper_proxy -def set_wrapper_fasthttp_user(user_detail_dict, **kwargs): - locust_wrapper_proxy.user_dict.get("fast_http_user").setting(user_detail_dict, **kwargs) +def set_wrapper_fasthttp_user(user_detail_dict: Dict[str, Any], **kwargs) -> type: + """ + 設定 FastHttpUser 的代理使用者 + Configure FastHttpUser proxy user + """ + locust_wrapper_proxy.user_dict.get("fast_http_user").configure(user_detail_dict, **kwargs) return FastHttpUserWrapper class FastHttpUserWrapper(FastHttpUser): """ - locust fast http user use to test + Locust FastHttpUser 包裝類別 + Locust FastHttpUser wrapper class """ + host = "http://localhost" wait_time = between(0.1, 0.2) def __init__(self, environment): super().__init__(environment) - self.method = { + # HTTP 方法映射 (HTTP method mapping) + self.method: Dict[str, Any] = { "get": self.client.get, "post": self.client.post, "put": self.client.put, @@ -29,6 +35,18 @@ def __init__(self, environment): } @task - def test(self): - for test_task_method, test_task_data in locust_wrapper_proxy.user_dict.get("fast_http_user").tasks.items(): - self.method.get(str(test_task_method).lower())(test_task_data.get("request_url")) + def test(self) -> None: + """ + 執行測試任務 + Execute test tasks + """ + proxy_user = locust_wrapper_proxy.user_dict.get("fast_http_user") + if not proxy_user or not proxy_user.tasks: + return + + for test_task_method, test_task_data in proxy_user.tasks.items(): + http_method = self.method.get(str(test_task_method).lower()) + if http_method and isinstance(test_task_data, dict): + request_url = test_task_data.get("request_url") + if request_url: + http_method(request_url) \ No newline at end of file diff --git a/je_load_density/wrapper/user_template/http_user_template.py b/je_load_density/wrapper/user_template/http_user_template.py index 9fec1ac..0e64999 100644 --- a/je_load_density/wrapper/user_template/http_user_template.py +++ b/je_load_density/wrapper/user_template/http_user_template.py @@ -1,23 +1,32 @@ +from typing import Dict, Any + from locust import HttpUser, task, between from je_load_density.wrapper.proxy.proxy_user import locust_wrapper_proxy -def set_wrapper_http_user(user_detail_dict: dict, **kwargs): - locust_wrapper_proxy.user_dict.get("http_user").setting(user_detail_dict, **kwargs) +def set_wrapper_http_user(user_detail_dict: Dict[str, Any], **kwargs) -> type: + """ + 設定 HttpUser 的代理使用者 + Configure HttpUser proxy user + """ + locust_wrapper_proxy.user_dict.get("http_user").configure(user_detail_dict, **kwargs) return HttpUserWrapper class HttpUserWrapper(HttpUser): """ - locust http user use to test + Locust HttpUser 包裝類別 + Locust HttpUser wrapper class """ + host = "http://localhost" wait_time = between(0.1, 0.2) def __init__(self, environment): super().__init__(environment) - self.method = { + # HTTP 方法映射 (HTTP method mapping) + self.method: Dict[str, Any] = { "get": self.client.get, "post": self.client.post, "put": self.client.put, @@ -28,8 +37,18 @@ def __init__(self, environment): } @task - def test(self): - for test_task_method, test_task_data in locust_wrapper_proxy.user_dict.get("http_user").tasks.items(): - self.method.get(str(test_task_method).lower())(test_task_data.get("request_url")) - - + def test(self) -> None: + """ + 執行測試任務 + Execute test tasks + """ + proxy_user = locust_wrapper_proxy.user_dict.get("http_user") + if not proxy_user or not proxy_user.tasks: + return + + for test_task_method, test_task_data in proxy_user.tasks.items(): + http_method = self.method.get(str(test_task_method).lower()) + if http_method and isinstance(test_task_data, dict): + request_url = test_task_data.get("request_url") + if request_url: + http_method(request_url) diff --git a/pyproject.toml b/pyproject.toml index 9053aaa..2d993e5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,12 +1,12 @@ -# Rename to stable version -# This is stable version +# Rename to dev version +# This is dev version [build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] -name = "je_load_density" -version = "0.0.63" +name = "je_load_density_dev" +version = "0.0.78" authors = [ { name = "JE-Chen", email = "jechenmailman@gmail.com" }, ] diff --git a/dev.toml b/stable.toml similarity index 91% rename from dev.toml rename to stable.toml index 91cad16..9053aaa 100644 --- a/dev.toml +++ b/stable.toml @@ -1,12 +1,12 @@ -# Rename to dev version -# This is dev version +# Rename to stable version +# This is stable version [build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] -name = "je_load_density_dev" -version = "0.0.77" +name = "je_load_density" +version = "0.0.63" authors = [ { name = "JE-Chen", email = "jechenmailman@gmail.com" }, ] diff --git a/test/unit_test/scheduler_test/sec_cron_test.py b/test/unit_test/scheduler_test/sec_cron_test.py deleted file mode 100644 index cf5ecd5..0000000 --- a/test/unit_test/scheduler_test/sec_cron_test.py +++ /dev/null @@ -1,12 +0,0 @@ -from je_load_density import SchedulerManager - - -def test_scheduler(): - print("Test Scheduler") - scheduler.remove_blocking_job(id="test") - scheduler.shutdown_blocking_scheduler() - - -scheduler = SchedulerManager() -scheduler.add_cron_blocking(function=test_scheduler, id="test", second="*") -scheduler.start_block_scheduler() diff --git a/test/unit_test/scheduler_test/sec_interval_test.py b/test/unit_test/scheduler_test/sec_interval_test.py deleted file mode 100644 index c4c1cd9..0000000 --- a/test/unit_test/scheduler_test/sec_interval_test.py +++ /dev/null @@ -1,12 +0,0 @@ -from je_load_density import SchedulerManager - - -def test_scheduler(): - print("Test Scheduler") - scheduler.remove_blocking_job(id="test") - scheduler.shutdown_blocking_scheduler() - - -scheduler = SchedulerManager() -scheduler.add_interval_blocking_secondly(function=test_scheduler, id="test") -scheduler.start_block_scheduler() diff --git a/test/unit_test/user_test/fast_http_user_test.py b/test/unit_test/user_test/fast_http_user_test.py index c717b2d..e356ee7 100644 --- a/test/unit_test/user_test/fast_http_user_test.py +++ b/test/unit_test/user_test/fast_http_user_test.py @@ -4,7 +4,7 @@ { "user": "fast_http_user", }, - 1000, 100, 30, + 10, 1, 10, web_ui_dict= { "host": "127.0.0.1", diff --git a/test/unit_test/user_test/http_user_test.py b/test/unit_test/user_test/http_user_test.py index 19987d6..c0043fb 100644 --- a/test/unit_test/user_test/http_user_test.py +++ b/test/unit_test/user_test/http_user_test.py @@ -4,7 +4,7 @@ { "user": "http_user", }, - 50, 10, 5, + 10, 1, 10, **{ "tasks": { "get": {"request_url": "http://httpbin.org/get"}, From 87814a9342baa06c0a0e70400880cb96cd8f34c5 Mon Sep 17 00:00:00 2001 From: JE-Chen Date: Sat, 8 Nov 2025 04:55:56 +0800 Subject: [PATCH 2/5] Update Test & README * Edit README.md * Using PyTest instead * Edit GitHub Actions --- .github/workflows/dev_python3_10.yml | 18 +- .github/workflows/dev_python3_11.yml | 18 +- .github/workflows/dev_python3_12.yml | 18 +- .github/workflows/stable_python3_10.yml | 20 +- .github/workflows/stable_python3_11.yml | 20 +- .github/workflows/stable_python3_12.yml | 20 +- README.md | 73 ++-- .../LoadDnesity_Archirecture.drawio | 406 ------------------ .../LoadDnesity_Archirecture.drawio.png | Bin 444750 -> 0 bytes test/__init__.py | 0 test/unit_test/callback_test/callback_test.py | 10 +- .../create_project/create_project.py | 3 +- test/unit_test/executor_test/execute.py | 23 +- .../generate_report/generate_html_report.py | 26 +- .../generate_report/generate_json_report.py | 26 +- .../generate_report/generate_xml_report.py | 26 +- .../user_test/fast_http_user_test.py | 35 +- test/unit_test/user_test/http_user_test.py | 25 +- 18 files changed, 137 insertions(+), 630 deletions(-) delete mode 100644 architecture_diagram/LoadDnesity_Archirecture.drawio delete mode 100644 architecture_diagram/LoadDnesity_Archirecture.drawio.png create mode 100644 test/__init__.py diff --git a/.github/workflows/dev_python3_10.yml b/.github/workflows/dev_python3_10.yml index b0f1fb2..8fe12d5 100644 --- a/.github/workflows/dev_python3_10.yml +++ b/.github/workflows/dev_python3_10.yml @@ -25,19 +25,5 @@ jobs: run: | python -m pip install --upgrade pip wheel pip install -r dev_requirements.txt - - name: Test Fast HTTP User - run: python ./test/unit_test/user_test/fast_http_user_test.py - - name: TestMulti Action User - run: python ./test/unit_test/user_test/http_user_test.py - - name: Test Callback - run: python ./test/unit_test/callback_test/callback_test.py - - name: Test Create Project - run: python ./test/unit_test/create_project/create_project.py - - name: Test Generate HTML Report - run: python ./test/unit_test/generate_report/generate_html_report.py - - name: Test Generate XML Report - run: python ./test/unit_test/generate_report/generate_xml_report.py - - name: Test Generate JSON Report - run: python ./test/unit_test/generate_report/generate_json_report.py - - name: Test Executor - run: python ./test/unit_test/executor_test/execute.py \ No newline at end of file + - name: PyTest + run: python -m pytest -v \ No newline at end of file diff --git a/.github/workflows/dev_python3_11.yml b/.github/workflows/dev_python3_11.yml index 65d836f..95624de 100644 --- a/.github/workflows/dev_python3_11.yml +++ b/.github/workflows/dev_python3_11.yml @@ -25,19 +25,5 @@ jobs: run: | python -m pip install --upgrade pip wheel pip install -r dev_requirements.txt - - name: Test Fast HTTP User - run: python ./test/unit_test/user_test/fast_http_user_test.py - - name: TestMulti Action User - run: python ./test/unit_test/user_test/http_user_test.py - - name: Test Callback - run: python ./test/unit_test/callback_test/callback_test.py - - name: Test Create Project - run: python ./test/unit_test/create_project/create_project.py - - name: Test Generate HTML Report - run: python ./test/unit_test/generate_report/generate_html_report.py - - name: Test Generate XML Report - run: python ./test/unit_test/generate_report/generate_xml_report.py - - name: Test Generate JSON Report - run: python ./test/unit_test/generate_report/generate_json_report.py - - name: Test Executor - run: python ./test/unit_test/executor_test/execute.py \ No newline at end of file + - name: PyTest + run: python -m pytest -v \ No newline at end of file diff --git a/.github/workflows/dev_python3_12.yml b/.github/workflows/dev_python3_12.yml index 31bef5c..a1c7736 100644 --- a/.github/workflows/dev_python3_12.yml +++ b/.github/workflows/dev_python3_12.yml @@ -25,19 +25,5 @@ jobs: run: | python -m pip install --upgrade pip wheel pip install -r dev_requirements.txt - - name: Test Fast HTTP User - run: python ./test/unit_test/user_test/fast_http_user_test.py - - name: TestMulti Action User - run: python ./test/unit_test/user_test/http_user_test.py - - name: Test Callback - run: python ./test/unit_test/callback_test/callback_test.py - - name: Test Create Project - run: python ./test/unit_test/create_project/create_project.py - - name: Test Generate HTML Report - run: python ./test/unit_test/generate_report/generate_html_report.py - - name: Test Generate XML Report - run: python ./test/unit_test/generate_report/generate_xml_report.py - - name: Test Generate JSON Report - run: python ./test/unit_test/generate_report/generate_json_report.py - - name: Test Executor - run: python ./test/unit_test/executor_test/execute.py \ No newline at end of file + - name: PyTest + run: python -m pytest -v \ No newline at end of file diff --git a/.github/workflows/stable_python3_10.yml b/.github/workflows/stable_python3_10.yml index 6b4e74e..4d4131e 100644 --- a/.github/workflows/stable_python3_10.yml +++ b/.github/workflows/stable_python3_10.yml @@ -25,19 +25,7 @@ jobs: run: | python -m pip install --upgrade pip wheel pip install -r requirements.txt - - name: Test Fast HTTP User - run: python ./test/unit_test/user_test/fast_http_user_test.py - - name: TestMulti Action User - run: python ./test/unit_test/user_test/http_user_test.py - - name: Test Callback - run: python ./test/unit_test/callback_test/callback_test.py - - name: Test Create Project - run: python ./test/unit_test/create_project/create_project.py - - name: Test Generate HTML Report - run: python ./test/unit_test/generate_report/generate_html_report.py - - name: Test Generate XML Report - run: python ./test/unit_test/generate_report/generate_xml_report.py - - name: Test Generate JSON Report - run: python ./test/unit_test/generate_report/generate_json_report.py - - name: Test Executor - run: python ./test/unit_test/executor_test/execute.py \ No newline at end of file + - name: Install PyTest + run: pip install -r pytest + - name: PyTest + run: python -m pytest -v \ No newline at end of file diff --git a/.github/workflows/stable_python3_11.yml b/.github/workflows/stable_python3_11.yml index 2d429eb..a589112 100644 --- a/.github/workflows/stable_python3_11.yml +++ b/.github/workflows/stable_python3_11.yml @@ -25,19 +25,7 @@ jobs: run: | python -m pip install --upgrade pip wheel pip install -r requirements.txt - - name: Test Fast HTTP User - run: python ./test/unit_test/user_test/fast_http_user_test.py - - name: TestMulti Action User - run: python ./test/unit_test/user_test/http_user_test.py - - name: Test Callback - run: python ./test/unit_test/callback_test/callback_test.py - - name: Test Create Project - run: python ./test/unit_test/create_project/create_project.py - - name: Test Generate HTML Report - run: python ./test/unit_test/generate_report/generate_html_report.py - - name: Test Generate XML Report - run: python ./test/unit_test/generate_report/generate_xml_report.py - - name: Test Generate JSON Report - run: python ./test/unit_test/generate_report/generate_json_report.py - - name: Test Executor - run: python ./test/unit_test/executor_test/execute.py \ No newline at end of file + - name: Install PyTest + run: pip install -r pytest + - name: PyTest + run: python -m pytest -v \ No newline at end of file diff --git a/.github/workflows/stable_python3_12.yml b/.github/workflows/stable_python3_12.yml index 36da0db..a637983 100644 --- a/.github/workflows/stable_python3_12.yml +++ b/.github/workflows/stable_python3_12.yml @@ -25,19 +25,7 @@ jobs: run: | python -m pip install --upgrade pip wheel pip install -r requirements.txt - - name: Test Fast HTTP User - run: python ./test/unit_test/user_test/fast_http_user_test.py - - name: TestMulti Action User - run: python ./test/unit_test/user_test/http_user_test.py - - name: Test Callback - run: python ./test/unit_test/callback_test/callback_test.py - - name: Test Create Project - run: python ./test/unit_test/create_project/create_project.py - - name: Test Generate HTML Report - run: python ./test/unit_test/generate_report/generate_html_report.py - - name: Test Generate XML Report - run: python ./test/unit_test/generate_report/generate_xml_report.py - - name: Test Generate JSON Report - run: python ./test/unit_test/generate_report/generate_json_report.py - - name: Test Executor - run: python ./test/unit_test/executor_test/execute.py \ No newline at end of file + - name: Install PyTest + run: pip install -r pytest + - name: PyTest + run: python -m pytest -v \ No newline at end of file diff --git a/README.md b/README.md index 6b39669..f4e10fa 100644 --- a/README.md +++ b/README.md @@ -1,56 +1,35 @@ -## LoadDensity -[![Downloads](https://static.pepy.tech/badge/je-load-density)](https://pepy.tech/project/je-load-density) - -[![Codacy Badge](https://app.codacy.com/project/badge/Grade/b3f05488c16a44959cbf0ec28d4c977c)](https://www.codacy.com/gh/JE-Chen/LoadDensity/dashboard?utm_source=github.com&utm_medium=referral&utm_content=JE-Chen/LoadDensity&utm_campaign=Badge_Grade) - -[![LoadDensity Stable Python3.8](https://github.com/Intergration-Automation-Testing/LoadDensity/actions/workflows/stable_python3_8.yml/badge.svg)](https://github.com/Intergration-Automation-Testing/LoadDensity/actions/workflows/stable_python3_8.yml) - -[![LoadDensity Stable Python3.9](https://github.com/Intergration-Automation-Testing/LoadDensity/actions/workflows/stable_python3_9.yml/badge.svg)](https://github.com/Intergration-Automation-Testing/LoadDensity/actions/workflows/stable_python3_9.yml) - -[![LoadDensity Stable Python3.10](https://github.com/Intergration-Automation-Testing/LoadDensity/actions/workflows/stable_python3_10.yml/badge.svg)](https://github.com/Intergration-Automation-Testing/LoadDensity/actions/workflows/stable_python3_10.yml) - -[![LoadDensity Stable Python3.11](https://github.com/Intergration-Automation-Testing/LoadDensity/actions/workflows/stable_python3_11.yml/badge.svg)](https://github.com/Intergration-Automation-Testing/LoadDensity/actions/workflows/stable_python3_11.yml) - -### Documentation - -[![Documentation Status](https://readthedocs.org/projects/loaddensity/badge/?version=latest)](https://loaddensity.readthedocs.io/en/latest/?badge=latest) - -[LoadDensity Doc Click Here!](https://loaddensity.readthedocs.io/en/latest/) - ---- -> Project Kanban \ -> https://github.com/orgs/Integration-Automation/projects/2/views/1 -> * Load automation. -> * Easy setup user template. -> * Load Density script. -> * Generate JSON/HTML/XML report. -> * 1 sec / thousands requests. -> * Fast spawn users. -> * Multi test on one task. -> * Specify test time. -> * OS Independent. -> * Remote automation support. -> * Project & Template support. ---- - -## install +# LoadDensity +A high‑performance load testing and automation tool. +It supports fast user spawning, flexible templates, and generates reports in multiple formats. +Designed to be cross‑platform and easy to integrate into your projects. + +- Load automation: Quickly set up and run load tests +- User templates: Simple configuration for reusable test users +- Load Density scripts: Define and execute repeatable scenarios +- Report generation: Export results in JSON, HTML, or XML +- High throughput: Thousands of requests per second +- Fast user spawning: Scale up test users instantly +- Multi‑test support: Run multiple tests on a single task +- ⏱Configurable test duration: Specify how long tests should run +- OS independent: Works across major operating systems +- Remote automation: Execute tests remotely +- Project & template support: Organize and reuse test setup + +## Installation ``` pip install je_locust_wrapper ``` -## require +## Require ``` -python 3.8 or later +python 3.9 or later ``` ->* Test on ->> * windows 10 ~ 11 ->> * osx 10.5 ~ 11 big sur ->> * ubuntu 20.0.4 ->> * raspberry pi 3B+ ->> * All test in test dir ->> * -### Architecture Diagram -![Architecture Diagram](architecture_diagram/LoadDnesity_Archirecture.drawio.png) \ No newline at end of file +## Tested Platforms +- Windows 10 ~ 11 +- macOS 10.15 ~ 11 Big Sur +- Ubuntu 20.04 +- Raspberry Pi 3B+ +- All test cases are located in the test directory diff --git a/architecture_diagram/LoadDnesity_Archirecture.drawio b/architecture_diagram/LoadDnesity_Archirecture.drawio deleted file mode 100644 index 08f8628..0000000 --- a/architecture_diagram/LoadDnesity_Archirecture.drawio +++ /dev/null @@ -1,406 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/architecture_diagram/LoadDnesity_Archirecture.drawio.png b/architecture_diagram/LoadDnesity_Archirecture.drawio.png deleted file mode 100644 index 082c47c910ee9c279686277543c66c488967ce83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 444750 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
DX|G4Tww~s&$mzIFQ^T2g@i{{%zJR(XSfxz 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 yNDTOgMs4f=)2H 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%0A>4c;#Cd!4-9&MX`i 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

`+Jk9AZZG;?RIZ{%@BNZW5#x51qCLb~2X^hv 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 lUl{to2$E%){X(lY98&{{RagxZnT) diff --git a/test/__init__.py b/test/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/test/unit_test/callback_test/callback_test.py b/test/unit_test/callback_test/callback_test.py index 9885992..324275f 100644 --- a/test/unit_test/callback_test/callback_test.py +++ b/test/unit_test/callback_test/callback_test.py @@ -1,9 +1,9 @@ from je_load_density import callback_executor -print( - callback_executor.callback_function( +def test_callback_executor_runs(): + result = callback_executor.callback_function( trigger_function_name="user_test", - callback_function=print, + callback_function=lambda x: x, # 用 lambda 取代 print,方便驗證回傳值 callback_param_method="args", callback_function_param={"": "test"}, **{ @@ -21,4 +21,6 @@ } } ) -) + + # 驗證 callback_executor 有回傳結果 + assert result is not None \ No newline at end of file diff --git a/test/unit_test/create_project/create_project.py b/test/unit_test/create_project/create_project.py index e987b6f..6f75a11 100644 --- a/test/unit_test/create_project/create_project.py +++ b/test/unit_test/create_project/create_project.py @@ -1,3 +1,4 @@ from je_load_density import create_project_dir -create_project_dir() +def test_create_project_dir(): + create_project_dir() diff --git a/test/unit_test/executor_test/execute.py b/test/unit_test/executor_test/execute.py index 9f3b988..947faaf 100644 --- a/test/unit_test/executor_test/execute.py +++ b/test/unit_test/executor_test/execute.py @@ -1,15 +1,16 @@ from je_load_density import executor -test_list = [ - [ - "LD_start_test", {"user_detail_dict": { - "user": "fast_http_user" - }, "user_count": 50, "spawn_rate": 10, "test_time": 5, - "tasks": { - "get": {"request_url": "http://httpbin.org/get"}, - "post": {"request_url": "http://httpbin.org/post"} +def test_execute(): + test_list = [ + [ + "LD_start_test", {"user_detail_dict": { + "user": "fast_http_user" + }, "user_count": 50, "spawn_rate": 10, "test_time": 5, + "tasks": { + "get": {"request_url": "http://httpbin.org/get"}, + "post": {"request_url": "http://httpbin.org/post"} + } } - } + ] ] -] -executor.execute_action(test_list) + executor.execute_action(test_list) diff --git a/test/unit_test/generate_report/generate_html_report.py b/test/unit_test/generate_report/generate_html_report.py index ca0f477..fa58fa2 100644 --- a/test/unit_test/generate_report/generate_html_report.py +++ b/test/unit_test/generate_report/generate_html_report.py @@ -1,14 +1,16 @@ from je_load_density import generate_html_report, start_test -start_test( - { - "user": "fast_http_user", - }, - 50, 10, 5, - **{ - "tasks": { - "get": {"request_url": "http://httpbin.org/get"}, - "post": {"request_url": "http://httpbin.org/post"} + +def test_generate_html_report(): + start_test( + { + "user": "fast_http_user", + }, + 50, 10, 5, + **{ + "tasks": { + "get": {"request_url": "http://httpbin.org/get"}, + "post": {"request_url": "http://httpbin.org/post"} + } } - } -) -generate_html_report() + ) + generate_html_report() diff --git a/test/unit_test/generate_report/generate_json_report.py b/test/unit_test/generate_report/generate_json_report.py index 7cdc7db..4b9a2b1 100644 --- a/test/unit_test/generate_report/generate_json_report.py +++ b/test/unit_test/generate_report/generate_json_report.py @@ -1,14 +1,16 @@ from je_load_density import generate_json_report, start_test -start_test( - { - "user": "fast_http_user", - }, - 50, 10, 5, - **{ - "tasks": { - "get": {"request_url": "http://httpbin.org/get"}, - "post": {"request_url": "http://httpbin.org/post"} + +def test_generate_json_report(): + start_test( + { + "user": "fast_http_user", + }, + 50, 10, 5, + **{ + "tasks": { + "get": {"request_url": "http://httpbin.org/get"}, + "post": {"request_url": "http://httpbin.org/post"} + } } - } -) -generate_json_report() + ) + generate_json_report() diff --git a/test/unit_test/generate_report/generate_xml_report.py b/test/unit_test/generate_report/generate_xml_report.py index b42d960..d62b970 100644 --- a/test/unit_test/generate_report/generate_xml_report.py +++ b/test/unit_test/generate_report/generate_xml_report.py @@ -1,14 +1,16 @@ from je_load_density import generate_xml_report, start_test -start_test( - { - "user": "fast_http_user", - }, - 50, 10, 5, - **{ - "tasks": { - "get": {"request_url": "http://httpbin.org/get"}, - "post": {"request_url": "http://httpbin.org/post"} + +def test_generate_xml_report(): + start_test( + { + "user": "fast_http_user", + }, + 50, 10, 5, + **{ + "tasks": { + "get": {"request_url": "http://httpbin.org/get"}, + "post": {"request_url": "http://httpbin.org/post"} + } } - } -) -generate_xml_report() + ) + generate_xml_report() diff --git a/test/unit_test/user_test/fast_http_user_test.py b/test/unit_test/user_test/fast_http_user_test.py index e356ee7..37ec55a 100644 --- a/test/unit_test/user_test/fast_http_user_test.py +++ b/test/unit_test/user_test/fast_http_user_test.py @@ -1,20 +1,21 @@ from je_load_density import start_test, generate_json_report -start_test( - { - "user": "fast_http_user", - }, - 10, 1, 10, - web_ui_dict= - { - "host": "127.0.0.1", - "port": 8089 - }, - ** { - "tasks": { - "get": {"request_url": "http://httpbin.org/get"}, - "post": {"request_url": "http://httpbin.org/post"} +def test_fast_http_user_test(): + start_test( + { + "user": "fast_http_user", + }, + 10, 1, 10, + web_ui_dict= + { + "host": "127.0.0.1", + "port": 8089 + }, + ** { + "tasks": { + "get": {"request_url": "http://httpbin.org/get"}, + "post": {"request_url": "http://httpbin.org/post"} + } } - } -) -generate_json_report() + ) + generate_json_report() diff --git a/test/unit_test/user_test/http_user_test.py b/test/unit_test/user_test/http_user_test.py index c0043fb..c1a8bbc 100644 --- a/test/unit_test/user_test/http_user_test.py +++ b/test/unit_test/user_test/http_user_test.py @@ -1,15 +1,16 @@ from je_load_density import start_test, generate_json_report -start_test( - { - "user": "http_user", - }, - 10, 1, 10, - **{ - "tasks": { - "get": {"request_url": "http://httpbin.org/get"}, - "post": {"request_url": "http://httpbin.org/post"} +def test_http_user_test(): + start_test( + { + "user": "http_user", + }, + 10, 1, 10, + **{ + "tasks": { + "get": {"request_url": "http://httpbin.org/get"}, + "post": {"request_url": "http://httpbin.org/post"} + } } - } -) -generate_json_report() + ) + generate_json_report() From 1c40629dab3495f5635a675f066226e443ceb804 Mon Sep 17 00:00:00 2001 From: JE-Chen Date: Sat, 8 Nov 2025 04:59:17 +0800 Subject: [PATCH 3/5] Redo Test Redo Test --- .github/workflows/dev_python3_10.yml | 18 ++++++++-- .github/workflows/dev_python3_11.yml | 18 ++++++++-- .github/workflows/dev_python3_12.yml | 18 ++++++++-- .github/workflows/stable_python3_10.yml | 20 ++++++++--- .github/workflows/stable_python3_11.yml | 20 ++++++++--- .github/workflows/stable_python3_12.yml | 20 ++++++++--- test/unit_test/callback_test/callback_test.py | 10 +++--- .../create_project/create_project.py | 3 +- test/unit_test/executor_test/execute.py | 23 ++++++------ .../generate_report/generate_html_report.py | 26 +++++++------- .../generate_report/generate_json_report.py | 26 +++++++------- .../generate_report/generate_xml_report.py | 26 +++++++------- .../user_test/fast_http_user_test.py | 35 +++++++++---------- test/unit_test/user_test/http_user_test.py | 25 +++++++------ 14 files changed, 177 insertions(+), 111 deletions(-) diff --git a/.github/workflows/dev_python3_10.yml b/.github/workflows/dev_python3_10.yml index 8fe12d5..b0f1fb2 100644 --- a/.github/workflows/dev_python3_10.yml +++ b/.github/workflows/dev_python3_10.yml @@ -25,5 +25,19 @@ jobs: run: | python -m pip install --upgrade pip wheel pip install -r dev_requirements.txt - - name: PyTest - run: python -m pytest -v \ No newline at end of file + - name: Test Fast HTTP User + run: python ./test/unit_test/user_test/fast_http_user_test.py + - name: TestMulti Action User + run: python ./test/unit_test/user_test/http_user_test.py + - name: Test Callback + run: python ./test/unit_test/callback_test/callback_test.py + - name: Test Create Project + run: python ./test/unit_test/create_project/create_project.py + - name: Test Generate HTML Report + run: python ./test/unit_test/generate_report/generate_html_report.py + - name: Test Generate XML Report + run: python ./test/unit_test/generate_report/generate_xml_report.py + - name: Test Generate JSON Report + run: python ./test/unit_test/generate_report/generate_json_report.py + - name: Test Executor + run: python ./test/unit_test/executor_test/execute.py \ No newline at end of file diff --git a/.github/workflows/dev_python3_11.yml b/.github/workflows/dev_python3_11.yml index 95624de..65d836f 100644 --- a/.github/workflows/dev_python3_11.yml +++ b/.github/workflows/dev_python3_11.yml @@ -25,5 +25,19 @@ jobs: run: | python -m pip install --upgrade pip wheel pip install -r dev_requirements.txt - - name: PyTest - run: python -m pytest -v \ No newline at end of file + - name: Test Fast HTTP User + run: python ./test/unit_test/user_test/fast_http_user_test.py + - name: TestMulti Action User + run: python ./test/unit_test/user_test/http_user_test.py + - name: Test Callback + run: python ./test/unit_test/callback_test/callback_test.py + - name: Test Create Project + run: python ./test/unit_test/create_project/create_project.py + - name: Test Generate HTML Report + run: python ./test/unit_test/generate_report/generate_html_report.py + - name: Test Generate XML Report + run: python ./test/unit_test/generate_report/generate_xml_report.py + - name: Test Generate JSON Report + run: python ./test/unit_test/generate_report/generate_json_report.py + - name: Test Executor + run: python ./test/unit_test/executor_test/execute.py \ No newline at end of file diff --git a/.github/workflows/dev_python3_12.yml b/.github/workflows/dev_python3_12.yml index a1c7736..31bef5c 100644 --- a/.github/workflows/dev_python3_12.yml +++ b/.github/workflows/dev_python3_12.yml @@ -25,5 +25,19 @@ jobs: run: | python -m pip install --upgrade pip wheel pip install -r dev_requirements.txt - - name: PyTest - run: python -m pytest -v \ No newline at end of file + - name: Test Fast HTTP User + run: python ./test/unit_test/user_test/fast_http_user_test.py + - name: TestMulti Action User + run: python ./test/unit_test/user_test/http_user_test.py + - name: Test Callback + run: python ./test/unit_test/callback_test/callback_test.py + - name: Test Create Project + run: python ./test/unit_test/create_project/create_project.py + - name: Test Generate HTML Report + run: python ./test/unit_test/generate_report/generate_html_report.py + - name: Test Generate XML Report + run: python ./test/unit_test/generate_report/generate_xml_report.py + - name: Test Generate JSON Report + run: python ./test/unit_test/generate_report/generate_json_report.py + - name: Test Executor + run: python ./test/unit_test/executor_test/execute.py \ No newline at end of file diff --git a/.github/workflows/stable_python3_10.yml b/.github/workflows/stable_python3_10.yml index 4d4131e..6b4e74e 100644 --- a/.github/workflows/stable_python3_10.yml +++ b/.github/workflows/stable_python3_10.yml @@ -25,7 +25,19 @@ jobs: run: | python -m pip install --upgrade pip wheel pip install -r requirements.txt - - name: Install PyTest - run: pip install -r pytest - - name: PyTest - run: python -m pytest -v \ No newline at end of file + - name: Test Fast HTTP User + run: python ./test/unit_test/user_test/fast_http_user_test.py + - name: TestMulti Action User + run: python ./test/unit_test/user_test/http_user_test.py + - name: Test Callback + run: python ./test/unit_test/callback_test/callback_test.py + - name: Test Create Project + run: python ./test/unit_test/create_project/create_project.py + - name: Test Generate HTML Report + run: python ./test/unit_test/generate_report/generate_html_report.py + - name: Test Generate XML Report + run: python ./test/unit_test/generate_report/generate_xml_report.py + - name: Test Generate JSON Report + run: python ./test/unit_test/generate_report/generate_json_report.py + - name: Test Executor + run: python ./test/unit_test/executor_test/execute.py \ No newline at end of file diff --git a/.github/workflows/stable_python3_11.yml b/.github/workflows/stable_python3_11.yml index a589112..2d429eb 100644 --- a/.github/workflows/stable_python3_11.yml +++ b/.github/workflows/stable_python3_11.yml @@ -25,7 +25,19 @@ jobs: run: | python -m pip install --upgrade pip wheel pip install -r requirements.txt - - name: Install PyTest - run: pip install -r pytest - - name: PyTest - run: python -m pytest -v \ No newline at end of file + - name: Test Fast HTTP User + run: python ./test/unit_test/user_test/fast_http_user_test.py + - name: TestMulti Action User + run: python ./test/unit_test/user_test/http_user_test.py + - name: Test Callback + run: python ./test/unit_test/callback_test/callback_test.py + - name: Test Create Project + run: python ./test/unit_test/create_project/create_project.py + - name: Test Generate HTML Report + run: python ./test/unit_test/generate_report/generate_html_report.py + - name: Test Generate XML Report + run: python ./test/unit_test/generate_report/generate_xml_report.py + - name: Test Generate JSON Report + run: python ./test/unit_test/generate_report/generate_json_report.py + - name: Test Executor + run: python ./test/unit_test/executor_test/execute.py \ No newline at end of file diff --git a/.github/workflows/stable_python3_12.yml b/.github/workflows/stable_python3_12.yml index a637983..36da0db 100644 --- a/.github/workflows/stable_python3_12.yml +++ b/.github/workflows/stable_python3_12.yml @@ -25,7 +25,19 @@ jobs: run: | python -m pip install --upgrade pip wheel pip install -r requirements.txt - - name: Install PyTest - run: pip install -r pytest - - name: PyTest - run: python -m pytest -v \ No newline at end of file + - name: Test Fast HTTP User + run: python ./test/unit_test/user_test/fast_http_user_test.py + - name: TestMulti Action User + run: python ./test/unit_test/user_test/http_user_test.py + - name: Test Callback + run: python ./test/unit_test/callback_test/callback_test.py + - name: Test Create Project + run: python ./test/unit_test/create_project/create_project.py + - name: Test Generate HTML Report + run: python ./test/unit_test/generate_report/generate_html_report.py + - name: Test Generate XML Report + run: python ./test/unit_test/generate_report/generate_xml_report.py + - name: Test Generate JSON Report + run: python ./test/unit_test/generate_report/generate_json_report.py + - name: Test Executor + run: python ./test/unit_test/executor_test/execute.py \ No newline at end of file diff --git a/test/unit_test/callback_test/callback_test.py b/test/unit_test/callback_test/callback_test.py index 324275f..9885992 100644 --- a/test/unit_test/callback_test/callback_test.py +++ b/test/unit_test/callback_test/callback_test.py @@ -1,9 +1,9 @@ from je_load_density import callback_executor -def test_callback_executor_runs(): - result = callback_executor.callback_function( +print( + callback_executor.callback_function( trigger_function_name="user_test", - callback_function=lambda x: x, # 用 lambda 取代 print,方便驗證回傳值 + callback_function=print, callback_param_method="args", callback_function_param={"": "test"}, **{ @@ -21,6 +21,4 @@ def test_callback_executor_runs(): } } ) - - # 驗證 callback_executor 有回傳結果 - assert result is not None \ No newline at end of file +) diff --git a/test/unit_test/create_project/create_project.py b/test/unit_test/create_project/create_project.py index 6f75a11..e987b6f 100644 --- a/test/unit_test/create_project/create_project.py +++ b/test/unit_test/create_project/create_project.py @@ -1,4 +1,3 @@ from je_load_density import create_project_dir -def test_create_project_dir(): - create_project_dir() +create_project_dir() diff --git a/test/unit_test/executor_test/execute.py b/test/unit_test/executor_test/execute.py index 947faaf..9f3b988 100644 --- a/test/unit_test/executor_test/execute.py +++ b/test/unit_test/executor_test/execute.py @@ -1,16 +1,15 @@ from je_load_density import executor -def test_execute(): - test_list = [ - [ - "LD_start_test", {"user_detail_dict": { - "user": "fast_http_user" - }, "user_count": 50, "spawn_rate": 10, "test_time": 5, - "tasks": { - "get": {"request_url": "http://httpbin.org/get"}, - "post": {"request_url": "http://httpbin.org/post"} - } +test_list = [ + [ + "LD_start_test", {"user_detail_dict": { + "user": "fast_http_user" + }, "user_count": 50, "spawn_rate": 10, "test_time": 5, + "tasks": { + "get": {"request_url": "http://httpbin.org/get"}, + "post": {"request_url": "http://httpbin.org/post"} } - ] + } ] - executor.execute_action(test_list) +] +executor.execute_action(test_list) diff --git a/test/unit_test/generate_report/generate_html_report.py b/test/unit_test/generate_report/generate_html_report.py index fa58fa2..ca0f477 100644 --- a/test/unit_test/generate_report/generate_html_report.py +++ b/test/unit_test/generate_report/generate_html_report.py @@ -1,16 +1,14 @@ from je_load_density import generate_html_report, start_test - -def test_generate_html_report(): - start_test( - { - "user": "fast_http_user", - }, - 50, 10, 5, - **{ - "tasks": { - "get": {"request_url": "http://httpbin.org/get"}, - "post": {"request_url": "http://httpbin.org/post"} - } +start_test( + { + "user": "fast_http_user", + }, + 50, 10, 5, + **{ + "tasks": { + "get": {"request_url": "http://httpbin.org/get"}, + "post": {"request_url": "http://httpbin.org/post"} } - ) - generate_html_report() + } +) +generate_html_report() diff --git a/test/unit_test/generate_report/generate_json_report.py b/test/unit_test/generate_report/generate_json_report.py index 4b9a2b1..7cdc7db 100644 --- a/test/unit_test/generate_report/generate_json_report.py +++ b/test/unit_test/generate_report/generate_json_report.py @@ -1,16 +1,14 @@ from je_load_density import generate_json_report, start_test - -def test_generate_json_report(): - start_test( - { - "user": "fast_http_user", - }, - 50, 10, 5, - **{ - "tasks": { - "get": {"request_url": "http://httpbin.org/get"}, - "post": {"request_url": "http://httpbin.org/post"} - } +start_test( + { + "user": "fast_http_user", + }, + 50, 10, 5, + **{ + "tasks": { + "get": {"request_url": "http://httpbin.org/get"}, + "post": {"request_url": "http://httpbin.org/post"} } - ) - generate_json_report() + } +) +generate_json_report() diff --git a/test/unit_test/generate_report/generate_xml_report.py b/test/unit_test/generate_report/generate_xml_report.py index d62b970..b42d960 100644 --- a/test/unit_test/generate_report/generate_xml_report.py +++ b/test/unit_test/generate_report/generate_xml_report.py @@ -1,16 +1,14 @@ from je_load_density import generate_xml_report, start_test - -def test_generate_xml_report(): - start_test( - { - "user": "fast_http_user", - }, - 50, 10, 5, - **{ - "tasks": { - "get": {"request_url": "http://httpbin.org/get"}, - "post": {"request_url": "http://httpbin.org/post"} - } +start_test( + { + "user": "fast_http_user", + }, + 50, 10, 5, + **{ + "tasks": { + "get": {"request_url": "http://httpbin.org/get"}, + "post": {"request_url": "http://httpbin.org/post"} } - ) - generate_xml_report() + } +) +generate_xml_report() diff --git a/test/unit_test/user_test/fast_http_user_test.py b/test/unit_test/user_test/fast_http_user_test.py index 37ec55a..c717b2d 100644 --- a/test/unit_test/user_test/fast_http_user_test.py +++ b/test/unit_test/user_test/fast_http_user_test.py @@ -1,21 +1,20 @@ from je_load_density import start_test, generate_json_report -def test_fast_http_user_test(): - start_test( - { - "user": "fast_http_user", - }, - 10, 1, 10, - web_ui_dict= - { - "host": "127.0.0.1", - "port": 8089 - }, - ** { - "tasks": { - "get": {"request_url": "http://httpbin.org/get"}, - "post": {"request_url": "http://httpbin.org/post"} - } +start_test( + { + "user": "fast_http_user", + }, + 1000, 100, 30, + web_ui_dict= + { + "host": "127.0.0.1", + "port": 8089 + }, + ** { + "tasks": { + "get": {"request_url": "http://httpbin.org/get"}, + "post": {"request_url": "http://httpbin.org/post"} } - ) - generate_json_report() + } +) +generate_json_report() diff --git a/test/unit_test/user_test/http_user_test.py b/test/unit_test/user_test/http_user_test.py index c1a8bbc..19987d6 100644 --- a/test/unit_test/user_test/http_user_test.py +++ b/test/unit_test/user_test/http_user_test.py @@ -1,16 +1,15 @@ from je_load_density import start_test, generate_json_report -def test_http_user_test(): - start_test( - { - "user": "http_user", - }, - 10, 1, 10, - **{ - "tasks": { - "get": {"request_url": "http://httpbin.org/get"}, - "post": {"request_url": "http://httpbin.org/post"} - } +start_test( + { + "user": "http_user", + }, + 50, 10, 5, + **{ + "tasks": { + "get": {"request_url": "http://httpbin.org/get"}, + "post": {"request_url": "http://httpbin.org/post"} } - ) - generate_json_report() + } +) +generate_json_report() From 0d85dafad3b9dc219052b324d03fa8d06c83d727 Mon Sep 17 00:00:00 2001 From: JE-Chen Date: Sat, 8 Nov 2025 08:10:21 +0800 Subject: [PATCH 4/5] Update stable version Update stable version --- stable.toml => dev.toml | 8 ++++---- pyproject.toml | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) rename stable.toml => dev.toml (91%) diff --git a/stable.toml b/dev.toml similarity index 91% rename from stable.toml rename to dev.toml index 9053aaa..2d993e5 100644 --- a/stable.toml +++ b/dev.toml @@ -1,12 +1,12 @@ -# Rename to stable version -# This is stable version +# Rename to dev version +# This is dev version [build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] -name = "je_load_density" -version = "0.0.63" +name = "je_load_density_dev" +version = "0.0.78" authors = [ { name = "JE-Chen", email = "jechenmailman@gmail.com" }, ] diff --git a/pyproject.toml b/pyproject.toml index 2d993e5..04f5338 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,12 +1,12 @@ -# Rename to dev version -# This is dev version +# Rename to stable version +# This is stable version [build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] -name = "je_load_density_dev" -version = "0.0.78" +name = "je_load_density" +version = "0.0.64" authors = [ { name = "JE-Chen", email = "jechenmailman@gmail.com" }, ] From 824dda8c9a2072224828622c6cf25113b20372c5 Mon Sep 17 00:00:00 2001 From: JE-Chen Date: Sun, 16 Nov 2025 14:22:02 +0800 Subject: [PATCH 5/5] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f4e10fa..3a8fc9d 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Designed to be cross‑platform and easy to integrate into your projects. - High throughput: Thousands of requests per second - Fast user spawning: Scale up test users instantly - Multi‑test support: Run multiple tests on a single task -- ⏱Configurable test duration: Specify how long tests should run +- Configurable test duration: Specify how long tests should run - OS independent: Works across major operating systems - Remote automation: Execute tests remotely - Project & template support: Organize and reuse test setup