Hardware-in-the-Loop testing framework
Project description
Py-Micro-HIL
Py-Micro-HIL is a modular, lightweight Hardware-in-the-Loop (HIL) testing framework for Python.
It provides a unified interface for testing embedded systems, sensors, and communication buses
(Modbus RTU, SPI, I2C, UART, GPIO) both on Raspberry Pi hardware and in PC simulation mode.
🚀 Overview
Py-Micro-HIL enables automated functional and integration testing of embedded systems.
It supports both real hardware execution on Raspberry Pi and simulated environments on any PC.
With this framework you can:
- Write and organize test suites for hardware peripherals.
- Interface with GPIO, SPI, I2C, UART, or Modbus RTU devices.
- Use mocks for offline or CI/CD testing.
- Generate structured HTML and console reports.
- Integrate easily with pipelines or GitHub Actions.
🔗 Documentation
📚 Full developer and user documentation is available here:
➡️ https://niwciu.github.io/PY_MICRO_HIL
⚙️ Installation
🧰 Option 1 – From PyPI (recommended for most users)
pip install py-micro-hil
🧪 Option 2 – From source (for contributors)
git clone https://github.com/niwciu/PY_MICRO_HIL.git
cd PY_MICRO_HIL
pip install -e .
💡 On your hil test server, you can use the flag
--break-system-packagesto simplify installation and usage for CI/CD environments:pip install py-micro-hil --break-system-packagesIt will make your life easier whe using it in services like GitHub Actions
dependencies
pymodbus, pytest, smbus2, spidev, pyserial
Developer setup
For development and contribution:
git clone https://github.com/niwciu/PY_MICRO_HIL.git
cd PY_MICRO_HIL
pip install -e .[dev]
🧩 Example usage
1️⃣ Create a configuration file
In the project root for your project hil tests main folder, create a file peripherals_config.yaml, for example:
peripherals:
gpio:
- pin: 17
mode: out
initial: low
- pin: 18
mode: in
Full configuration reference:
📖 Configuration and YAML guide →
2️⃣ Create test files
Create a directory named hil_tests/ and add your test groups there.
Each .py file should start it's name from test and represents a test group.
Example: hil_tests/test_gpio_led.py
from py_micro_hil.assertions import *
from py_micro_hil.framework_API import *
def setup_group():
TEST_INFO_MESSAGE("Setting up gpio led test group")
def teardown_group():
TEST_INFO_MESSAGE("Tearing down gpio led test group")
def test_led_toggle():
gpio = get_RPiGPIO_peripheral()
gpio.write(17, 1)
TEST_
TEST_ASSERT_EQUAL (1, gpio.read(18))
3️⃣ Run the tests
Before running tests check available options by typing:
hiltests --help
Use the built-in CLI runner:
hiltests --config ./peripherals_config.yaml --test-dir ./hil_tests
Generate a starter group from the editable template without executing any tests:
hiltests --create-test-group gpio_smoke ./hil_tests
If both the YAML configuration and the hil_tests folder are in the same directory,
simply open this directory and run:
hiltests
4️⃣ Generate reports
Py-Micro-HIL can generate both console log files and HTML reports.
Example:
hiltests --log ./reports/log.txt
or
hiltests --html ./reports/report.html
Reports can be customized with name and path.
See: Reports and Logging →
💡 Features
- ✅ Unified test structure (
TestFramework,TestGroup,Test) - ✅ Automatic setup/teardown with context isolation
- ✅ YAML-driven configuration system
- ✅ Dynamic test discovery (
tests_group_factory) - ✅ Mock peripherals for PC environment (not RPi)
- ✅ Full logging and HTML report generation
- ✅ Native CLI interface (
hiltests) - ✅ Compatible with Raspberry Pi and Linux hosts
🧰 Supported peripherals & protocols
| Peripheral | Class | Description |
|---|---|---|
| GPIO | RPiGPIO |
Digital I/O control |
| PWM | RPiPWM, RPiHardwarePWM |
Software and hardware PWM |
| UART | RPiUART |
Serial communication via pyserial |
| I²C | RPiI2C |
SMBus-compatible interface |
| SPI | RPiSPI |
SPI interface via spidev |
| 1-Wire | RPiOneWire |
DS18B20 temperature sensors via w1-gpio |
| Modbus RTU | ModbusRTU |
RS-485 communication via pymodbus |
🧩 These are the currently implemented peripherals.
You can easily extend the framework by adding your own peripherals in the
src/py_micro_hil/peripherals/directory and implementing the required abstract interfaces.
The developer documentation includes full guidance on this process.
🤝 Contributing
We welcome contributions from the community!
Please ensure your code follows PEP-8 style and includes tests.
- Fork this repository
- Clone and install in development mode:
git clone <link to your fork>.git cd PY_MICRO_HIL pip install -e .[dev]
- Create a new branch:
git checkout -b feature/my-feature
- Make your changes and test:
pytest -v - Submit a pull request with a clear description and test coverage.
Full contribution guide:
📘 Developer Guide →
📄 License
MIT License © 2025 – @niwciu
Project details
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
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file py_micro_hil-0.1.5.tar.gz.
File metadata
- Download URL: py_micro_hil-0.1.5.tar.gz
- Upload date:
- Size: 64.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ecf4c8f23c92bae7658588ca4c97702d160cd0cc0a62a6e1849baf8e3426cfd5
|
|
| MD5 |
c00567fb3a5252de7712596ee29fb276
|
|
| BLAKE2b-256 |
d3996d47da8fb38ca92b0bdba54b480ee717384a5b26e4b419e3041c9415f445
|
File details
Details for the file py_micro_hil-0.1.5-py3-none-any.whl.
File metadata
- Download URL: py_micro_hil-0.1.5-py3-none-any.whl
- Upload date:
- Size: 53.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d31bf88b858d17e119dad11599012c0970f66466108af20052083709677d8f60
|
|
| MD5 |
c1b4802f02f202a6623617584a10e0bd
|
|
| BLAKE2b-256 |
cbfb55446110f8f40543e13a2a14ddb30e7fb5b47d29d33819575fd0c0d9119a
|