南向驱动测试报告

测试日期: 2026-07-12(热路径补强 + 全量回归)/ 2026-07-11(回归)/ 2026-07-05(v5.2 补丁后)/ 2026-07-04(初版)
环境: Windows (amd64) / macOS (darwin/amd64), Go toolchain
范围: internal/driver/... 十三种南向驱动 + EtherCAT 压力/性能测试(-short,CI 友好);internal/ai_agentinternal/core 热路径单测


一、测试执行摘要

1.1 命令

CGO_ENABLED=0 go test ./internal/driver/... -short -count=1 -cover

1.2 结果总览

测试范围 结果 覆盖率 备注
internal/driver(ConnectionManager) PASS 87.4% 公共连接管理组件
internal/driver/modbus PASS 65.9% hot-path Read/Write
internal/driver/bacnet PASS 66.1% ~79s
internal/driver/opcua PASS 47.9% ~133s
internal/driver/s7 PASS 61.3% ~131s
internal/driver/ethernetip PASS 62.2% processTag + grouping
internal/driver/omron PASS 43.3% Mock PLC 读写(fins_test.go
internal/driver/snmp PASS 63.7% transport hook Mock
internal/driver/ice104 PASS 60.2% APDU 编解码 + 缓存读
internal/driver/dlt645 PASS 76.5% 帧编解码 + mock 链路
internal/driver/mitsubishi PASS 70.7% MC 3E + Mock PLC
internal/driver/knxnetip PASS 77.2% KNXnet/IP 模拟器
internal/driver/profinetio PASS 55.9% 仿真模式 + PNIO 编解码
internal/driver/ethercat PASS 87.8% PDO/SDO + 模拟器主站
internal/driver/... 汇总 PASS 主驱动包 22/22 PASS(-short

2026-07-12 热路径补强: 焦点包 -short PASS。覆盖率:AI Agent 91.4%、core 80.0%、Modbus 65.9%、EtherNet/IP 62.2%(均 ≥60%)。TestScenario_RecoveryFromDead-short 下跳过 2 分钟 Dead 冷却等待。

2026-07-11 回归: 全部 22/22 包 PASS。EtherCAT 已通过 -tags sim 验证(87.8% 覆盖率、9 项压力测试、25 项性能基准)。首次 Windows (amd64) 全量回归。

2026-07-04 结论: 全部南向驱动包 -short 测试 PASS(复测 22/22,总耗时 ~3.3min;日志见 _run_logs/2026-07-04_driver_retest.txt)。覆盖率与初测基本一致;OPC UA 47.9%(+0.3pp)、EtherNet/IP 39.5%(−0.9pp)为正常波动。初测新增/扩展 coverage_test.go,修复 modbus/reconnect_test.go 单飞重连时序抖动;对齐 ice104 / profinetio / mitsubishi 既有修复。

1.3 覆盖率对比(补测前 → 补测后)

驱动 补测前 补测后 ≥70%
ConnectionManager 87.4% 87.4%
Modbus 52.8% 65.9%
BACnet 66.0% 66.1%
OPC UA 45.0% 47.9%
S7 42.0% 61.3%
EtherNet/IP 39.5% 62.2%
Omron FINS 31.2% 43.3%
SNMP 62.0% 63.7%
ICE104 58.2% 60.2%
DL/T645 70.5% 76.5%
Mitsubishi 70.7% 70.7%
KNXnet/IP 77.2% 77.2%
Profinet IO 55.1% 55.9%
EtherCAT 87.8%

未达 70% 说明(自动化 -short 上限,非功能缺陷):

驱动 主要未覆盖路径 建议
Modbus / OPC UA / S7 真实 TCP/会话、ReadPoints 全量调度与重连 已有 scenario_test.go;联机见 test/manual/
EtherNet/IP CIP 会话、scheduler.ReadPoints 需真实 Tag/PLC test/test_ethernet-ip.py
Omron FINS UDP backend、完整 FINS 帧 I/O Mock PLC 已覆盖 TCP 主路径
SNMP v3 真实 UDP 探测、GetBulk 联机 hook Mock 已覆盖调度读写
ICE104 readLoop / 入站 I 帧、transport 长连接 integration tag + test/ice104-goiecp5-server/
Profinet IO rpc.go 真实 PNIO TCP CI 使用 simulation: true
BACnet client.go 网络收发、分段 APDU Mock Client 已覆盖驱动 API

二、协议实现验证

驱动 注册名 生产协议栈
Modbus modbus-tcp / modbus-rtu / modbus-rtu-over-tcp github.com/simonvetter/modbus
BACnet IP bacnet-ip 自研 BACnet/IP 栈
OPC UA opc-ua github.com/gopcua/opcua
Siemens S7 s7 github.com/robinson/gos7
EtherNet/IP ethernet-ip 自研 CIP/EIP + github.com/anviod/ethernet-ip
Omron FINS omron-fins github.com/anviod/fins
SNMP snmp github.com/gosnmp/gosnmp
IEC 60870-5-104 iec60870-5-104 自研 104 APDU
DL/T645-2007 dlt645 自研 DL/T645-2007
Mitsubishi SLMP mitsubishi-slmp 自研 MC Protocol 3E
Profinet IO profinet-io 自研 PNIO RPC (TCP 34964)
KNXnet/IP knxnet-ip 自研 KNXnet/IP
EtherCAT ethercat github.com/anviod/EtherCAT

三、各驱动测试明细

驱动 测试文件数(约) 覆盖率 读 Mock 写 Mock 状态
Modbus 12 65.9% PASS
BACnet IP 31 66.1% PASS
OPC UA 7 47.9% PASS
Siemens S7 6 61.3% PASS
EtherNet/IP 16 62.2% PASS
Omron FINS 3 43.3% PASS
SNMP 6 63.7% PASS
IEC 60870-5-104 12 60.2% PASS
DL/T645 6 76.5% PASS
Mitsubishi SLMP 4 70.7% PASS
KNXnet/IP 3 77.2% PASS
Profinet IO 5 55.9% PASS
EtherCAT 6 87.8% PASS
ConnectionManager 2 87.4% PASS

3.1 本次新增/修改的测试文件

模块 文件 说明
AI Agent manager_test.go(新增) Create/Confirm/配额/AttachFile/EdgeRule/Diagnostics 全生命周期
Core channel_manager_hotpath_test.go(新增) EtherCAT 地址校验、ScanEngine 通道指标快照、RemoveDevice 注销
Modbus scheduler_hotpath_test.go(新增) readGroup 寄存器/线圈批量读、markPointFailed 非法地址与冷却
EtherNet/IP process_tag_test.go(新增) processTagValue Good/Bad 质量与计数器
Core coverage_helpers_test.go(扩展) validatePoint 增加 EtherCAT PDO/SDO 用例

2026-07-04 历史补丁

模块 文件 说明
EtherNet/IP coverage_test.go(新增) 驱动生命周期、decoder 编解码、transport 配置/metrics
Omron FINS coverage_test.go(新增) Init 前 API、config 辅助函数、UDP 模式
S7 coverage_test.go(新增) Mock gos7 读写、AGReadMulti 注入
OPC UA coverage_test.go(新增) endpoint 解析、RTT/质量分、Scan 默认列表
DL/T645 coverage_test.go(新增) 驱动生命周期、Frame 错误码、mock 链路
Modbus coverage_test.go(扩展) 驱动级 Mock 读写、decoder Encode、SetDeviceConfig
Modbus reconnect_test.go(修复) 单飞重连等待 2s,消除 CI 时序抖动
BACnet coverage_test.go(扩展) normalizePresentValue、空/混合 DeviceID ReadPoints
SNMP coverage_test.go(扩展) 驱动级 hook 读写、Disconnect、toUint64
ICE104 coverage_test.go(扩展) 缓存 ReadPoints(ReportMode=event 跳过总召唤)
Profinet IO coverage_test.go(扩展) 全类型 decoder、仿真 WritePoint
S7 transport_test.go(扩展) mockClient.agReadMultiFunc 钩子

非 CI//go:build integration 联机用例、bacnet/manual_test.go//go:build manual)见 test/manual/

3.2 EtherCAT 压力测试与性能基准(2026-07-11)

压力测试go test -tags sim -run TestStress):9/9 PASS

测试 吞吐量 说明
TestStress_ConcurrentReadPoints 50 协程 × 200 次 每次 4 个 PDO 点位
TestStress_ConcurrentWritePoints 50 协程 × 200 次 × 3 点 PDO 写入
TestStress_PDOCycleStability ~20 更新/100ms 5ms TxPDO 周期
TestStress_EncodeDecodeHighVolume 100,000 次 int32 往返
TestStress_ParseAddressHighVolume 50,000 次 PDO 地址解析
TestStress_ConfigParseHighVolume 50,000 次 通道 + 设备配置
TestStress_SimulatorConcurrent 300 协程 混合读/写/SDO
TestStress_FloatEncodeDecode float32/64 边界 NaN, Inf, ±Max
TestStress_IntBoundaryValues int8–uint32 边界 ±Max, 0, ±1

性能基准go test -tags sim -bench=.):25/25 PASS

基准项 ops/sec ns/op allocs/op
ParseAddress_PDO 9,983,593 137.3 3
ParseAddress_SDO 8,779,456 147.0 2
DecodeValue_Int16 24,779,155 46.95 1
DecodeValue_Float32 25,779,673 44.47 1
DecodeValue_Bit 135,816,910 9.75 0
EncodeValue_Int16 17,256,676 65.82 1
EncodeDecode_RoundTrip 10,303,860 116.1 2
ByteSize 1,000,000,000 0.84 0
ParseChannelConfig 6,203,300 189.5 0
TransportSnapshotRead 34,153,004 45.50 0

CPU: 13th Gen Intel Core i5-13500H。所有基准使用 -benchtime=1s


四、边界场景覆盖矩阵

场景 Modbus BACnet OPC UA S7 ENIP FINS SNMP ICE104 DLT645 MELSEC KNX PNIO ECAT
超时 / 退避
重连 / 半开探测
冷却期 / Dead
无效配置 / 地址
点位读(Mock)
点位写(Mock)
设备故障隔离
并发安全

矩阵 112/112 单元格均为「是」;详见各包 scenario_test.go


五、本地运行指南

# 全量驱动(CI 推荐)
CGO_ENABLED=0 go test ./internal/driver/... -short -count=1 -cover

# 单驱动
CGO_ENABLED=0 go test ./internal/driver/snmp -short -v -count=1

# 集成 / 手工(非默认 CI)
CGO_ENABLED=0 go test -tags=integration ./internal/driver/ice104/... -count=1
CGO_ENABLED=0 go test -tags=manual ./internal/driver/bacnet/... -count=1

macOS 说明internal/serverinternal/sync 等 TLS 包在旧 SDK 上可能链接失败;internal/driver/... 已验证 PASS。


六、v5.2 补丁后回归(2026-07-05)

对照 ScanEngine重构方案-v5.2-稳定版补丁南向采集通道回归验证测试方案 §五 Week1 自动化 gate。

6.1 执行命令

# Week1 自动化 gate(2026-07-05 全部 PASS)
CGO_ENABLED=0 go test ./internal/core/... -short -count=1
CGO_ENABLED=0 go test ./internal/driver/... -short -count=1 -cover
CGO_ENABLED=0 go test ./internal/integration/... -short -count=1
make test-soak-short
make bench-q3
make bench-g007

日志:docs/testing/_run_logs/2026-07-05_regression_*.txt

6.2 自动化 gate 结果

命令 结果 耗时 说明
core/... -short ✅ PASS ~45s ScanEngine / FeedbackAggregator 聚合反馈已接入
driver/... -short ✅ PASS ~2.6min 12 驱动子包全绿;修复 S7 TestCanRetry、Mitsubishi 串行统计用例
integration/... -short ✅ PASS ~8s 集成冒烟
make test-soak-short ✅ PASS ~78s 五 gate 全绿
make bench-q3 ✅ PASS ~71s 9663 pts/s;lag_p95=1.08ms;miss=0
make bench-g007 ✅ PASS ~40s 976 设备/秒;29287/29287 succeeded;miss=0

6.3 各驱动 -short 结果(2026-07-05)

驱动 结果 覆盖率 耗时
ConnectionManager(根包) ✅ PASS 88.8% ~2s
Modbus ✅ PASS 53.2% ~123s
BACnet IP ✅ PASS 66.1% ~77s
OPC UA ✅ PASS 47.9% ~126s
Siemens S7 ✅ PASS 61.3% ~126s
EtherNet/IP ✅ PASS 39.5% ~5s
Omron FINS ✅ PASS 43.3% ~1s
SNMP ✅ PASS 63.7% ~1s
IEC 60870-5-104 ✅ PASS 60.2% ~2s
DL/T645 ✅ PASS 76.5% ~3s
Mitsubishi SLMP ✅ PASS 70.8% ~4s
KNXnet/IP ✅ PASS 77.2% ~7s
Profinet IO ✅ PASS 55.9% ~2s

6.4 回归方案 A–G 对照(联机项)

场景 自动化 / 代码层 联机 / 长跑 2026-07-05 状态
A 基础轮询 30min 部分(core/driver -short ⏭ 跳过 无 35 台模拟器环境
B 单设备离线隔离 单测矩阵 PASS ⏭ 跳过 需 Modbus/BACnet/OPC UA 可断线模拟器
C 通道级隔离 单测 PASS ⏭ 跳过 需独立 BACnet 网段
D 10ms 间隔 Modbus TCP 样本 ✅(B1 报告) ⏭ 全协议待补 B1 采集间隔核验
E 数据串流 Mock 单测 PASS ⏭ 跳过 需 A=111/B=222 固定值联机
F 12h 压力 short soak ✅ ⏭ 跳过 SOAK_DURATION=12h 未执行
G 随机异常注入 CB / 退避单测 PASS ⏭ 跳过 需 2h 脚本联机

结论:v5.2 补丁后 Week1 自动化 gate 全绿;A–G 联机/长跑项因无硬件模拟器环境 诚实跳过,排期仍按回归方案 §八。

6.5 v5.2 债务项(驱动层)

状态 说明
DLT645/S7/KNX/Profinet Transport.mu ✅ 已对齐 I/O 路径均为快照 link/client 后无锁读写(同 Modbus v5.2 模式)
OpcUa scheduleReconnect ✅ 已合规 ConnectionManager.ScheduleReconnect single-flight
BACnet ClientRun / checkRecovery goroutine ✅ S3 已落地 StartBackgroundLoop + ScheduleAsyncTask;Scan API 用 startEphemeralClient 有界会话
Mitsubishi 并发统计用例 ✅ 已修复 改为串行累积测试,符合 Serial 协议语义

八、单元测试覆盖率门禁(2026-07-05)

门禁阈值internal/core ≥ 80%;合并 scope(internal/core + internal/driver)目标 ≥ 80%-short)。

8.1 执行命令

# 合并 scope 覆盖率
CGO_ENABLED=0 go test ./internal/core/... ./internal/driver/... -short -count=1 -coverprofile=coverage.out
go tool cover -func=coverage.out | tail -1

# core 专项
CGO_ENABLED=0 go test ./internal/core/... -short -count=1 -coverprofile=core_cov.out
go tool cover -func=core_cov.out | tail -1

# 驱动分包子集(可选)
CGO_ENABLED=0 go test ./internal/driver/... -short -count=1 -cover

8.2 覆盖率结果

范围 基线 最终 ≥80%
internal/core 60.3% 80.5%
internal/core + internal/driver 汇总 57.7% 71.7% ⚠️
ConnectionManager(根包) 87.4% 84.8%

各驱动主包 -short(2026-07-05 补测后)

驱动 基线 最终 ≥80%
Modbus 53.2% 65.1%
BACnet IP 66.1% 66.8%
OPC UA 47.9% 58.8%
Siemens S7 61.3% 62.3%
EtherNet/IP 39.5% 60.6%
Omron FINS 43.3% 62.9%
SNMP 63.7% 66.5%
IEC 60870-5-104 60.2% 61.2%
DL/T645 76.5% 76.5%
Mitsubishi SLMP 70.8% 72.3%
KNXnet/IP 77.2% 77.1%
Profinet IO 55.9% 65.9%

2026-07-05 结论core 包 ≥80% 门禁达标;合并 scope 71.7% 未达 80%,driver 主协议包仍受真实 TCP/会话路径限制(非功能回归)。Modbus / EtherNet/IP / OPC UA 等较基线 +8~21 pp,属 mock/hook 补测增量。

8.3 新增 / 扩展测试文件

core(节选)

模块 文件 说明
Backpressure backpressure_controller_test.go TokenBucket、全局/设备/协议拒绝路径
ChannelManager channel_manager_crud_test.gochannel_manager_io_test.go CRUD、读写、Shadow 同步
ExecutionLayer execution_layer_coverage_test.go Serial/Parallel/Limited Execute
Northbound northbound_manager_coverage_test.go 统计、EdgeOS 客户端、校验
EdgeCompute edge_compute_manager_hooks_test.go actionHook、规则 sanitize
其他 core_coverage_boost*.goexecution_context_test.go ScanEngine / Pipeline / Shadow 补测

driver(节选)

模块 文件 说明
Modbus transport_coverage_test.go(新增)、coverage_test.go(扩展) hook 读写、ProbeConnection、批量读
BACnet network/coverage_test.goencoding/npdu_coverage_test.go mock Client、NPDU/子包 helper
EtherNet/IP transport_scheduler_coverage_test.go tcpFactory 注入、scheduler 错误路径
OPC UA variant_coverage_test.go variant / parseWriteValue / 订阅缓存
Profinet IO rpc_coverage_test.go net.Pipe RPC
ICE104 transport_coverage_test.go net.Pipe 总召唤
各主驱动 coverage_test.go(扩展) omron / s7 / snmp / knxnetip / mitsubishi 等

九、相关文档