76 lines
3.0 KiB
Markdown
76 lines
3.0 KiB
Markdown
# Modbus integration-test fixture — pymodbus simulator (Docker)
|
|
|
|
The Modbus driver's integration tests talk to a
|
|
[`pymodbus`](https://pymodbus.readthedocs.io/) simulator. Docker is the
|
|
primary launcher — one pinned image, per-profile service in compose, same
|
|
port binding (`5020`) regardless of which profile is live. A native-Python
|
|
fallback lives under [`../Pymodbus/`](../Pymodbus/) for contributors who
|
|
don't want to run Docker locally.
|
|
|
|
| File | Purpose |
|
|
|---|---|
|
|
| [`Dockerfile`](Dockerfile) | `python:3.12-slim-bookworm` + `pymodbus[simulator]==3.13.0` + the four profile JSONs |
|
|
| [`docker-compose.yml`](docker-compose.yml) | One service per profile (`standard` / `dl205` / `mitsubishi` / `s7_1500`); all bind `:5020` so only one runs at a time |
|
|
| [`profiles/*.json`](profiles/) | Same seed-register definitions the native launcher uses — canonical source |
|
|
|
|
## Run
|
|
|
|
From the repo root:
|
|
|
|
```powershell
|
|
# Build + start the standard profile
|
|
docker compose -f tests\ZB.MOM.WW.OtOpcUa.Driver.Modbus.IntegrationTests\Docker\docker-compose.yml --profile standard up
|
|
|
|
# DL205 quirks
|
|
docker compose -f tests\ZB.MOM.WW.OtOpcUa.Driver.Modbus.IntegrationTests\Docker\docker-compose.yml --profile dl205 up
|
|
|
|
# Mitsubishi MELSEC quirks
|
|
docker compose -f tests\ZB.MOM.WW.OtOpcUa.Driver.Modbus.IntegrationTests\Docker\docker-compose.yml --profile mitsubishi up
|
|
|
|
# Siemens S7-1500 MB_SERVER quirks
|
|
docker compose -f tests\ZB.MOM.WW.OtOpcUa.Driver.Modbus.IntegrationTests\Docker\docker-compose.yml --profile s7_1500 up
|
|
```
|
|
|
|
Detached + stop:
|
|
|
|
```powershell
|
|
docker compose -f tests\...\Docker\docker-compose.yml --profile dl205 up -d
|
|
docker compose -f tests\...\Docker\docker-compose.yml --profile dl205 down
|
|
```
|
|
|
|
Only one profile binds `:5020` at a time; switch by stopping the current
|
|
service + starting another. The integration tests discriminate by a
|
|
separate `MODBUS_SIM_PROFILE` env var so they skip correctly when the
|
|
wrong profile is live.
|
|
|
|
## Endpoint
|
|
|
|
- Default: `localhost:5020`
|
|
- Override with `MODBUS_SIM_ENDPOINT` (e.g. a real PLC on `:502`).
|
|
|
|
## Run the integration tests
|
|
|
|
In a separate shell with one profile live:
|
|
|
|
```powershell
|
|
cd C:\Users\dohertj2\Desktop\lmxopcua
|
|
dotnet test tests\ZB.MOM.WW.OtOpcUa.Driver.Modbus.IntegrationTests
|
|
```
|
|
|
|
`ModbusSimulatorFixture` probes `localhost:5020` at collection init +
|
|
records a `SkipReason` when unreachable, so tests stay green on a fresh
|
|
clone without Docker running.
|
|
|
|
## Native-Python fallback
|
|
|
|
See [`../Pymodbus/README.md`](../Pymodbus/README.md) + `serve.ps1` — the
|
|
same profiles, launched via local Python install. Kept for contributors
|
|
who prefer it. Docker is the reproducible path; if CI results disagree
|
|
with a local native run, Docker is the source of truth.
|
|
|
|
## References
|
|
|
|
- [`../Pymodbus/README.md`](../Pymodbus/README.md) — same fixture, native launcher
|
|
- [`docs/drivers/Modbus-Test-Fixture.md`](../../../docs/drivers/Modbus-Test-Fixture.md) — coverage map + gap inventory
|
|
- [`docs/v2/dev-environment.md`](../../../docs/v2/dev-environment.md) §Docker fixtures — full fixture inventory
|