Files
OrpaonVision/A2-VERIFICATION.md
2026-04-12 22:34:46 +08:00

382 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Agent-2 (A2) 功能验证指南
## 验证环境准备
### 依赖注入配置
确保在 `Program.cs``Startup.cs` 中正确注册了以下服务:
```csharp
// 状态机服务
services.AddSingleton<IRuntimeStateMachineService, AdvancedRuntimeStateMachineService>();
// 规则引擎服务
services.AddSingleton<IRuleEngineService, AdvancedRuleEngineService>();
// 人工干预服务
services.AddSingleton<IManualOverrideService, ManualOverrideService>();
// 报警系统服务
services.AddSingleton<IAlarmSystemService, AlarmSystemService>();
```
## 功能验证步骤
### 1. 规则引擎验证 (A2-T01)
#### 数量检查验证
```csharp
// 测试数据
var inference = new InferenceResultDto
{
Detections = new List<InferenceDetectionDto>
{
new() { ClassName = "product", Confidence = 0.9 },
new() { ClassName = "product", Confidence = 0.8 },
new() { ClassName = "defect", Confidence = 0.7 }
}
};
// 测试数量规则
var quantityRule = new RuleCondition
{
Type = ConditionType.QuantityCheck,
Operator = "range",
ExpectedValue = "2-4"
};
// 预期结果true (实际数量为3在范围2-4内)
```
#### 位置检查验证
```csharp
// 测试位置规则
var positionRule = new RuleCondition
{
Type = ConditionType.PositionCheck,
Parameter = "product",
Operator = "all",
ExpectedValue = "100,100,50" // 圆形范围:中心(100,100)半径50
};
// 预期结果:取决于检测对象的实际位置
```
#### 顺序检查验证
```csharp
// 测试顺序规则
var sequenceRule = new RuleCondition
{
Type = ConditionType.SequenceCheck,
Operator = "y_position",
ExpectedValue = "part1>part2>part3"
};
// 预期结果取决于检测对象的Y坐标顺序
```
### 2. 状态机验证 (A2-T02)
#### 状态转换验证
```csharp
// 初始化状态机
var stateMachine = serviceProvider.GetService<IRuntimeStateMachineService>();
var initResult = stateMachine.TriggerInitialize();
Assert.IsTrue(initResult.IsSuccess);
Assert.AreEqual(RuntimeState.Initializing, stateMachine.GetCurrentState());
// 完成初始化
var initializedResult = stateMachine.TriggerInitialized();
Assert.IsTrue(initializedResult.IsSuccess);
Assert.AreEqual(RuntimeState.Idle, stateMachine.GetCurrentState());
// 启动系统
var startResult = stateMachine.TriggerStart();
Assert.IsTrue(startResult.IsSuccess);
Assert.AreEqual(RuntimeState.Ready, stateMachine.GetCurrentState());
// 产品进入
var productResult = stateMachine.TriggerProductEntered();
Assert.IsTrue(productResult.IsSuccess);
Assert.AreEqual(RuntimeState.LayerIdentifying, stateMachine.GetCurrentState());
```
#### 守卫条件验证
```csharp
// 测试非法状态转换
var currentState = stateMachine.GetCurrentState();
var canPause = stateMachine.CanExecuteOperation(StateTrigger.Pause);
// 在Ready状态下应该不能暂停
Assert.AreEqual(RuntimeState.Ready, currentState);
Assert.IsFalse(canPause);
```
### 3. 人工干预验证 (A2-T03)
#### 权限校验验证
```csharp
var overrideService = serviceProvider.GetService<IManualOverrideService>();
var sessionId = Guid.NewGuid();
var operatorId = "operator1";
// 测试权限获取
var permissionResult = await overrideService.GetOverridePermissionAsync(sessionId, operatorId);
Assert.IsTrue(permissionResult.IsSuccess);
Assert.IsTrue(permissionResult.Data.HasPermission);
```
#### 干预执行验证
```csharp
// 创建干预请求
var overrideRequest = new ManualOverrideRequest
{
RequestId = Guid.NewGuid(),
SessionId = sessionId,
OperatorId = operatorId,
OperatorName = "测试操作员",
OverrideType = OverrideType.Release,
Reason = "测试放行操作"
};
// 执行干预
var overrideResult = await overrideService.ExecuteManualOverrideAsync(overrideRequest);
Assert.IsTrue(overrideResult.IsSuccess);
Assert.AreEqual(OverrideStatus.Overridden, overrideResult.Data.OverrideStatus);
```
### 4. 报警系统验证 (A2-T04)
#### 报警触发验证
```csharp
var alarmService = serviceProvider.GetService<IAlarmSystemService>();
// 创建报警请求
var alarmRequest = new AlarmRequest
{
RequestId = Guid.NewGuid(),
AlarmType = AlarmType.RuleViolation,
AlarmLevel = AlarmLevel.High,
Title = "测试报警",
Description = "这是一个测试报警",
SessionId = sessionId,
RelatedLayer = 1,
ExtendedProperties = new Dictionary<string, object>
{
["rule_number"] = "RULE-001"
}
};
// 触发报警
var alarmResult = await alarmService.TriggerAlarmAsync(alarmRequest);
Assert.IsTrue(alarmResult.IsSuccess);
Assert.AreEqual(AlarmStatus.Active, alarmResult.Data.AlarmStatus);
```
#### 报警生命周期验证
```csharp
var alarmId = alarmResult.Data.AlarmId;
// 确认报警
var confirmResult = await alarmService.ConfirmAlarmAsync(new AlarmConfirmRequest
{
AlarmId = alarmId,
ConfirmUser = "测试用户",
ConfirmReason = "确认测试报警"
});
Assert.IsTrue(confirmResult.IsSuccess);
Assert.AreEqual(AlarmStatus.Confirmed, confirmResult.Data.AlarmStatus);
// 清除报警
var clearResult = await alarmService.ClearAlarmAsync(new AlarmClearRequest
{
AlarmId = alarmId,
ClearUser = "测试用户",
ClearReason = "清除测试报警"
});
Assert.IsTrue(clearResult.IsSuccess);
Assert.AreEqual(AlarmStatus.Cleared, clearResult.Data.AlarmStatus);
// 恢复报警
var recoveryResult = await alarmService.SetAlarmRecoveryStatusAsync(new AlarmRecoveryRequest
{
AlarmId = alarmId,
Status = RecoveryStatus.ManualRecovered,
RecoveryUser = "测试用户",
RecoveryReason = "手动恢复测试报警"
});
Assert.IsTrue(recoveryResult.IsSuccess);
Assert.AreEqual(AlarmStatus.Recovered, recoveryResult.Data.AlarmStatus);
```
## 验收标准检查
### ✅ 非法状态迁移被拦截并有可读错误
```csharp
// 测试非法状态转换
var illegalResult = stateMachine.TriggerTransition(StateTrigger.Pause, "非法暂停");
Assert.IsFalse(illegalResult.IsSuccess);
Assert.IsTrue(illegalResult.Message.Contains("不允许"));
```
### ✅ NG触发后能进入锁定态并支持人工处理
```csharp
// 触发NG
var ngResult = stateMachine.TriggerNgDetected("测试NG");
Assert.IsTrue(ngResult.IsSuccess);
Assert.AreEqual(RuntimeState.NgLocked, stateMachine.GetCurrentState());
// 人工干预
var interventionResult = stateMachine.TriggerManualIntervention("人工干预");
Assert.IsTrue(interventionResult.IsSuccess);
Assert.AreEqual(RuntimeState.ManualIntervening, stateMachine.GetCurrentState());
// 完成干预
var completeResult = stateMachine.TriggerTransition(StateTrigger.ManualInterventionCompleted, "干预完成");
Assert.IsTrue(completeResult.IsSuccess);
Assert.AreEqual(RuntimeState.Running, stateMachine.GetCurrentState());
```
### ✅ 报警事件可查询完整生命周期
```csharp
// 查询报警生命周期
var lifecycleResult = await alarmService.GetAlarmLifecycleAsync(alarmId);
Assert.IsTrue(lifecycleResult.IsSuccess);
Assert.IsNotNull(lifecycleResult.Data);
Assert.AreEqual(sessionId, lifecycleResult.Data.SessionId);
Assert.AreEqual(1, lifecycleResult.Data.Layer);
Assert.AreEqual("RULE-001", lifecycleResult.Data.RuleNumber);
// 查询生命周期历史
var historyResult = await alarmService.GetAlarmLifecycleHistoryAsync(sessionId);
Assert.IsTrue(historyResult.IsSuccess);
Assert.IsTrue(historyResult.Data.Count > 0);
```
## 性能验证
### 并发测试
```csharp
// 并发触发多个报警
var tasks = new List<Task<Result<AlarmResult>>>();
for (int i = 0; i < 100; i++)
{
var request = new AlarmRequest
{
RequestId = Guid.NewGuid(),
AlarmType = AlarmType.RuleViolation,
AlarmLevel = AlarmLevel.Medium,
Title = $"并发测试报警 {i}",
SessionId = Guid.NewGuid()
};
tasks.Add(alarmService.TriggerAlarmAsync(request));
}
var results = await Task.WhenAll(tasks);
Assert.IsTrue(results.All(r => r.IsSuccess));
```
### 内存使用验证
```csharp
// 检查内存使用情况
var beforeMemory = GC.GetTotalMemory(true);
// 执行大量操作
for (int i = 0; i < 1000; i++)
{
var request = new AlarmRequest { /* ... */ };
await alarmService.TriggerAlarmAsync(request);
}
var afterMemory = GC.GetTotalMemory(true);
var memoryIncrease = afterMemory - beforeMemory;
// 内存增长应该在合理范围内
Assert.IsTrue(memoryIncrease < 50 * 1024 * 1024); // 小于50MB
```
## 日志验证
### 日志级别检查
确保所有重要操作都有相应的日志记录:
- **Information**:正常操作流程
- **Warning**:异常情况但系统可继续运行
- **Error**:错误情况需要关注
- **Debug**:详细的调试信息
### 日志内容检查
确保日志包含必要的上下文信息:
- 操作类型和参数
- 用户身份和权限
- 状态转换前后对比
- 错误详细信息和堆栈
## 故障恢复验证
### 状态机故障恢复
```csharp
// 触发故障
var faultResult = stateMachine.TriggerFault("测试故障");
Assert.IsTrue(faultResult.IsSuccess);
Assert.AreEqual(RuntimeState.Faulted, stateMachine.GetCurrentState());
// 故障恢复
var recoveryResult = stateMachine.TriggerFaultRecovered("故障恢复");
Assert.IsTrue(recoveryResult.IsSuccess);
Assert.AreEqual(RuntimeState.Running, stateMachine.GetCurrentState());
```
### 服务重启恢复
验证服务重启后能正确恢复状态:
- 保存关键状态到持久化存储
- 服务启动时正确加载历史状态
- 未完成的操作能够正确处理
## 集成验证
### 服务间协作验证
验证各服务之间的协作是否正常:
- 规则引擎与状态机的集成
- 人工干预与状态机的集成
- 报警系统与规则引擎的集成
- 报警系统与状态机的集成
### 端到端流程验证
验证完整的业务流程:
1. 系统启动 → 初始化 → 就绪
2. 产品进入 → 层识别 → 规则检查
3. 发现问题 → 触发报警 → 人工干预
4. 问题解决 → 状态恢复 → 继续运行
## 验证报告模板
```
# Agent-2 功能验证报告
## 验证环境
- .NET版本
- 操作系统:
- 测试时间:
## 验证结果
- A2-T01 规则引擎:✅ 通过 / ❌ 失败
- A2-T02 状态机:✅ 通过 / ❌ 失败
- A2-T03 人工干预:✅ 通过 / ❌ 失败
- A2-T04 报警系统:✅ 通过 / ❌ 失败
## 发现的问题
1. 问题描述:
- 严重程度:
- 影响范围:
- 解决方案:
## 性能指标
- 平均响应时间:
- 内存使用:
- 并发处理能力:
## 改进建议
1. 功能改进:
2. 性能优化:
3. 安全加固:
```