Skip to content
Merged

Dev #112

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 37 additions & 40 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,41 +1,38 @@
# Automation-IDE
An integrated test automation IDE developed with Python and PySide6 (Qt).

## Components
- Editor
- https://github.com/Integration-Automation/JEDITOR
- GUI Testing
- https://github.com/Integration-Automation/AutoControlGUI
- API Testing
- https://github.com/Integration-Automation/APITestka
- Web Testing
- https://github.com/Integration-Automation/WebRunner
- Load Testing
- https://github.com/Integration-Automation/LoadDensity
- File
- https://github.com/Integration-Automation/FileAutomation
- OpenCV
- https://github.com/Integration-Automation/je_opencv_wrapper
- Mail
- https://github.com/Integration-Automation/MailThunder

## Supported features:
- Python syntax highlighting
- Auto reformatter
- Code execution
- Test scripts
- Shell commands
- Embedded browser
- Jupyter integration
- Git client
- Code diff viewer, etc.

## Testing modules include:
- GUI testing
- API testing
- Load testing
- Web testing

## Installation
> pip install automation_editor
# PyBreeze: The Automation-First IDE

![Main GUI](images/main_gui.png)

---

## Core Capabilities: Four-Dimensional Automation
PyBreeze features built-in modules tailored for every level of modern automation, allowing developers to tackle complex scenarios without leaving the IDE:

* **Web Automation**: Deep integration with browser drivers and element locators for rapid web-based interaction simulation and testing.
* **API Automation**: Built-in request builders and response analyzers supporting RESTful API development with advanced assertion verification.
* **GUI Automation**: Specialized support for image recognition and coordinate-based positioning for seamless desktop application automation.
* **Load & Stress Testing**: An integrated performance engine capable of simulating high-concurrency scenarios to monitor system stability under extreme pressure.

---

## IDE Deep Dive: Optimized for Automation Workflows
PyBreeze is more than just a code editor; it is a command center for your automation lifecycle:

* **Intelligent Completion**: Provides deep syntax hinting and code navigation specifically for popular automation libraries (e.g., Selenium, Requests, PyAutoGUI), significantly boosting script authoring speed.
* **Visual Debugging Suite**: Features breakpoint debugging and real-time variable monitoring, enhanced by "Step-by-Step" execution and "Screenshot Traceback" for faster troubleshooting.
* **Integrated Asset Manager**: Centralized management for Object Repositories (element locators), test data (CSV/JSON), and environment configurations, enabling clean separation of code and data.
* **Real-Time Analytics Dashboard**: Synchronous reporting during script execution, visualizing logs, screenshots, and performance curves in an intuitive interface.

---

## Key Highlights
1. **Native Python Ecosystem**: Built 100% on Python, allowing developers to seamlessly leverage the vast library of third-party packages.
2. **Zero-Config Environment**: Features built-in virtual environment management and automatic driver updates, solving the common frustration of complex environment setups.
3. **Automation-First UI**: Unlike generic IDEs, the layout is specifically designed around the "Develop-Execute-Report" cycle.

---

## Target Audience
* **Python Developers**: Those who want a lightweight, dedicated environment to build Python-based automation scripts without the overhead of heavy, general-purpose IDEs.
* **SDET (Software Development Engineers in Test)**: Professionals needing to maintain Web, API, and Performance tests simultaneously.
* **Automation Beginners**: Users looking for a friendly IDE that lowers the barrier to entry for Python automation.
* **DevOps Teams**: A powerful platform for rapidly building and debugging integration test suites within CI/CD pipelines.
7 changes: 0 additions & 7 deletions automation_ide/__init__.py

This file was deleted.

This file was deleted.

This file was deleted.

4 changes: 2 additions & 2 deletions pyproject.toml → dev.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"

[project]
name = "PyBreeze_dev"
version = "1.0.4"
name = "pybreeze_dev"
version = "1.0.5"
authors = [
{ name = "JE-Chen", email = "jechenmailman@gmail.com" },
]
Expand Down
2 changes: 1 addition & 1 deletion dev_requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ je-load-density
je-auto-control
je-web-runner
je-mail-thunder
automation_ide_dev
pybreeze_dev
sphinx
sphinx-rtd-theme
PySide6
Expand Down
2 changes: 1 addition & 1 deletion exe/start_automation_editor.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
from automation_ide import start_editor
from pybreeze import start_editor

start_editor()
Binary file added images/main_gui.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
7 changes: 7 additions & 0 deletions pybreeze/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from pybreeze.pybreeze_ui.editor_main.main_ui import AutomationEditor
from pybreeze.pybreeze_ui.editor_main.main_ui import EDITOR_EXTEND_TAB
from pybreeze.pybreeze_ui.editor_main.main_ui import start_editor

__all__ = [
"start_editor", "AutomationEditor", "EDITOR_EXTEND_TAB"
]
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import sys
from email.mime.multipart import MIMEMultipart

from automation_ide.utils.exception.exception_tags import send_html_exception_tag
from automation_ide.utils.exception.exceptions import ITESendHtmlReportException
from pybreeze.utils.exception.exception_tags import send_html_exception_tag
from pybreeze.utils.exception.exceptions import ITESendHtmlReportException


def send_after_test(html_report_path: str = None) -> None:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@

from typing import TYPE_CHECKING, Union

from automation_ide.extend.process_executor.process_executor_utils import build_process
from pybreeze.extend.process_executor.process_executor_utils import build_process

if TYPE_CHECKING:
from automation_ide.automation_editor_ui.editor_main.main_ui import AutomationEditor
from pybreeze.pybreeze_ui.editor_main.main_ui import AutomationEditor
import sys

from automation_ide.utils.file_process.get_dir_file_list import ask_and_get_dir_files_as_list
from pybreeze.utils.file_process.get_dir_file_list import ask_and_get_dir_files_as_list


def call_api_testka(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@

from typing import TYPE_CHECKING, Union

from automation_ide.extend.process_executor.process_executor_utils import build_process
from pybreeze.extend.process_executor.process_executor_utils import build_process

if TYPE_CHECKING:
from automation_ide.automation_editor_ui.editor_main.main_ui import AutomationEditor
from pybreeze.pybreeze_ui.editor_main.main_ui import AutomationEditor
import sys

from automation_ide.utils.file_process.get_dir_file_list import ask_and_get_dir_files_as_list
from pybreeze.utils.file_process.get_dir_file_list import ask_and_get_dir_files_as_list


def call_auto_control(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@

from typing import TYPE_CHECKING, Union

from automation_ide.extend.process_executor.process_executor_utils import build_process
from pybreeze.extend.process_executor.process_executor_utils import build_process

if TYPE_CHECKING:
from automation_ide.automation_editor_ui.editor_main.main_ui import AutomationEditor
from pybreeze.pybreeze_ui.editor_main.main_ui import AutomationEditor
import sys

from automation_ide.utils.file_process.get_dir_file_list import ask_and_get_dir_files_as_list
from pybreeze.utils.file_process.get_dir_file_list import ask_and_get_dir_files_as_list


def call_file_automation_test(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@

from typing import TYPE_CHECKING, Union

from automation_ide.extend.process_executor.process_executor_utils import build_process
from pybreeze.extend.process_executor.process_executor_utils import build_process

if TYPE_CHECKING:
from automation_ide.automation_editor_ui.editor_main.main_ui import AutomationEditor
from pybreeze.pybreeze_ui.editor_main.main_ui import AutomationEditor
import sys

from automation_ide.utils.file_process.get_dir_file_list import ask_and_get_dir_files_as_list
from pybreeze.utils.file_process.get_dir_file_list import ask_and_get_dir_files_as_list


def call_load_density(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@

from typing import TYPE_CHECKING, Union

from automation_ide.extend.process_executor.process_executor_utils import build_process
from pybreeze.extend.process_executor.process_executor_utils import build_process

if TYPE_CHECKING:
from automation_ide.automation_editor_ui.editor_main.main_ui import AutomationEditor
from pybreeze.pybreeze_ui.editor_main.main_ui import AutomationEditor


def call_mail_thunder(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,14 @@

from je_editor import EditorWidget

from automation_ide.automation_editor_ui.show_code_window.code_window import CodeWindow
from automation_ide.extend.mail_thunder_extend.mail_thunder_setting import send_after_test
from automation_ide.extend.process_executor.python_task_process_manager import TaskProcessManager
from automation_ide.utils.exception.exception_tags import wrong_test_data_format_exception_tag
from automation_ide.utils.exception.exceptions import ITETestExecutorException
from pybreeze.pybreeze_ui.show_code_window.code_window import CodeWindow
from pybreeze.extend.mail_thunder_extend.mail_thunder_setting import send_after_test
from pybreeze.extend.process_executor.python_task_process_manager import TaskProcessManager
from pybreeze.utils.exception.exception_tags import wrong_test_data_format_exception_tag
from pybreeze.utils.exception.exceptions import ITETestExecutorException

if TYPE_CHECKING:
from automation_ide.automation_editor_ui.editor_main.main_ui import AutomationEditor
from pybreeze.pybreeze_ui.editor_main.main_ui import AutomationEditor


def build_process(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
from je_editor.pyside_ui.main_ui.save_settings.user_color_setting_file import actually_color_dict
from je_editor.utils.venv_check.check_venv import check_and_choose_venv

from automation_ide.automation_editor_ui.show_code_window.code_window import CodeWindow
from pybreeze.pybreeze_ui.show_code_window.code_window import CodeWindow


class TaskProcessManager(object):
Expand Down Expand Up @@ -98,7 +98,7 @@
self.timer.start()

# Pyside UI update method
def pull_text(self):

Check failure on line 101 in pybreeze/extend/process_executor/python_task_process_manager.py

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Refactor this function to reduce its Cognitive Complexity from 22 to the 15 allowed.

See more on https://sonarcloud.io/project/issues?id=Integration-Automation_AutomationIDE&issues=AZztOD56t5t5DmIVw4t0&open=AZztOD56t5t5DmIVw4t0&pullRequest=112
try:
if not self.run_output_queue.empty():
output_message = self.run_output_queue.get_nowait()
Expand Down Expand Up @@ -126,9 +126,9 @@
self.timer.stop()
self.exit_program()
elif self.process.returncode is not None:
if self.timer.isActive():
self.timer.stop()
self.exit_program()

Check warning on line 131 in pybreeze/extend/process_executor/python_task_process_manager.py

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Either merge this branch with the identical one on line "125" or change one of the implementations.

See more on https://sonarcloud.io/project/issues?id=Integration-Automation_AutomationIDE&issues=AZztOD56t5t5DmIVw4t1&open=AZztOD56t5t5DmIVw4t1&pullRequest=112
if self.still_run_program:
# poll return code
self.process.poll()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@
from je_editor.pyside_ui.main_ui.save_settings.user_color_setting_file import actually_color_dict
from je_editor.utils.venv_check.check_venv import check_and_choose_venv

from automation_ide.automation_editor_ui.show_code_window.code_window import CodeWindow
from pybreeze.pybreeze_ui.show_code_window.code_window import CodeWindow

if TYPE_CHECKING:
from automation_ide.automation_editor_ui.editor_main.main_ui import AutomationEditor
from pybreeze.pybreeze_ui.editor_main.main_ui import AutomationEditor


class TestPioneerProcess(object):
Expand Down Expand Up @@ -73,7 +73,7 @@
)

# Pyside UI update method
def pull_text(self):

Check failure on line 76 in pybreeze/extend/process_executor/test_pioneer/test_pioneer_process_manager.py

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Refactor this function to reduce its Cognitive Complexity from 22 to the 15 allowed.

See more on https://sonarcloud.io/project/issues?id=Integration-Automation_AutomationIDE&issues=AZztOD44t5t5DmIVw4ty&open=AZztOD44t5t5DmIVw4ty&pullRequest=112
try:
if not self._run_output_queue.empty():
output_message = self._run_output_queue.get_nowait()
Expand Down Expand Up @@ -101,9 +101,9 @@
self._timer.stop()
self.exit_program()
elif self._process.returncode is not None:
if self._timer.isActive():
self._timer.stop()
self.exit_program()

Check warning on line 106 in pybreeze/extend/process_executor/test_pioneer/test_pioneer_process_manager.py

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Either merge this branch with the identical one on line "100" or change one of the implementations.

See more on https://sonarcloud.io/project/issues?id=Integration-Automation_AutomationIDE&issues=AZztOD44t5t5DmIVw4tz&open=AZztOD44t5t5DmIVw4tz&pullRequest=112
if self._still_run_program:
# poll return code
self._process.poll()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@

from typing import TYPE_CHECKING, Union

from automation_ide.extend.process_executor.process_executor_utils import build_process
from pybreeze.extend.process_executor.process_executor_utils import build_process

if TYPE_CHECKING:
from automation_ide.automation_editor_ui.editor_main.main_ui import AutomationEditor
from pybreeze.pybreeze_ui.editor_main.main_ui import AutomationEditor
import sys

from automation_ide.utils.file_process.get_dir_file_list import ask_and_get_dir_files_as_list
from pybreeze.utils.file_process.get_dir_file_list import ask_and_get_dir_files_as_list


def call_web_runner_test(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
)
from je_editor import language_wrapper

from automation_ide.automation_editor_ui.connect_gui.ssh.ssh_login_widget import LoginWidget
from pybreeze.pybreeze_ui.connect_gui.ssh.ssh_login_widget import LoginWidget

ANSI_ESCAPE_PATTERN = re.compile(r'\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])')

Expand Down Expand Up @@ -118,7 +118,7 @@
def append_text(self, text: str):
self.terminal.appendPlainText(text)

def connect_ssh(self):

Check failure on line 121 in pybreeze/pybreeze_ui/connect_gui/ssh/ssh_command_widget.py

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Refactor this function to reduce its Cognitive Complexity from 19 to the 15 allowed.

See more on https://sonarcloud.io/project/issues?id=Integration-Automation_AutomationIDE&issues=AZztOD4Ot5t5DmIVw4tu&open=AZztOD4Ot5t5DmIVw4tu&pullRequest=112
host = self.login_widget.host_edit.text().strip()
port = self.login_widget.port_spin.value()
user = self.login_widget.user_edit.text().strip()
Expand Down Expand Up @@ -147,7 +147,7 @@
return
try:
pkey = None
for KeyType in (paramiko.RSAKey, paramiko.Ed25519Key, paramiko.ECDSAKey):

Check warning on line 150 in pybreeze/pybreeze_ui/connect_gui/ssh/ssh_command_widget.py

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Rename this local variable "KeyType" to match the regular expression ^[_a-z][a-z0-9_]*$.

See more on https://sonarcloud.io/project/issues?id=Integration-Automation_AutomationIDE&issues=AZztOD4Ot5t5DmIVw4tt&open=AZztOD4Ot5t5DmIVw4tt&pullRequest=112
try:
pkey = KeyType.from_private_key_file(key_path, password if password else None)
break
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
)
from je_editor import language_wrapper

from automation_ide.automation_editor_ui.connect_gui.ssh.ssh_login_widget import LoginWidget
from pybreeze.pybreeze_ui.connect_gui.ssh.ssh_login_widget import LoginWidget


class SFTPClientWrapper:
Expand Down Expand Up @@ -267,7 +267,7 @@
item.takeChild(0)
self.populate_children(item)

def populate_children(self, parent_item: QTreeWidgetItem):

Check failure on line 270 in pybreeze/pybreeze_ui/connect_gui/ssh/ssh_file_viewer_widget.py

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Refactor this function to reduce its Cognitive Complexity from 21 to the 15 allowed.

See more on https://sonarcloud.io/project/issues?id=Integration-Automation_AutomationIDE&issues=AZztOD4Yt5t5DmIVw4tv&open=AZztOD4Yt5t5DmIVw4tv&pullRequest=112
"""
List items under parent path and add to tree.
列出父路徑下的項目並加入樹。
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
from PySide6.QtCore import Qt
from PySide6.QtWidgets import QWidget, QVBoxLayout, QSplitter, QApplication, QSizePolicy

from automation_ide.automation_editor_ui.connect_gui.ssh.ssh_command_widget import SSHCommandWidget
from automation_ide.automation_editor_ui.connect_gui.ssh.ssh_file_viewer_widget import SSHFileTreeManager
from automation_ide.automation_editor_ui.connect_gui.ssh.ssh_login_widget import LoginWidget
from pybreeze.pybreeze_ui.connect_gui.ssh.ssh_command_widget import SSHCommandWidget
from pybreeze.pybreeze_ui.connect_gui.ssh.ssh_file_viewer_widget import SSHFileTreeManager
from pybreeze.pybreeze_ui.connect_gui.ssh.ssh_login_widget import LoginWidget


class SSHMainWidget(QWidget):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from pathlib import Path
from typing import List, Dict, Type

from automation_ide.utils.logging.logger import automation_ide_logger
from pybreeze.utils.logging.logger import automation_ide_logger

Check warning on line 7 in pybreeze/pybreeze_ui/editor_main/main_ui.py

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

pybreeze/pybreeze_ui/editor_main/main_ui.py#L7

'pybreeze.utils.logging.logger.automation_ide_logger' imported but unused (F401)

environ["LOCUST_SKIP_MONKEY_PATCH"] = "1"

Expand All @@ -14,9 +14,9 @@
from je_editor import EditorMain, language_wrapper
from qt_material import apply_stylesheet

from automation_ide.automation_editor_ui.extend_multi_language.update_language_dict import update_language_dict
from automation_ide.automation_editor_ui.menu.build_menubar import add_menu_to_menubar
from automation_ide.automation_editor_ui.syntax.syntax_extend import \
from pybreeze.pybreeze_ui.extend_multi_language.update_language_dict import update_language_dict
from pybreeze.pybreeze_ui.menu.build_menubar import add_menu_to_menubar
from pybreeze.pybreeze_ui.syntax.syntax_extend import \
syntax_extend_package


Expand All @@ -29,7 +29,7 @@
def __init__(self, debug_mode: bool = False, show_system_tray_ray: bool = False, extend: bool = False) -> None:
super().__init__(debug_mode, show_system_tray_ray, extend=True)

self.current_run_code_window: List[QWidget] = list()

Check warning on line 32 in pybreeze/pybreeze_ui/editor_main/main_ui.py

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Replace this constructor call with a literal.

See more on https://sonarcloud.io/project/issues?id=Integration-Automation_AutomationIDE&issues=AZztOD4it5t5DmIVw4tw&open=AZztOD4it5t5DmIVw4tw&pullRequest=112
# Project compiler if user not choose this will use which to find
self.python_compiler = None
# Delete JEditor help
Expand All @@ -53,7 +53,7 @@

# Icon
if not extend:
self.icon_path = Path(os.getcwd() + "/automation_ide.ico")
self.icon_path = Path(os.getcwd() + "/pybreeze.ico")
self.icon = QIcon(str(self.icon_path))
if not self.icon.isNull():
self.setWindowIcon(self.icon)
Expand Down
Loading
Loading