Documents the new layers introduced over the past several commits.
- docs/19_frame_io_and_alm_helpers.md (new): full reference for the
FrameIO and AlmTester helpers — three access levels (high/mid/low),
full API tables, fixture wiring, cookbook patterns, and §7
describing the four-phase SETUP/PROCEDURE/ASSERT/TEARDOWN test
pattern with the three template flavors plus a §7.4 link to the
PSU+LIN template.
- docs/14_power_supply.md: rewritten and expanded.
§3 cross-platform port resolution (Windows / WSL1 / WSL2 +
usbipd-win / Linux native compatibility table)
§4 auto-detection via idn_substr
§5 session-managed power: contract for tests, must-not list,
what changed in the existing tests
§6 the settle-then-validate pattern: two-delays table (PSU
bench-dependent vs ECU firmware-dependent), copy-paste
example, tuning guidance for ECU_VALIDATION_TIME_S
§6 PSU settling characterization (-m psu_settling)
§7 library API reference table + safe_off_on_close
§9 troubleshooting expanded with WSL2 usbipd-win + dialout
- docs/18_test_catalog.md: voltage-tolerance section refreshed for
the settle-then-validate shape, new "Hardware – PSU settling
(opt-in)" category, new §8 "Hardware-test infrastructure"
documenting conftest.py, frame_io.py, alm_helpers.py,
psu_helpers.py, and both templates.
- docs/05_architecture_overview.md: components list split into
framework core / hardware test layer / artifacts. Mermaid diagram
gained a Hardware-test helpers subgraph showing FrameIO,
AlmTester, rgb_to_pwm, and the templates. Data/control flow
summary describes the session-managed PSU and the helper layer.
- docs/15_report_properties_cheatsheet.md: PSU section split into
per-test (function-scoped rp) and module-scoped (testsuite
property) blocks; added psu_resolved_port, psu_resolved_idn,
psu_settled_s, validation_time_s.
- docs/README.md: links to the new doc 19.
- README.md, TESTING_FRAMEWORK_GUIDE.md: project-structure trees
expanded to show the full current layout — every file and
directory under tests/hardware/ (conftest, helpers, templates,
tests), tests/unit/, config/, docs/, scripts/, and vendor/.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
423 lines
17 KiB
Markdown
423 lines
17 KiB
Markdown
# ECU Testing Framework - Complete Guide
|
|
|
|
> **Heads-up:** the BabyLIN LIN adapter is **deprecated** and retained for backward compatibility only. New tests and deployments should target the MUM (Melexis Universal Master) adapter — see `docs/16_mum_internals.md`. The BabyLIN-related sections below are kept so existing rigs can still be maintained.
|
|
|
|
## Overview
|
|
|
|
This comprehensive ECU Testing Framework provides a robust solution for testing Electronic Control Units (ECUs) using pytest with the MUM LIN adapter (current) or the deprecated BabyLIN adapter. The framework includes detailed test documentation, enhanced reporting, mock interfaces for development, and real hardware integration capabilities.
|
|
|
|
## Framework Features
|
|
|
|
### ✅ **Complete Implementation Status**
|
|
- **✅ pytest-based testing framework** with custom plugins
|
|
- **✅ MUM (Melexis Universal Master) LIN integration** via the `pylin` / `pymumclient` packages — current default
|
|
- **⚠️ BabyLIN LIN integration (DEPRECATED)** via the official SDK Python wrapper (`BabyLIN_library.py`)
|
|
- **✅ Mock interface for hardware-independent development**
|
|
- **✅ Enhanced HTML/XML reporting with test metadata**
|
|
- **✅ Detailed test documentation extraction**
|
|
- **✅ Configuration management with YAML**
|
|
- **✅ Hex file flashing capabilities (scaffold)**
|
|
- **✅ Custom pytest markers for requirement traceability**
|
|
|
|
## Enhanced Reporting System
|
|
|
|
### Test Metadata Integration
|
|
|
|
The framework automatically extracts detailed test information from docstrings and integrates it into reports:
|
|
|
|
**HTML Report Features:**
|
|
- **Title Column**: Clear test descriptions extracted from docstrings
|
|
- **Requirements Column**: Requirement traceability (REQ-001, REQ-002, etc.)
|
|
- **Enhanced Test Details**: Description, test steps, and expected results
|
|
- **Marker Integration**: Custom pytest markers for categorization
|
|
|
|
**Example Test Documentation Format:**
|
|
```python
|
|
@pytest.mark.smoke
|
|
@pytest.mark.req_001
|
|
def test_mock_send_receive_echo(self, mock_interface):
|
|
"""
|
|
Title: Mock LIN Interface - Send/Receive Echo Test
|
|
|
|
Description: Validates basic send/receive functionality using the mock
|
|
LIN interface with echo behavior for development testing.
|
|
|
|
Requirements: REQ-001, REQ-003
|
|
|
|
Test Steps:
|
|
1. Connect to mock LIN interface
|
|
2. Send a test frame with ID 0x01 and data [0x55]
|
|
3. Receive the echoed frame within 100ms timeout
|
|
4. Verify frame ID and data integrity
|
|
|
|
Expected Result:
|
|
- Frame should be echoed back successfully
|
|
- Received data should match sent data exactly
|
|
- Operation should complete within timeout period
|
|
"""
|
|
```
|
|
|
|
### Report Generation
|
|
|
|
**HTML Report (`reports/report.html`):**
|
|
- Interactive table with sortable columns
|
|
- Test titles and requirements clearly visible
|
|
- Execution duration and status tracking
|
|
- Enhanced metadata from docstrings
|
|
|
|
**XML Report (`reports/junit.xml`):**
|
|
- Standard JUnit XML format for CI/CD integration
|
|
- Test execution data and timing information
|
|
- Compatible with most CI systems (Jenkins, GitLab CI, etc.)
|
|
|
|
## Project Structure
|
|
|
|
The hardware-test layer is split across three modules — see
|
|
[`docs/19_frame_io_and_alm_helpers.md`](docs/19_frame_io_and_alm_helpers.md)
|
|
for the API and the four-phase test pattern, and
|
|
[`docs/14_power_supply.md`](docs/14_power_supply.md) §5 for the
|
|
session-managed PSU lifecycle.
|
|
|
|
```
|
|
ecu_tests/
|
|
├── ecu_framework/ # Core framework package
|
|
│ ├── config.py # YAML configuration management
|
|
│ ├── lin/ # LIN communication interfaces
|
|
│ │ ├── base.py # Abstract LinInterface definition
|
|
│ │ ├── mock.py # Mock interface for development
|
|
│ │ ├── mum.py # MUM adapter (current default; pylin/pymumclient)
|
|
│ │ ├── ldf.py # LdfDatabase wrapper around ldfparser
|
|
│ │ └── babylin.py # DEPRECATED BabyLin hardware interface (kept for legacy rigs)
|
|
│ ├── power/ # Bench power supply control
|
|
│ │ └── owon_psu.py # Owon PSU SCPI controller + cross-platform resolver
|
|
│ └── flashing/ # Hex file flashing capabilities
|
|
│ └── hex_flasher.py # ECU flash programming
|
|
│
|
|
├── tests/ # Test suite
|
|
│ ├── conftest.py # Project-wide fixtures: config, lin, ldf, flash_ecu, rp
|
|
│ ├── test_smoke_mock.py # Mock interface validation tests
|
|
│ ├── test_babylin_hardware_smoke.py # Hardware smoke tests (deprecated BabyLIN)
|
|
│ ├── test_hardware_placeholder.py # Placeholder
|
|
│ ├── unit/ # Pure-logic tests (no hardware)
|
|
│ │ ├── test_config_loader.py
|
|
│ │ ├── test_linframe.py
|
|
│ │ ├── test_ldf_database.py
|
|
│ │ ├── test_hex_flasher.py
|
|
│ │ ├── test_mum_adapter_mocked.py
|
|
│ │ └── test_babylin_adapter_mocked.py # deprecated path
|
|
│ ├── plugin/
|
|
│ │ └── test_conftest_plugin_artifacts.py
|
|
│ └── hardware/ # Real-bench tests (MUM / PSU / ECU)
|
|
│ ├── conftest.py # Session-scoped autouse PSU fixture (powers the ECU)
|
|
│ ├── frame_io.py # FrameIO — generic LDF-driven send/receive/pack/unpack
|
|
│ ├── alm_helpers.py # AlmTester — ALM_Node domain helpers + constants
|
|
│ ├── psu_helpers.py # apply_voltage_and_settle — measure-rail-then-validate
|
|
│ ├── _test_case_template.py # ALM-only test starting point
|
|
│ ├── _test_case_template_psu_lin.py # PSU + LIN test starting point
|
|
│ ├── test_mum_alm_animation.py # ALM mode/update/LID checks
|
|
│ ├── test_mum_auto_addressing.py # BSM auto-addressing
|
|
│ ├── test_e2e_mum_led_activate.py # MUM end-to-end power+activate
|
|
│ ├── test_overvolt.py # Voltage-tolerance suite
|
|
│ ├── test_psu_voltage_settling.py # PSU settling-time (opt-in: -m psu_settling)
|
|
│ ├── test_owon_psu.py # PSU IDN + measurements (read-only)
|
|
│ └── test_e2e_power_on_lin_smoke.py # DEPRECATED BabyLIN E2E
|
|
│
|
|
├── config/ # Configuration files
|
|
│ ├── test_config.yaml # Main test configuration (MUM by default)
|
|
│ ├── mum.example.yaml # MUM hardware profile
|
|
│ ├── owon_psu.example.yaml # PSU profile (copy to owon_psu.yaml)
|
|
│ ├── owon_psu.yaml # Optional per-machine PSU override
|
|
│ ├── examples.yaml # Combined mock/babylin profiles
|
|
│ └── babylin.example.yaml # DEPRECATED BabyLIN profile
|
|
│
|
|
├── docs/ # Deep-dive guides (numbered for reading order)
|
|
│ ├── 01_run_sequence.md … 18_test_catalog.md
|
|
│ └── 19_frame_io_and_alm_helpers.md # Hardware test helpers + four-phase pattern
|
|
│
|
|
├── vendor/ # Third-party assets and project resources
|
|
│ ├── 4SEVEN_color_lib_test.ldf # LDF used by the LIN tests
|
|
│ ├── rgb_to_pwm.py # RGB → PWM calculator (ALM PWM assertions)
|
|
│ ├── Owon/owon_psu_quick_demo.py # Standalone PSU demo
|
|
│ ├── automated_lin_test/ # Reference scripts + Melexis package installer
|
|
│ ├── BabyLIN_library.py # DEPRECATED official SDK Python wrapper
|
|
│ └── platform libs # DEPRECATED OS-specific native libs (DLL/.so)
|
|
│
|
|
├── reports/ # Generated test reports per run
|
|
│ ├── report.html # Enhanced HTML with metadata
|
|
│ ├── junit.xml # JUnit XML for CI
|
|
│ ├── summary.md # Machine-readable run summary
|
|
│ └── requirements_coverage.json
|
|
│
|
|
├── scripts/ # Pi/CI helpers (pi_install.sh, ecu-tests.service, …)
|
|
├── conftest_plugin.py # Custom pytest plugin for enhanced reporting
|
|
├── pytest.ini # Markers, addopts, junit_family=legacy
|
|
├── requirements.txt # Python dependencies
|
|
├── README.md # Quick start + project overview
|
|
└── TESTING_FRAMEWORK_GUIDE.md # ← you are here
|
|
```
|
|
|
|
## Running Tests
|
|
|
|
### Basic Test Execution
|
|
|
|
```powershell
|
|
# Run all tests with verbose output
|
|
python -m pytest -v
|
|
|
|
# Run specific test suite
|
|
python -m pytest tests\test_smoke_mock.py -v
|
|
|
|
# Run tests with specific markers
|
|
python -m pytest -m "smoke" -v
|
|
python -m pytest -m "req_001" -v
|
|
|
|
# Run hardware tests (requires deprecated BabyLIN hardware); join with adapter marker
|
|
# Prefer MUM for new work: pytest -m "hardware and mum" -v
|
|
python -m pytest -m "hardware and babylin" -v
|
|
```
|
|
|
|
### Unit Tests (fast, no hardware)
|
|
|
|
Run only unit tests using the dedicated marker or by path:
|
|
|
|
```powershell
|
|
# By marker
|
|
python -m pytest -m unit -q
|
|
|
|
# By path
|
|
python -m pytest tests\unit -q
|
|
|
|
# Plugin self-tests (verifies reporting artifacts)
|
|
python -m pytest tests\plugin -q
|
|
```
|
|
|
|
Reports still go to `reports/` (HTML and JUnit per defaults). Open the HTML on Windows with:
|
|
|
|
```powershell
|
|
start .\reports\report.html
|
|
```
|
|
|
|
Coverage: enabled by default via pytest.ini. To disable locally:
|
|
|
|
```powershell
|
|
python -m pytest -q -o addopts=""
|
|
```
|
|
|
|
Optional HTML coverage:
|
|
|
|
```powershell
|
|
python -m pytest --cov=ecu_framework --cov-report=html -q
|
|
start .\htmlcov\index.html
|
|
```
|
|
|
|
See also: `docs/13_unit_testing_guide.md` for more details and examples.
|
|
|
|
### Report Generation
|
|
|
|
Tests automatically generate enhanced reports:
|
|
- **HTML Report**: `reports/report.html` - Interactive report with metadata
|
|
- **XML Report**: `reports/junit.xml` - CI/CD compatible format
|
|
|
|
## Configuration
|
|
|
|
### Test Configuration (`config/test_config.yaml`)
|
|
|
|
```yaml
|
|
interface:
|
|
type: mock # or "mum" for hardware (current); "babylin" is deprecated
|
|
timeout: 1.0
|
|
|
|
flash:
|
|
hex_file_path: firmware/ecu_firmware.hex
|
|
flash_timeout: 30.0
|
|
|
|
ecu:
|
|
name: Test ECU
|
|
lin_id_range: [0x01, 0x3F]
|
|
```
|
|
|
|
### BabyLIN Configuration (`config/babylin.example.yaml`) — DEPRECATED
|
|
|
|
> Retained for backward compatibility. Prefer `config/mum.example.yaml` for new work.
|
|
|
|
```yaml
|
|
interface:
|
|
type: babylin # deprecated; prefer "mum"
|
|
channel: 0 # channel index used by the SDK wrapper
|
|
bitrate: 19200 # typically set by SDF
|
|
sdf_path: ./vendor/Example.sdf
|
|
schedule_nr: 0 # schedule to start on connect
|
|
```
|
|
|
|
## Test Categories
|
|
|
|
### 1. Mock Interface Tests (`test_smoke_mock.py`)
|
|
|
|
**Purpose**: Hardware-independent development and validation
|
|
- ✅ Send/receive echo functionality
|
|
- ✅ Master request/response testing
|
|
- ✅ Timeout behavior validation
|
|
- ✅ Frame validation boundary testing
|
|
- ✅ Parameterized boundary tests for comprehensive coverage
|
|
|
|
**Status**: **7 tests passing** - Complete implementation
|
|
|
|
### 2. Hardware Smoke Tests (`test_babylin_hardware_smoke.py`) — DEPRECATED
|
|
|
|
**Purpose**: Basic BabyLIN hardware connectivity validation (deprecated path; prefer the MUM smoke tests under `tests/hardware/`)
|
|
- ✅ SDK wrapper import and device open
|
|
- ✅ Interface connection establishment
|
|
- ✅ Basic send/receive operations
|
|
- ✅ Error handling and cleanup
|
|
|
|
**Status**: Ready for hardware testing
|
|
|
|
### 3. Hardware Integration Tests (`test_hardware_placeholder.py`)
|
|
|
|
**Purpose**: Full ECU testing workflow with real hardware
|
|
- ECU flashing with hex files
|
|
- Communication protocol validation
|
|
- Diagnostic command testing
|
|
- Performance and stress testing
|
|
|
|
**Status**: Framework ready, awaiting ECU specifications
|
|
|
|
## Custom Pytest Markers
|
|
|
|
The framework includes custom markers for test categorization and requirement traceability:
|
|
|
|
```python
|
|
# In pytest.ini
|
|
markers =
|
|
smoke: Basic functionality tests
|
|
integration: Integration tests requiring hardware
|
|
hardware: Tests requiring physical hardware (MUM or, deprecated, BabyLin)
|
|
babylin: DEPRECATED. Tests targeting the legacy BabyLIN SDK adapter
|
|
mum: Tests targeting the current MUM (Melexis Universal Master) adapter
|
|
unit: Fast unit tests (no hardware)
|
|
boundary: Boundary condition and edge case tests
|
|
req_001: Tests validating requirement REQ-001 (LIN Interface Basic Operations)
|
|
req_002: Tests validating requirement REQ-002 (Master Request/Response)
|
|
req_003: Tests validating requirement REQ-003 (Frame Validation)
|
|
req_004: Tests validating requirement REQ-004 (Timeout Handling)
|
|
```
|
|
|
|
## BabyLIN Integration Details (DEPRECATED)
|
|
|
|
> Kept for backward compatibility only. New tests should use the MUM adapter (`docs/16_mum_internals.md`).
|
|
|
|
### SDK Python wrapper
|
|
|
|
The deprecated BabyLIN adapter uses the official SDK Python wrapper `BabyLIN_library.py` (placed under `vendor/`) and calls its BLC_* APIs.
|
|
|
|
Key calls in the adapter (`ecu_framework/lin/babylin.py`):
|
|
- `BLC_getBabyLinPorts`, `BLC_openPort` — discovery and open
|
|
- `BLC_loadSDF`, `BLC_getChannelHandle`, `BLC_sendCommand('start schedule N;')` — SDF + scheduling
|
|
- `BLC_mon_set_xmit` — transmit
|
|
- `BLC_getNextFrameTimeout` — receive
|
|
- `BLC_sendRawMasterRequest` — master request (length then bytes)
|
|
|
|
## Development Workflow
|
|
|
|
### 1. Development Phase
|
|
```powershell
|
|
# Use mock interface for development
|
|
python -m pytest tests\test_smoke_mock.py -v
|
|
```
|
|
|
|
### 2. Hardware Integration Phase
|
|
```powershell
|
|
# Test with deprecated BabyLIN hardware (legacy rigs only)
|
|
# Prefer MUM: python -m pytest -m "hardware and mum" -v
|
|
python -m pytest -m "hardware and babylin" -v
|
|
```
|
|
|
|
### 3. Full System Testing
|
|
```powershell
|
|
# Complete test suite including ECU flashing
|
|
python -m pytest -v
|
|
```
|
|
|
|
## Enhanced Reporting Output Example
|
|
|
|
The enhanced HTML report includes:
|
|
|
|
| Result | Test | Title | Requirements | Duration | Links |
|
|
|--------|------|-------|--------------|----------|--------|
|
|
| ✅ Passed | test_mock_send_receive_echo | Mock LIN Interface - Send/Receive Echo Test | REQ-001, REQ-003 | 1 ms | |
|
|
| ✅ Passed | test_mock_request_synthesized_response | Mock LIN Interface - Master Request Response Test | REQ-002 | 0 ms | |
|
|
| ✅ Passed | test_mock_receive_timeout_behavior | Mock LIN Interface - Receive Timeout Test | REQ-004 | 106 ms | |
|
|
|
|
## Framework Validation Results
|
|
|
|
**Current Status**: ✅ **All core features implemented and tested**
|
|
|
|
**Mock Interface Tests**: 7/7 passing (0.14s execution time)
|
|
- Send/receive operations: ✅ Working
|
|
- Timeout handling: ✅ Working
|
|
- Frame validation: ✅ Working
|
|
- Boundary testing: ✅ Working
|
|
|
|
**Enhanced Reporting**: ✅ **Fully functional**
|
|
- HTML report with metadata: ✅ Working
|
|
- XML report generation: ✅ Working
|
|
- Custom pytest plugin: ✅ Working
|
|
- Docstring metadata extraction: ✅ Working
|
|
|
|
**Configuration System**: ✅ **Complete**
|
|
- YAML configuration loading: ✅ Working
|
|
- Environment variable override: ✅ Working
|
|
- BabyLIN SDF/schedule configuration: ✅ Working (deprecated path)
|
|
- Power supply (PSU) configuration: ✅ Working (see `config/test_config.yaml` → `power_supply`)
|
|
|
|
## Owon Power Supply (PSU) Integration
|
|
|
|
The framework includes a serial SCPI controller for Owon PSUs and a hardware test wired to the central config.
|
|
|
|
- Library: `ecu_framework/power/owon_psu.py` (pyserial)
|
|
- Config: `config/test_config.yaml` (`power_supply` section)
|
|
- Optionally merge machine-specific settings from `config/owon_psu.yaml` or env `OWON_PSU_CONFIG`
|
|
- Hardware test: `tests/hardware/test_owon_psu.py` (skips unless `power_supply.enabled` and `port` present)
|
|
- quick demo: `vendor/Owon/owon_psu_quickdemo.py`
|
|
|
|
Quick run:
|
|
|
|
```powershell
|
|
pip install -r .\requirements.txt
|
|
copy .\config\owon_psu.example.yaml .\config\owon_psu.yaml
|
|
# edit COM port in .\config\owon_psu.yaml
|
|
pytest -k test_owon_psu_idn_and_optional_set -m hardware -q
|
|
python .\vendor\Owon\owon_psu_quick_demo.py
|
|
```
|
|
|
|
Common config keys:
|
|
|
|
```yaml
|
|
power_supply:
|
|
enabled: true
|
|
port: COM4
|
|
baudrate: 115200
|
|
timeout: 1.0
|
|
eol: "\n"
|
|
parity: N
|
|
stopbits: 1
|
|
idn_substr: OWON
|
|
```
|
|
|
|
## Next Steps
|
|
|
|
1. **Hardware Testing**: Connect MUM hardware (or, for legacy rigs, BabyLin) and validate the corresponding hardware smoke tests
|
|
2. **ECU Integration**: Define ECU-specific communication protocols and diagnostic commands
|
|
3. **Hex Flashing**: Implement complete hex file flashing workflow
|
|
4. **CI/CD Integration**: Set up automated testing pipeline with generated reports
|
|
|
|
## Dependencies
|
|
|
|
```
|
|
pytest>=8.4.2
|
|
pytest-html>=4.1.1
|
|
pytest-xdist>=3.8.0
|
|
pyyaml>=6.0.2
|
|
```
|
|
|
|
This framework provides a complete, production-ready testing solution for ECU development. The current LIN path uses the MUM adapter; the BabyLIN adapter is retained as a deprecated fallback for legacy rigs. Enhanced documentation, traceability, and reporting are available regardless of the adapter in use. |