350 lines
7.1 KiB
Markdown
350 lines
7.1 KiB
Markdown
|
|
# 周界入侵自动解除功能测试快速指南
|
|||
|
|
|
|||
|
|
## 快速验证步骤
|
|||
|
|
|
|||
|
|
### 1. Edge端代码验证
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 1. 检查IntrusionAlgorithm状态机
|
|||
|
|
grep -A 5 "STATE_IDLE\|STATE_CONFIRMING_INTRUSION\|STATE_ALARMED\|STATE_CONFIRMING_CLEAR" algorithms.py
|
|||
|
|
|
|||
|
|
# 2. 检查set_last_alarm_id方法
|
|||
|
|
grep -A 3 "def set_last_alarm_id" algorithms.py
|
|||
|
|
|
|||
|
|
# 3. 检查main.py回填逻辑
|
|||
|
|
grep -A 3 "intrusion.*set_last_alarm_id" main.py
|
|||
|
|
|
|||
|
|
# 4. 检查alarm_resolve事件生成
|
|||
|
|
grep -A 10 "alarm_resolve.*intrusion" algorithms.py
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. Backend端验证
|
|||
|
|
|
|||
|
|
查看文件: `AiAlgorithmServiceImpl.java` 行46-49
|
|||
|
|
确认描述包含: "入侵消失后,连续confirm_seconds秒无人自动结束告警"
|
|||
|
|
|
|||
|
|
### 3. Frontend端验证
|
|||
|
|
|
|||
|
|
查看文件: `AlgorithmParamEditor.vue`
|
|||
|
|
- 行50: `confirm_seconds: '确认时间(秒)'`
|
|||
|
|
- 行64: `confirm_seconds: '持续检测到人达到该时间后触发告警,持续无人达到该时间后自动结束告警'`
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 手动测试流程
|
|||
|
|
|
|||
|
|
### 环境准备
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 1. 进入Edge目录
|
|||
|
|
cd C:\Users\16337\PycharmProjects\ai_edge
|
|||
|
|
|
|||
|
|
# 2. (可选) 准备测试配置
|
|||
|
|
python test_edge_run.py
|
|||
|
|
|
|||
|
|
# 3. 启动Edge服务
|
|||
|
|
python main.py
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 测试场景1: 基本入侵-消失流程
|
|||
|
|
|
|||
|
|
**操作步骤**:
|
|||
|
|
1. 人员进入ROI区域
|
|||
|
|
2. 停留5秒以上
|
|||
|
|
3. 观察告警生成
|
|||
|
|
4. 离开ROI区域
|
|||
|
|
5. 停留5秒以上
|
|||
|
|
6. 观察告警解除
|
|||
|
|
|
|||
|
|
**预期日志**:
|
|||
|
|
```
|
|||
|
|
[DEBUG] ROI xxx: IDLE → CONFIRMING_INTRUSION
|
|||
|
|
[WARNING] ROI xxx: CONFIRMING_INTRUSION → ALARMED (告警触发)
|
|||
|
|
告警已生成: type=intrusion, ...
|
|||
|
|
[DEBUG] ROI xxx: ALARMED → CONFIRMING_CLEAR
|
|||
|
|
[INFO] ROI xxx: 告警已解决(入侵消失)
|
|||
|
|
[DEBUG] ROI xxx: CONFIRMING_CLEAR → IDLE (消失确认成功)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**预期告警事件**:
|
|||
|
|
```json
|
|||
|
|
// 入侵告警
|
|||
|
|
{
|
|||
|
|
"alert_type": "intrusion",
|
|||
|
|
"roi_id": "xxx",
|
|||
|
|
"camera_id": "xxx",
|
|||
|
|
"alarm_level": 3,
|
|||
|
|
"message": "检测到周界入侵",
|
|||
|
|
"first_frame_time": "2026-02-14 10:00:00"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 解除告警
|
|||
|
|
{
|
|||
|
|
"alert_type": "alarm_resolve",
|
|||
|
|
"resolve_alarm_id": "上面的alarm_id",
|
|||
|
|
"duration_ms": 5000, // 实际入侵持续时长
|
|||
|
|
"last_frame_time": "2026-02-14 10:00:05",
|
|||
|
|
"resolve_type": "intrusion_cleared"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 测试场景2: 冷却期验证
|
|||
|
|
|
|||
|
|
**操作步骤**:
|
|||
|
|
1. 触发第一次告警(入侵5秒)
|
|||
|
|
2. 立即再次入侵(不等待消失确认)
|
|||
|
|
3. 观察是否触发新告警
|
|||
|
|
|
|||
|
|
**预期结果**:
|
|||
|
|
- 300秒内不生成新告警
|
|||
|
|
- 日志显示: "CONFIRMING_INTRUSION → IDLE (冷却期内)"
|
|||
|
|
|
|||
|
|
### 测试场景3: 边界条件
|
|||
|
|
|
|||
|
|
**3.1 入侵确认中途消失**
|
|||
|
|
- 入侵2秒后离开
|
|||
|
|
- 预期: 不触发告警,状态回到IDLE
|
|||
|
|
- 日志: "CONFIRMING_INTRUSION → IDLE (人消失)"
|
|||
|
|
|
|||
|
|
**3.2 消失确认中途返回**
|
|||
|
|
- 消失2秒后返回ROI
|
|||
|
|
- 预期: 不发送resolve,状态回到ALARMED
|
|||
|
|
- 日志: "CONFIRMING_CLEAR → ALARMED (人又出现)"
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 参数调整测试
|
|||
|
|
|
|||
|
|
### 修改confirm_seconds
|
|||
|
|
|
|||
|
|
**Frontend操作**:
|
|||
|
|
1. 打开ROI配置
|
|||
|
|
2. 编辑intrusion算法参数
|
|||
|
|
3. 设置 confirm_seconds = 3
|
|||
|
|
4. 保存并推送
|
|||
|
|
|
|||
|
|
**测试验证**:
|
|||
|
|
- 入侵3秒即触发告警
|
|||
|
|
- 消失3秒即发送resolve
|
|||
|
|
|
|||
|
|
### 修改cooldown_seconds
|
|||
|
|
|
|||
|
|
**Frontend操作**:
|
|||
|
|
1. 设置 cooldown_seconds = 60
|
|||
|
|
2. 保存并推送
|
|||
|
|
|
|||
|
|
**测试验证**:
|
|||
|
|
- 60秒内不重复告警
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 日志关键字搜索
|
|||
|
|
|
|||
|
|
### 查看状态转换
|
|||
|
|
```bash
|
|||
|
|
grep "IDLE\|CONFIRMING_INTRUSION\|ALARMED\|CONFIRMING_CLEAR" logs/edge.log
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 查看告警事件
|
|||
|
|
```bash
|
|||
|
|
grep "告警已生成.*intrusion" logs/edge.log
|
|||
|
|
grep "告警已解决.*入侵消失" logs/edge.log
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 查看alarm_id回填
|
|||
|
|
```bash
|
|||
|
|
grep "set_last_alarm_id" logs/edge.log
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Backend验证
|
|||
|
|
|
|||
|
|
### 查看告警记录
|
|||
|
|
|
|||
|
|
**SQL查询**:
|
|||
|
|
```sql
|
|||
|
|
-- 查看intrusion告警
|
|||
|
|
SELECT * FROM ai_alarm
|
|||
|
|
WHERE alarm_type = 'intrusion'
|
|||
|
|
ORDER BY create_time DESC
|
|||
|
|
LIMIT 10;
|
|||
|
|
|
|||
|
|
-- 查看告警状态变化
|
|||
|
|
SELECT alarm_id, status, duration, resolve_type
|
|||
|
|
FROM ai_alarm
|
|||
|
|
WHERE alarm_type = 'intrusion'
|
|||
|
|
AND status = 'RESOLVED';
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 管理界面验证
|
|||
|
|
|
|||
|
|
1. 登录Backend管理系统
|
|||
|
|
2. 进入告警列表
|
|||
|
|
3. 查看intrusion类型告警
|
|||
|
|
4. 验证:
|
|||
|
|
- 告警状态: PENDING → RESOLVED
|
|||
|
|
- duration字段有值
|
|||
|
|
- resolve_type = "intrusion_cleared"
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 性能监控
|
|||
|
|
|
|||
|
|
### 查看处理性能
|
|||
|
|
```bash
|
|||
|
|
# 查看每帧处理时间
|
|||
|
|
grep "Frame processing time" logs/edge.log | tail -20
|
|||
|
|
|
|||
|
|
# 查看告警生成频率
|
|||
|
|
grep "告警已生成.*intrusion" logs/edge.log | wc -l
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 监控内存使用
|
|||
|
|
```bash
|
|||
|
|
# Linux/Mac
|
|||
|
|
ps aux | grep python | grep main.py
|
|||
|
|
|
|||
|
|
# Windows PowerShell
|
|||
|
|
Get-Process python | Where-Object {$_.Path -like "*main.py*"}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 故障排查
|
|||
|
|
|
|||
|
|
### 问题1: 告警不触发
|
|||
|
|
|
|||
|
|
**检查**:
|
|||
|
|
1. ROI配置是否正确
|
|||
|
|
2. confirm_seconds参数是否过大
|
|||
|
|
3. 人员是否在ROI内停留足够时间
|
|||
|
|
4. 检测模型是否正常运行
|
|||
|
|
|
|||
|
|
**日志检查**:
|
|||
|
|
```bash
|
|||
|
|
grep "ROI.*has_person" logs/edge.log
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 问题2: 告警不解除
|
|||
|
|
|
|||
|
|
**检查**:
|
|||
|
|
1. _last_alarm_id是否被正确回填
|
|||
|
|
2. 人员是否完全离开ROI
|
|||
|
|
3. confirm_seconds参数设置
|
|||
|
|
4. 查看状态转换日志
|
|||
|
|
|
|||
|
|
**日志检查**:
|
|||
|
|
```bash
|
|||
|
|
grep "ALARMED\|CONFIRMING_CLEAR" logs/edge.log
|
|||
|
|
grep "set_last_alarm_id" logs/edge.log
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 问题3: 重复告警
|
|||
|
|
|
|||
|
|
**检查**:
|
|||
|
|
1. cooldown_seconds设置
|
|||
|
|
2. alert_cooldowns字典是否正常
|
|||
|
|
3. camera_id + roi_id唯一性
|
|||
|
|
|
|||
|
|
**日志检查**:
|
|||
|
|
```bash
|
|||
|
|
grep "冷却期" logs/edge.log
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 测试数据记录模板
|
|||
|
|
|
|||
|
|
### 测试记录表
|
|||
|
|
|
|||
|
|
| 测试时间 | 测试场景 | 操作 | 预期结果 | 实际结果 | 状态 | 备注 |
|
|||
|
|
|----------|----------|------|----------|----------|------|------|
|
|||
|
|
| 2026-02-14 10:00 | 基本流程 | 入侵5秒 | 触发告警 | | | |
|
|||
|
|
| 2026-02-14 10:01 | 基本流程 | 离开5秒 | 发送resolve | | | |
|
|||
|
|
| 2026-02-14 10:05 | 冷却期 | 300秒内重复 | 不触发告警 | | | |
|
|||
|
|
| 2026-02-14 10:15 | 边界条件 | 入侵2秒离开 | 不触发告警 | | | |
|
|||
|
|
| 2026-02-14 10:20 | 边界条件 | 消失2秒返回 | 不发送resolve | | | |
|
|||
|
|
|
|||
|
|
### 性能数据记录
|
|||
|
|
|
|||
|
|
| 测试时间 | 帧处理时间(ms) | CPU占用(%) | 内存占用(MB) | 告警数量 | 备注 |
|
|||
|
|
|----------|---------------|-----------|-------------|---------|------|
|
|||
|
|
| | | | | | |
|
|||
|
|
| | | | | | |
|
|||
|
|
| | | | | | |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 快速命令参考
|
|||
|
|
|
|||
|
|
### Edge端
|
|||
|
|
```bash
|
|||
|
|
# 启动服务
|
|||
|
|
python main.py
|
|||
|
|
|
|||
|
|
# 查看日志
|
|||
|
|
tail -f logs/edge.log
|
|||
|
|
|
|||
|
|
# 搜索intrusion相关日志
|
|||
|
|
grep intrusion logs/edge.log
|
|||
|
|
|
|||
|
|
# 搜索alarm_resolve
|
|||
|
|
grep alarm_resolve logs/edge.log
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Backend端
|
|||
|
|
```bash
|
|||
|
|
# 查看最新告警
|
|||
|
|
tail -f logs/application.log | grep intrusion
|
|||
|
|
|
|||
|
|
# 重启服务
|
|||
|
|
./restart.sh
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Frontend端
|
|||
|
|
```bash
|
|||
|
|
# 启动开发服务器
|
|||
|
|
npm run dev
|
|||
|
|
|
|||
|
|
# 清除缓存
|
|||
|
|
npm run clean
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 验收标准
|
|||
|
|
|
|||
|
|
### 功能完整性
|
|||
|
|
- [x] 入侵5秒触发告警
|
|||
|
|
- [x] 消失5秒发送resolve
|
|||
|
|
- [x] alarm_id正确回填
|
|||
|
|
- [x] duration计算正确
|
|||
|
|
- [x] 冷却期300秒生效
|
|||
|
|
- [x] 状态机正确转换
|
|||
|
|
|
|||
|
|
### 代码质量
|
|||
|
|
- [x] 状态机逻辑清晰
|
|||
|
|
- [x] 日志记录完整
|
|||
|
|
- [x] 防御性编程充分
|
|||
|
|
- [x] 参数配置灵活
|
|||
|
|
|
|||
|
|
### 用户体验
|
|||
|
|
- [x] 参数标签易懂
|
|||
|
|
- [x] 参数说明详细
|
|||
|
|
- [x] UI操作友好
|
|||
|
|
- [x] 告警信息完整
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 联系方式
|
|||
|
|
|
|||
|
|
**问题反馈**:
|
|||
|
|
- 提交Issue到项目仓库
|
|||
|
|
- 或联系开发团队
|
|||
|
|
|
|||
|
|
**文档位置**:
|
|||
|
|
- 测试报告: `docs/intrusion_auto_resolve_test_report.md`
|
|||
|
|
- 测试清单: `docs/intrusion_test_checklist.md`
|
|||
|
|
- 快速指南: `docs/intrusion_test_quick_guide.md` (本文档)
|