pytest-dpg
is a pytest plugin for testing DearPyGui (DPG) applications.
- 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
pipx is recommended although any package manager that supports pyproject.toml
files can be used.
pipx install pytest-dpg
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.
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)
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
- text input box
- combo box
-
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!
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
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
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.
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.
This project is licensed under the GNU General Public License v3.
See LICENSE for more information.