pytest-dpg is a pytest plugin for testing Dear PyGui (DPG) applications
Project description
About
pytest-dpg
is a pytest plugin for testing DearPyGui (DPG) applications.
Features
- Automates user interactions like clicking buttons, switching tabs, and dragging sliders
- Runs GUI tests in a separate process for concurrency, stability, and isolation
- Easy to use API for interacting with DPG elements
- Requires no application code modifications
Installation
pipx is recommended although any package manager that supports pyproject.toml
files can be used.
pipx install pytest-dpg
How it works
pytest-dpg creates a controlled environment for testing before performing introspection on the application:
- DPG Loop Patching:
dpgtester
patches DearPyGui's main loop (dpg.start_dearpygui()
) with a custom loop that allows for command insertion between frames. - Item Identification: utilizes DPG's internal APIs to locate items based on their labels, values, or adjacent items. This allows it to (hopefully) find the correct screen coordinates for interactions.
Usage
pytest-dpg automatically makes the pytest fixture dpgtester
available for use
def test_my_gui(dpgtester):
# This function should setup and start your application when run
func = your_gui_function
# Start your GUI application
dpgtester.set_target(func)
dpgtester.start_gui()
# Interact with GUI elements
dpgtester.click_button("Submit")
dpgtester.click_tab("Settings")
dpgtester.drag_slider("Volume", 75)
Limitations
While pytest-dpg aims to provide a robust testing solution for DearPyGui applications, there are some current limitations to be aware of:
-
Limited Application Support: only applications that utilize
dpg.start_dearpygui()
are curently supported -
Limited Widget Support: only the following widgets are currently supported
- regular button
- horizontal slider
- tab
- collapsible header
-
Complex Layouts: Very complex or dynamically changing layouts might pose challenges for element identification and interaction.
We are continuously working on improving pytest-dpg and addressing these limitations. Contributions and feedback are always welcome!
API Reference
dpgtester
set_target(func: Callable)
Set the target function for the GUI teststart_gui()
Start the GUI in a separate processpython stop_gui()
Stop the GUI process if it's runningclick_button(label: str)
Click a button with the given labelclick_tab(label: str)
Click a tab with the given labeldrag_slider(label: str, value: int)
Drag a slider to the specified value
pytest_dpg
By default, dpgtester will execute actions as quickly as possible. To slow down interactions, the following attributes can be increased
import pytest_dpg
pytest_dpg.PAUSE = 0.25
pytest_dpg.MINIMUM_DURATION = 0.5
Support
Reach out to the maintainer at one of the following places:
- GitHub issues
- Contact options listed on this GitHub profile
If you want to say thank you or/and support active development of pytest-dpg consider adding a GitHub Star to the project.
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (git checkout -b feature/AmazingFeature)
- Commit your changes (git commit -m 'Add some AmazingFeature')
- Push to the branch (git push origin feature/AmazingFeature)
- Open a Pull Request
For a full list of all authors and contributors, see the contributors page.
License
This project is licensed under the GNU General Public License v3.
See LICENSE for more information.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for pytest_dpg-0.1.4-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4e93d5e8f892e4ec7f8cef9c375be7c047abdc2a4ca92bb0b3d4273d65808bcb |
|
MD5 | c86ecf7e1662a81759e49c04d729382b |
|
BLAKE2b-256 | 2c7b267518ed8d4bb951c2428456b9c6820edf3d46fad5632618ce151f36b105 |