南向驱动测试报告
测试日期: 2026-06-27
环境: macOS (darwin), Go toolchain,CGO_ENABLED=0
范围:internal/driver/...与相关internal/core/...集成测试
一、测试执行摘要
1.1 命令与结果
# 驱动包单元测试(含覆盖率)
CGO_ENABLED=0 go test ./internal/driver/... -count=1 -cover
# 核心包单元测试(含覆盖率)
CGO_ENABLED=0 go test ./internal/core/... -count=1 -cover
# 性能基准(EtherNet/IP 调度器)
CGO_ENABLED=0 go test -bench=. -benchmem ./internal/driver/ethernetip -run=^$ -count=1
| 测试范围 | 结果 | 覆盖率 | 备注 |
|---|---|---|---|
internal/driver/*(主驱动包) |
PASS | 12.1% | ConnectionManager 公共组件 |
internal/driver/modbus |
PASS | 27.0% | 耗时 ~121s(含场景测试) |
internal/driver/bacnet |
PASS | 59.1% | 耗时 ~84s |
internal/driver/bacnet/utsm |
PASS | — | 异步 UTSM 单元测试 |
internal/driver/opcua |
PASS | 40.3% | 耗时 ~126s |
internal/driver/s7 |
PASS | 42.0% | 耗时 ~121s |
internal/driver/ethernetip |
PASS | 30.3% | — |
internal/driver/omron |
PASS | 25.3% | — |
internal/driver/snmp |
PASS | 33.9% | — |
internal/driver/ice104 |
PASS | 23.4% | M1 单元测试 |
internal/driver/dlt645 |
无测试 | 0.0% | 仅 stub 注册 |
internal/driver/mitsubishi |
无测试 | 0.0% | 仅 stub 注册 |
internal/driver/... 汇总 |
PASS | — | 含 bacnet 子包 |
internal/core/... |
PASS | 47.9% | 含 VirtualShadowEngine pipeline fan-out |
结论: ./internal/driver/... 与 ./internal/core/... 在 CGO_ENABLED=0 下全部通过。DL/T645、Mitsubishi SLMP 仍为 stub,无单元测试。
二、各驱动单元测试明细
| 驱动 | 注册名 | 测试文件数 | 测试函数数(约) | 覆盖率 | 状态 |
|---|---|---|---|---|---|
| Modbus | modbus-tcp / modbus-rtu / modbus-rtu-over-tcp (+ simple 变体) |
7 | 33 | 27.0% | 是 |
| BACnet IP | bacnet-ip |
28+ | 80+ | 59.1% | 是 |
| OPC UA | opc-ua |
5 | 25 | 40.3% | 是 |
| Siemens S7 | s7 |
5 | 52 | 42.0% | 是 |
| EtherNet/IP | ethernet-ip |
14 | 57 | 30.3% | 是 |
| Omron FINS | omron-fins |
1 | 6 | 25.3% | 是 |
| SNMP | snmp |
2 | 15 | 33.9% | 是 |
| IEC 60870-5-104 | iec60870-5-104 |
2 | 8 | 23.4% | 是 |
| DL/T645 | dlt645 |
0 | 0 | 0.0% | Stub |
| Mitsubishi SLMP | mitsubishi-slmp |
0 | 0 | 0.0% | Stub |
| ConnectionManager | — | 1 | 10 | 12.1% | 是 |
2.1 主要测试文件
| 驱动 | 关键测试文件 | 覆盖内容 |
|---|---|---|
| Modbus | scenario_test.go, decoder_*_test.go, modbus_optimization_test.go |
连接管理、解码、MTU 优化 |
| BACnet | scenario_test.go, isolation_test.go, acceptance_test.go |
故障隔离、设备发现、验收 |
| OPC UA | scenario_test.go, opcua_test.go |
连接管理、读写、数据格式 |
| S7 | scenario_test.go, decoder_test.go, connection_manager_test.go |
地址解析、退避、PLC 型号 |
| EtherNet/IP | scenario_test.go, integration_test.go, scheduler_perf_test.go |
重连、Tag 分组、性能 |
| SNMP | snmp_test.go, decoder_test.go |
v2c/v3 配置、OID 解码 |
| ICE104 | ice104_test.go, decoder_test.go |
APDU 解码、配置解析 |
| Omron FINS | fins_test.go |
地址转换、配置映射 |
三、性能与基准测试
3.1 EtherNet/IP 调度器基准(CGO_ENABLED=0,2026-06-27)
运行环境: Intel Core i5-5257U @ 2.70GHz, darwin/amd64
| 基准测试 | 结果 | 内存分配 |
|---|---|---|
BenchmarkGroupTags/GroupTags_100_Points |
119.8 ns/op | 72 B/op, 2 allocs/op |
BenchmarkGroupTags/GroupTags_500_Points |
496.7 ns/op | 744 B/op, 5 allocs/op |
BenchmarkGroupTags/GroupTags_1000_Points |
941.2 ns/op | 1640 B/op, 6 allocs/op |
BenchmarkPointParsing |
5833 ns/op | 498 B/op, 12 allocs/op |
BenchmarkStatsIncrement |
12.33 ns/op | 0 allocs/op |
BenchmarkTagGroupOperations/TagGroup_Add_100 |
22622 ns/op | 8071 B/op, 200 allocs/op |
3.2 ShadowCore 基准(需 integration 构建标签)
internal/core/shadow_performance_test.go 含 7 个 Benchmark(WriteShadowDevice、GetShadowDevice、ShadowIngress 等),标记为 //go:build integration。
当前以 -tags=integration 运行 ./internal/core 会因 mockStressDriver 重复声明而编译失败(scan_engine_scale_test.go 与 scan_engine_large_scale_test.go 冲突)。基准结果暂无法在本环境复现。
3.3 ScanEngine 规模测试(参考)
历史报告见 ScanEngine 重构测试报告:
- 100 设备混合协议压力测试通过
- 调度吞吐量目标 ≥10 设备/秒,实测达标
- 背压控制、资源限制符合设计预期
四、边界场景覆盖矩阵
| 场景 | Modbus | BACnet | OPC UA | S7 | ENIP | FINS | SNMP | ICE104 | Core |
|---|---|---|---|---|---|---|---|---|---|
| 超时 / 退避 | 是 | 是 | 是 | 是 | 是 | — | — | — | 是 |
| 重连 / 半开探测 | 是 | 是 | 是 | 是 | 是 | — | — | — | 是 |
| 冷却期 / Dead 状态 | 是 | 是 | 是 | 是 | 是 | — | — | — | — |
| 无效配置 / 地址 | 是 | 是 | — | 是 | 是 | — | 是 | — | 是 |
| 空点位 / 空 ID | — | — | — | — | — | — | — | — | 是 |
| 通道离线 / 设备状态 | — | — | — | — | — | — | — | — | 是 |
| 采集优先级 | — | — | — | — | — | — | — | — | 是 |
| 设备故障隔离 | — | 是 | — | — | — | — | — | — | — |
| 并发安全 | 是 | — | 是 | 是 | 是 | — | — | — | 是 |
| 每日计数清零 | 是 | 是 | 是 | 是 | — | — | — | — | — |
图例: 有专门测试 · — 无专门测试或未覆盖
4.1 代表性边界测试
- 重连:
ethernetip/integration_test.go—TestConnectionReconnect - 连续失败触发重连:
s7/scenario_test.go—TestScenario_ConsecutiveFailuresTriggerReconnect - 通道离线:
core/channel_device_state_test.go—TestResolveEffectiveDeviceState_ChannelOffline - 采集优先级:
core/scan_engine_test.go—TestScanEngine_Priority - SNMP 无效 OID:
snmp/decoder_test.go—TestParseAddressInvalid - BACnet 故障隔离:
bacnet/scenario_test.go—TestScenario_HandleReadFailureIsolation
五、已知缺口与风险
| 项目 | 说明 | 建议 |
|---|---|---|
| DL/T645 / Mitsubishi SLMP | 仅模拟实现,无单元测试 | 真实协议实现后再补测试 |
| SNMP / ICE104 | 无联机集成测试(无真实设备/模拟器 CI) | 参考 联机测试方案 补充 |
| ShadowCore 基准 | integration 标签下编译冲突 | 合并 mock 定义或拆分 build tag |
| 覆盖率 | 主驱动包 23–59%,stub 为 0% | 持续补充 scenario 与集成测试 |
六、本地运行指南
# 全量驱动 + 核心包
CGO_ENABLED=0 go test ./internal/driver/... ./internal/core/... -count=1 -cover
# 单驱动详细输出
CGO_ENABLED=0 go test ./internal/driver/snmp -v -count=1
# EtherNet/IP 性能基准
CGO_ENABLED=0 go test -bench=. -benchmem ./internal/driver/ethernetip -run=^$ -count=1
# 核心包(当前有 1 个失败用例)
CGO_ENABLED=0 go test ./internal/core/... -count=1 -cover
# 通道回归方案
# 见 docs/testing/南向采集通道回归验证测试方案.md