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

10 KiB
Raw Blame History

Agent-2 (A2) 功能验证指南

验证环境准备

依赖注入配置

确保在 Program.csStartup.cs 中正确注册了以下服务:

// 状态机服务
services.AddSingleton<IRuntimeStateMachineService, AdvancedRuntimeStateMachineService>();

// 规则引擎服务
services.AddSingleton<IRuleEngineService, AdvancedRuleEngineService>();

// 人工干预服务
services.AddSingleton<IManualOverrideService, ManualOverrideService>();

// 报警系统服务
services.AddSingleton<IAlarmSystemService, AlarmSystemService>();

功能验证步骤

1. 规则引擎验证 (A2-T01)

数量检查验证

// 测试数据
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内)

位置检查验证

// 测试位置规则
var positionRule = new RuleCondition
{
    Type = ConditionType.PositionCheck,
    Parameter = "product",
    Operator = "all",
    ExpectedValue = "100,100,50" // 圆形范围:中心(100,100)半径50
};

// 预期结果:取决于检测对象的实际位置

顺序检查验证

// 测试顺序规则
var sequenceRule = new RuleCondition
{
    Type = ConditionType.SequenceCheck,
    Operator = "y_position",
    ExpectedValue = "part1>part2>part3"
};

// 预期结果取决于检测对象的Y坐标顺序

2. 状态机验证 (A2-T02)

状态转换验证

// 初始化状态机
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());

守卫条件验证

// 测试非法状态转换
var currentState = stateMachine.GetCurrentState();
var canPause = stateMachine.CanExecuteOperation(StateTrigger.Pause);

// 在Ready状态下应该不能暂停
Assert.AreEqual(RuntimeState.Ready, currentState);
Assert.IsFalse(canPause);

3. 人工干预验证 (A2-T03)

权限校验验证

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);

干预执行验证

// 创建干预请求
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)

报警触发验证

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);

报警生命周期验证

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);

验收标准检查

非法状态迁移被拦截并有可读错误

// 测试非法状态转换
var illegalResult = stateMachine.TriggerTransition(StateTrigger.Pause, "非法暂停");
Assert.IsFalse(illegalResult.IsSuccess);
Assert.IsTrue(illegalResult.Message.Contains("不允许"));

NG触发后能进入锁定态并支持人工处理

// 触发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());

报警事件可查询完整生命周期

// 查询报警生命周期
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);

性能验证

并发测试

// 并发触发多个报警
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));

内存使用验证

// 检查内存使用情况
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:详细的调试信息

日志内容检查

确保日志包含必要的上下文信息:

  • 操作类型和参数
  • 用户身份和权限
  • 状态转换前后对比
  • 错误详细信息和堆栈

故障恢复验证

状态机故障恢复

// 触发故障
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. 安全加固: