# Modbus integration-test fixture — pymodbus simulator The Modbus driver's integration tests talk to a [`pymodbus`](https://pymodbus.readthedocs.io/) simulator running as a pinned Docker container. One image, per-profile service in compose, same port binding (`5020`) regardless of which profile is live. Docker is the only supported launch path — a fresh clone needs Docker Desktop and nothing else. | 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. ## References - [`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