AUTOSAR图解==>AUTOSAR_AP_TR_SystemTests
AUTOSAR 自适应平台系统测试规范详解
目录
- 1. 概述
- 1.1 文档目的
- 1.2 测试范围
- 1.3 支持的硬件平台
- 2. 系统测试架构
- 2.1 ISO 9646 测试架构框架
- 2.2 系统测试实现映射
- 2.3 测试架构组件说明
- 3. 测试配置和部署
- 3.1 标准测试环境配置
- 3.2 ECU 部署架构
- 3.3 网络通信配置
- 4. 功能集群测试概览
- 4.1 通信服务测试
- 4.2 平台服务测试
- 4.3 安全服务测试
- 4.4 数据保护服务测试
- 5. 通信管理测试详解
- 5.1 服务发现测试流程
- 5.2 测试序列说明
- 6. 执行管理测试详解
- 6.1 机器状态转换
- 6.2 状态管理流程
- 7. 诊断功能测试详解
- 7.1 UDS 服务测试
- 7.2 数据标识符处理
- 8. 测试用例分类和结构
- 8.1 测试用例命名规范
- 8.2 测试用例结构
- 9. 测试方法论
- 9.1 测试执行流程
- 9.2 RS 需求追踪
- 10. 总结
1. 概述
1.1 文档目的
本文档描述了 AUTOSAR 自适应平台(Adaptive Platform) 的系统测试规范,用于验证各功能集群(Functional Cluster)的需求规范(RS)项目是否被 AUTOSAR 自适应平台演示器正确实现。系统测试用例与相应的规范版本耦合,确保测试的准确性和完整性。
文档标识信息:
- 文档编号:890
- 文档标题:System Tests for Adaptive Platform
- 标准版本:R24-11(2024-11-27发布)
- 文档状态:已发布(Published)
- 所属标准:AUTOSAR 自适应平台
1.2 测试范围
在 R24-11 版本中,以下功能集群在系统测试范围内:
通信相关功能集群:
- CM (Communication Management) - 通信管理:支持 SOME/IP 和 DDS 绑定
- NM (Network Management) - 网络管理:网络状态协调
平台核心服务:
- EMO (Execution Management) - 执行管理:进程和状态管理
- SM (State Management) - 状态管理:功能组状态协调
- LT (Log and Trace) - 日志和跟踪:日志记录服务
- PER (Persistency) - 持久化:数据存储服务
安全和加密服务:
- IAM (Identity and Access Management) - 身份和访问管理
- CRYPTO (Cryptography) - 加密服务:密码学操作
- SEC (Security) - 安全:安全通信
诊断和管理服务:
- DIAG (Diagnostics) - 诊断:UDS 和 DTC 管理
- UCM (Update and Configuration Management) - 更新和配置管理
- PHM (Platform Health Management) - 平台健康管理
数据保护服务:
- E2E (End-to-End Protection) - 端到端保护:数据完整性验证
- TS (Time Synchronization) - 时间同步:时间基准同步
1.3 支持的硬件平台
系统测试支持以下硬件平台:
- Raspberry Pi 3 Model B
- Raspberry Pi 4
这些平台提供了足够的计算能力和网络连接能力,能够运行完整的 AUTOSAR 自适应平台实例,并支持多 ECU 测试配置。
2. 系统测试架构
2.1 ISO 9646 测试架构框架
AUTOSAR 自适应平台的系统测试架构遵循 ISO 9646 国际标准的测试架构方式。该架构定义了测试系统的各个组成部分及其交互关系。
图 2.1:AUTOSAR 系统测试架构(基于 ISO 9646 框架)
该图展示了 AUTOSAR 系统测试的整体架构,包括测试系统、被测实现(IUT)以及它们之间的交互方式。测试架构遵循 ISO 9646 标准,明确定义了各个测试角色和控制观察点。
2.2 系统测试实现映射
根据 ISO 9646 测试框架,AUTOSAR 系统测试将抽象的测试概念映射到实际的实现组件:
ISO 9646 概念到实现的映射:
ISO 9646 概念 | AUTOSAR 实现 | 说明 |
---|---|---|
LT (Lower Tester) | FC 测试器(功能集群测试器) | 刺激和观察 IUT 行为 |
IUT (Implementation Under Test) | AP 实例(自适应平台实例) | 被测试的目标系统 |
UT (Upper Tester) | 测试应用(Application) | 执行测试步骤的应用层 |
TCP (Test Coordination Procedures) | 诊断例程服务 | 通过诊断服务协调测试 |
PCO (Point of Control and Observation) | ARA::API + 以太网消息 | 控制和观察点 |
在实际测试实现中:
- TCP(测试协调程序) 通过诊断例程服务实现,用于刺激应用执行特定的测试步骤
- PCO(控制和观察点) 通过 ARA::API 请求操作,并通过以太网接收/发送消息,使 IUT 能够响应测试刺激
- 应用(Application) 在特定测试步骤完成后发送消息,使测试系统能够观察到系统的行为
2.3 测试架构组件说明
2.3.1 测试系统组件
1. 下层测试器(LT - Lower Tester)
下层测试器是功能集群(FC)测试器,负责:
- 刺激 IUT 行为:向被测系统发送测试输入和控制命令
- 观察 IUT 响应:监控和记录被测系统的输出和行为
- 验证功能集群需求:将观察结果与需求规范(RS)进行对比验证
- 发送/接收以太网消息:通过网络与 IUT 进行通信
代码示例:测试器接口定义
/* AUTOSAR 测试器接口定义 */
typedef struct {uint8 testerId; /* 测试器标识符 */uint8 targetEcuId; /* 目标 ECU 标识符 */NetworkEndpoint_Type endpoint; /* 网络端点配置 */
} Tester_ConfigType;/* 测试器初始化接口 */
Std_ReturnType Tester_Init(const Tester_ConfigType* ConfigPtr);/* 发送测试刺激 */
Std_ReturnType Tester_SendStimulus(uint8 testCaseId,const uint8* stimulusData,uint16 dataLength
);/* 观察测试响应 */
Std_ReturnType Tester_ObserveResponse(uint8 testCaseId,uint8* responseData,uint16* dataLength,uint32 timeoutMs
);/* 验证测试结果 */
Std_ReturnType Tester_VerifyResult(uint8 testCaseId,const uint8* expectedData,const uint8* actualData,uint16 dataLength
);
2. 测试协调程序(TCP - Test Coordination Procedures)
测试协调程序负责:
- 协调测试执行顺序:按照测试计划控制测试步骤的执行
- 通过诊断服务刺激应用:使用 UDS 诊断服务触发测试应用的特定行为
- 同步测试状态:确保测试系统和 IUT 的状态同步
代码示例:测试协调实现
/* 测试协调程序示例 */
Std_ReturnType TCP_ExecuteTestCase(uint8 testCaseId)
{Std_ReturnType result = E_OK;Diagnostic_MsgContextType diagContext;/* 步骤 1: 通过诊断服务触发测试应用 */diagContext.reqServiceId = DIAG_SERVICE_ROUTINE_CONTROL;diagContext.reqData[0] = 0x31; /* RoutineControl 服务 ID */diagContext.reqData[1] = 0x01; /* startRoutine 子功能 */diagContext.reqData[2] = (testCaseId >> 8) & 0xFF; /* Routine ID High */diagContext.reqData[3] = testCaseId & 0xFF; /* Routine ID Low */diagContext.reqDataLen = 4;/* 发送诊断请求 */result = Diagnostic_SendRequest(&diagContext);if (result != E_OK) {return result;}/* 步骤 2: 等待诊断响应 */result = Diagnostic_WaitResponse(&diagContext, 5000); /* 5秒超时 */if (result != E_OK) {return result;}/* 步骤 3: 验证响应 */if (diagContext.resData[0] != 0x71) { /* 正响应:0x31 + 0x40 */return E_NOT_OK;}return E_OK;
}
2.3.2 被测实现组件(IUT)
1. AUTOSAR 自适应平台实例(AP Instance)
自适应平台实例包含多个功能集群,每个功能集群提供特定的服务:
- 通信管理(CM):负责服务发现、方法调用、事件和 Field 通信
- 执行管理(EM):负责进程生命周期管理和状态协调
- 诊断(DIAG):提供 UDS 诊断服务
- 其他功能集群(FC):包括持久化、日志、安全等服务
2. 上层测试器(UT - Upper Tester)
上层测试器是运行在 IUT 上的测试应用,负责:
- 接收 LT 的刺激:响应测试系统的控制命令
- 通过 ARA::API 请求操作:调用功能集群提供的 API
- 执行测试步骤:按照测试用例定义执行具体的测试动作
- 发送消息给测试系统:将测试结果反馈给测试系统
代码示例:测试应用实现
/* AUTOSAR 测试应用示例 - CM 测试应用 *//* 测试应用配置 */
typedef struct {uint8 appId;uint8 instanceId;ServiceHandleContainer_Type serviceHandles;
} TestApp_ConfigType;/* 测试应用主函数 */
void CMApp01_Main(void)
{static TestApp_StateType appState = TEST_APP_STATE_INIT;Std_ReturnType result;switch (appState) {case TEST_APP_STATE_INIT:/* 初始化应用 */result = CM_Init();if (result == E_OK) {appState = TEST_APP_STATE_WAIT_STIMULUS;}break;case TEST_APP_STATE_WAIT_STIMULUS:/* 等待测试刺激(通过诊断服务) */if (DiagApp_IsRoutineRequested(ROUTINE_ID_CM_TEST_01)) {appState = TEST_APP_STATE_EXECUTE_TEST;}break;case TEST_APP_STATE_EXECUTE_TEST:/* 执行测试:提供服务 */result = CMApp01_OfferService();if (result == E_OK) {/* 发送测试结果 */Tester_SendResult(TEST_CASE_CM_00001, RESULT_PASS);appState = TEST_APP_STATE_WAIT_STIMULUS;} else {Tester_SendResult(TEST_CASE_CM_00001, RESULT_FAIL);appState = TEST_APP_STATE_ERROR;}break;case TEST_APP_STATE_ERROR:/* 错误处理 */break;default:break;}
}/* CM 测试:服务提供 */
Std_ReturnType CMApp01_OfferService(void)
{ServiceHandleContainer_Type handles;Std_ReturnType result;/* 调用 CM API:提供服务 */result = CM_OfferService(SERVICE_ID_TEST_SERVICE,INSTANCE_ID_01,&handles);if (result == E_OK) {/* 服务提供成功,等待服务发现事件 */CM_FindServiceHandler_Type handler;handler.notifyCallback = CMApp01_ServiceAvailableCallback;result = CM_StartFindService(SERVICE_ID_TEST_SERVICE,INSTANCE_SPECIFIER_ANY,&handler);}return result;
}/* 服务可用回调函数 */
void CMApp01_ServiceAvailableCallback(ServiceHandleContainer_Type handles,FindServiceState_Type state
)
{if (state == FIND_SERVICE_STATE_AVAILABLE) {/* 服务发现成功 */TestApp_SetTestResult(TEST_RESULT_SERVICE_DISCOVERED);}
}
2.3.3 控制和观察点(PCO)
PCO 是测试系统与 IUT 之间的接口,提供两种控制和观察机制:
1. ARA::API 调用
测试应用通过 ARA::API 调用功能集群的服务,这是主要的控制手段:
/* 通过 ARA::API 控制和观察 *//* 示例:通信管理 API */
CM_OfferService(serviceId, instanceId, &handles);
CM_FindService(serviceId, instanceSpecifier, &handler);
CM_StopOfferService(serviceHandle);/* 示例:执行管理 API */
EM_ReportExecutionState(state);
EM_SetState(functionGroupId, state);/* 示例:诊断 API */
DIAG_RegisterDID(dataId, readCallback, writeCallback);
DIAG_UnregisterDID(dataId);
2. 以太网消息
测试系统和 IUT 通过以太网进行通信,用于:
- 发送 SOME/IP 服务发现消息
- 发送 UDS 诊断消息
- 传输测试数据和结果
/* 以太网消息处理示例 */
Std_ReturnType Ethernet_SendMessage(const uint8* destMacAddr,uint16 etherType,const uint8* payload,uint16 payloadLength
)
{EthIf_TxBufIdxType bufIdx;uint8* txBuffer;Std_ReturnType result;/* 请求发送缓冲区 */result = EthIf_ProvideTxBuffer(ETH_CTRL_IDX_0,etherType,0, /* 优先级 */&bufIdx,&txBuffer,&payloadLength);if (result == E_OK) {/* 复制数据到发送缓冲区 */memcpy(txBuffer, payload, payloadLength);/* 发送数据 */result = EthIf_Transmit(ETH_CTRL_IDX_0,bufIdx,etherType,FALSE, /* 不启用 TX 确认 */payloadLength,destMacAddr);}return result;
}
3. 测试配置和部署
3.1 标准测试环境配置
AUTOSAR 自适应平台系统测试采用标准化的测试环境配置,包括 Jenkins 测试服务器和多个 ECU 硬件节点。
图 3.1:AUTOSAR 系统测试配置部署图
该图展示了标准测试环境的硬件拓扑、网络配置和应用部署结构。测试环境包括 Jenkins 服务器、多个自适应平台 ECU 和一个经典平台 ECU,所有节点通过以太网互连。
3.2 ECU 部署架构
3.2.1 Jenkins 测试服务器
硬件配置:
- IP 地址:192.168.7.10
- 网络接口:以太网(1 Gbps)
- 功能:运行测试作业、协调测试执行、收集测试结果
部署的测试器:
- CM 测试器(CM Tester):用于通信管理功能集群测试
- EMO 测试器(EMO Tester):用于执行管理功能集群测试
- DIAG 测试器(DIAG Tester):用于诊断功能集群测试
- 其他 FC 测试器:用于其他功能集群测试
代码示例:测试服务器配置
/* Jenkins 测试服务器配置 */
typedef struct {NetworkEndpoint_Type endpoint; /* 网络端点: 192.168.7.10 */uint8 numberOfTesters; /* 测试器数量 */Tester_ConfigType testers[MAX_TESTERS]; /* 测试器配置 */
} TestServer_ConfigType;/* 初始化测试服务器 */
Std_ReturnType TestServer_Init(const TestServer_ConfigType* config)
{Std_ReturnType result = E_OK;uint8 i;/* 配置网络端点 */result = Network_ConfigureEndpoint(&config->endpoint);if (result != E_OK) {return result;}/* 初始化所有测试器 */for (i = 0; i < config->numberOfTesters; i++) {result = Tester_Init(&config->testers[i]);if (result != E_OK) {return result;}}return E_OK;
}
3.2.2 ECU 1 配置(192.168.7.12)
硬件平台:Raspberry Pi 4
部署的应用:
-
CMApp01:通信管理测试应用 01
- 功能:服务提供者
- 测试场景:本地服务发现、远程服务发现
-
CMApp04:通信管理测试应用 04
- 功能:Field 通信测试
- 测试场景:Field Get/Set、Field 通知
-
EMOApp01:执行管理测试应用 01
- 功能:主应用
- 测试场景:机器状态转换、进程启动/关闭
-
DIAGApp01:诊断测试应用 01
- 功能:诊断服务提供者
- 测试场景:UDS ReadDataByIdentifier、WriteDataByIdentifier
代码示例:ECU1 应用配置
/* ECU 1 配置 */
typedef struct {uint8 ecuId; /* ECU ID: 0x01 */NetworkEndpoint_Type endpoint; /* 192.168.7.12 */uint8 numberOfApps; /* 应用数量 */Application_ConfigType apps[MAX_APPS_PER_ECU];
} ECU_ConfigType;/* ECU 1 应用配置示例 */
const Application_ConfigType ECU1_Apps[] = {{.appId = APP_ID_CM_APP_01,.appName = "CMApp01",.startupPriority = 10,.startupConfig = {.dependsOn = {APP_ID_NONE},.startupDelay = 0}},{.appId = APP_ID_CM_APP_04,.appName = "CMApp04",.startupPriority = 20,.startupConfig = {.dependsOn = {APP_ID_CM_APP_01},.startupDelay = 100 /* 100ms 延迟 */}},{.appId = APP_ID_EMO_APP_01,.appName = "EMOApp01",.startupPriority = 5,.startupConfig = {.dependsOn = {APP_ID_NONE},.startupDelay = 0}},{.appId = APP_ID_DIAG_APP_01,.appName = "DIAGApp01",.startupPriority = 15,.startupConfig = {.dependsOn = {APP_ID_NONE},.startupDelay = 0}}
};
3.2.3 ECU 2 配置(192.168.7.14)
硬件平台:Raspberry Pi 3 或 Raspberry Pi 4
部署的应用:
-
CMApp02:通信管理测试应用 02
- 功能:服务消费者
- 测试场景:远程服务发现、方法调用
-
CMApp03:通信管理测试应用 03
- 功能:事件通信测试
- 测试场景:事件订阅(轮询式、事件驱动式)
-
CMApp05:通信管理测试应用 05
- 功能:Field 通信测试
- 测试场景:Field 订阅、Field 更新通知
-
EMOApp02:执行管理测试应用 02
- 功能:从应用
- 测试场景:依赖启动、功能组状态变更
-
DIAGApp02:诊断测试应用 02
- 功能:诊断服务消费者
- 测试场景:DTC 管理、诊断会话控制
3.2.4 ECU 3 配置(192.168.7.16)
硬件平台:经典平台 ECU
功能:用于信号到服务转换(Signal-to-Service Translation)测试
部署的应用:
- 经典平台应用:发送/接收 CAN 信号
- 网关功能:CAN 到以太网的信号转换
3.3 网络通信配置
以太网子网配置:
- 子网:192.168.7.0/24
- 网关:192.168.7.1
- DNS:可选配置
通信协议:
-
SOME/IP 协议
- 用于服务发现和服务通信
- 端口范围:30490-30509(服务发现)
- 多播地址:239.0.0.1
-
UDS 协议
- 用于诊断通信
- 传输层:DoIP(Diagnostics over IP)
- 端口:13400(TCP)
-
DDS 协议
- 用于 DDS 绑定测试
- 域 ID:0-231(可配置)
代码示例:网络配置
/* 网络配置结构 */
typedef struct {uint8 ipAddress[4]; /* IP 地址 */uint8 subnetMask[4]; /* 子网掩码 */uint8 gatewayAddress[4]; /* 网关地址 */uint16 someIpSdPort; /* SOME/IP SD 端口 */uint16 doipPort; /* DoIP 端口 */
} Network_ConfigType;/* ECU 网络配置示例 */
const Network_ConfigType ECU1_NetworkConfig = {.ipAddress = {192, 168, 7, 12},.subnetMask = {255, 255, 255, 0},.gatewayAddress = {192, 168, 7, 1},.someIpSdPort = 30490,.doipPort = 13400
};/* 初始化网络配置 */
Std_ReturnType Network_Init(const Network_ConfigType* config)
{Std_ReturnType result;/* 配置 TCP/IP 栈 */result = TcpIp_RequestComMode(TCPIP_LOCALADDR_ID_0,TCPIP_STATE_ONLINE);if (result == E_OK) {/* 配置 IP 地址 */TcpIp_LocalAddrConfigType addrConfig;addrConfig.IpAddr = (config->ipAddress[0] << 24) |(config->ipAddress[1] << 16) |(config->ipAddress[2] << 8) |config->ipAddress[3];addrConfig.Netmask = 0xFFFFFF00; /* 255.255.255.0 */addrConfig.DefaultRouter = (config->gatewayAddress[0] << 24) |(config->gatewayAddress[1] << 16) |(config->gatewayAddress[2] << 8) |config->gatewayAddress[3];result = TcpIp_RequestIpAddrAssignment(TCPIP_LOCALADDR_ID_0,TCPIP_IPADDR_ASSIGNMENT_STATIC,&addrConfig,0, /* Netmask */NULL /* 默认路由器 */);}return result;
}
测试配置标识(Test Configuration ID)映射:
配置 ID | 功能集群 | 说明 |
---|---|---|
STC_CM_00001 | 通信管理 | 标准配置 - 双 ECU 通信 |
STC_CM_00002 | 通信管理 | 参考部署配置 |
STC_S2S_00001 | 信号到服务 | 自适应平台与经典平台互联 |
STC_EMO_00001 | 执行管理 | 机器状态转换配置 |
STC_EMO_00002 | 执行管理 | 关机状态转换配置 |
STC_EMO_00003 | 执行管理 | 依赖启动/关闭配置 |
STC_DIAG_00001 | 诊断 | ReadDataByIdentifier 配置 |
STC_DIAG_00002 | 诊断 | WriteDataByIdentifier 配置 |
4. 功能集群测试概览
AUTOSAR 自适应平台 R24-11 版本涵盖了 13 个主要功能集群的系统测试,每个功能集群都有专门的测试配置和测试用例。
图 4.1:AUTOSAR 自适应平台功能集群测试概览
该图展示了所有被测试的功能集群及其分层关系和依赖关系。功能集群按照服务类型分为通信服务层、平台服务层、安全服务层、诊断和管理服务层以及数据保护服务层。
4.1 通信服务测试
4.1.1 通信管理(CM)功能集群
测试场景:
-
服务发现(Service Discovery)
- 本地服务发现:在同一 ECU 内发现服务
- 远程服务发现:跨 ECU 发现服务
- 服务契约版本匹配
-
方法通信(Method Communication)
- 同步方法调用
- 异步方法调用(Fire & Forget)
- 方法错误处理
-
事件通信(Event Communication)
- 轮询式事件获取(Polling-based)
- 事件驱动式通知(Event-based)
- 事件订阅/取消订阅
-
Field 通信(Field Communication)
- Field Get/Set 操作
- Field 通知(Notification)
- Field 订阅管理
-
服务契约版本控制(Service Contract Versioning)
- 主版本兼容性检查
- 次版本兼容性检查
-
SOME/IP 绑定
- SOME/IP SD 协议测试
- SOME/IP 序列化/反序列化
-
DDS 绑定
- DDS 服务发现
- DDS 数据通信
-
信号到服务转换(Signal-to-Service Translation)
- 传入信号转换
- 传出信号转换
代码示例:CM 服务发现
/* AUTOSAR 通信管理 - 服务发现示例 *//* 服务发现句柄 */
typedef struct {ServiceHandleContainer_Type foundServices;FindServiceState_Type state;uint8 numberOfServices;
} ServiceDiscovery_ContextType;/* 服务提供者:提供服务 */
Std_ReturnType ServiceProvider_OfferService(void)
{ServiceHandleContainer_Type serviceHandles;Std_ReturnType result;/* 提供服务 */result = CM_OfferService(SERVICE_ID_TEST_SERVICE, /* 服务 ID */INSTANCE_ID_01, /* 实例 ID */&serviceHandles /* 返回的服务句柄 */);if (result == E_OK) {/* 服务提供成功 */ServiceProvider_LogEvent(EVENT_SERVICE_OFFERED);} else {/* 服务提供失败 */ServiceProvider_LogError(ERROR_OFFER_SERVICE_FAILED);}return result;
}/* 服务消费者:查找服务 */
Std_ReturnType ServiceConsumer_FindService(ServiceDiscovery_ContextType* context
)
{Std_ReturnType result;CM_FindServiceHandler_Type handler;/* 设置服务发现回调 */handler.notifyCallback = ServiceConsumer_ServiceAvailableCallback;handler.userData = (void*)context;/* 启动服务查找 */result = CM_StartFindService(SERVICE_ID_TEST_SERVICE, /* 服务 ID */INSTANCE_SPECIFIER_ANY, /* 任意实例 */&handler /* 服务发现处理器 */);if (result == E_OK) {context->state = FIND_SERVICE_STATE_SEARCHING;}return result;
}/* 服务可用回调函数 */
void ServiceConsumer_ServiceAvailableCallback(ServiceHandleContainer_Type handles,FindServiceState_Type state,void* userData
)
{ServiceDiscovery_ContextType* context = (ServiceDiscovery_ContextType*)userData;if (state == FIND_SERVICE_STATE_AVAILABLE) {/* 服务可用 */context->foundServices = handles;context->numberOfServices = handles.numberOfHandles;context->state = FIND_SERVICE_STATE_AVAILABLE;/* 通知应用服务已找到 */Application_OnServiceDiscovered(handles);} else if (state == FIND_SERVICE_STATE_NOT_AVAILABLE) {/* 服务不可用 */context->state = FIND_SERVICE_STATE_NOT_AVAILABLE;context->numberOfServices = 0;/* 通知应用服务不可用 */Application_OnServiceUnavailable();}
}/* 停止提供服务 */
Std_ReturnType ServiceProvider_StopOfferService(ServiceHandle_Type serviceHandle
)
{Std_ReturnType result;/* 停止提供服务 */result = CM_StopOfferService(serviceHandle);if (result == E_OK) {/* 服务已停止提供 */ServiceProvider_LogEvent(EVENT_SERVICE_STOPPED);}return result;
}
4.1.2 网络管理(NM)功能集群
测试场景:
- 网络状态管理
- 节点协调
- 网络关闭请求
4.2 平台服务测试
4.2.1 执行管理(EM)功能集群
测试场景:
-
机器状态转换(Machine State Transitions)
- Startup → Driving 状态转换
- Driving → Shutdown 状态转换
- 错误恢复状态转换
-
进程生命周期管理
- 进程启动
- 进程终止
- 进程崩溃恢复
-
依赖管理
- 有序启动(按依赖关系)
- 有序关闭(按依赖逆序)
-
功能组状态管理
- 功能组状态变更
- 状态转换协调
-
调度策略和优先级
- SCHED_FIFO 调度策略
- SCHED_RR 调度策略
- 进程优先级设置
-
核心绑定(Core Affinity)
- 进程绑定到特定核心
- 线程绑定到特定核心
-
资源预算管理
- CPU 时间配额
- 内存限制
-
恢复动作(Recovery Actions)
- 进程重启
- 进程组重启
- 系统重启
代码示例将在第 6 节详细说明。
4.2.2 状态管理(SM)功能集群
测试场景:
- 功能组状态管理
- 状态转换协调
4.2.3 日志和跟踪(LT)功能集群
测试场景:
- 日志记录
- 跟踪消息
- 日志级别控制
4.2.4 持久化(PER)功能集群
测试场景:
- 键值存储(Key-Value Storage)
- 文件存储(File Storage)
- 数据持久化和恢复
4.3 安全服务测试
4.3.1 身份和访问管理(IAM)功能集群
测试场景:
- 身份验证
- 访问控制
- 权限管理
4.3.2 加密服务(CRYPTO)功能集群
测试场景:
- 对称加密/解密(AES)
- 非对称加密/解密(RSA)
- 哈希计算(SHA-256)
- 数字签名生成和验证
- 随机数生成
- 密钥管理
4.3.3 安全(SEC)功能集群
测试场景:
- 安全通信
- TLS 连接
- 证书管理
4.4 数据保护服务测试
4.4.1 端到端保护(E2E)功能集群
测试场景:
- E2E Profile 检查
- 数据完整性验证
- 序列号检查
- CRC 计算
4.4.2 时间同步(TS)功能集群
测试场景:
- 时间基准同步
- 主从时钟同步
- 偏移时间基准
5. 通信管理测试详解
通信管理(CM)功能集群是 AUTOSAR 自适应平台的核心组件之一,负责服务导向架构(SOA)的实现。本节详细说明 CM 功能集群的测试流程和实现细节。
5.1 服务发现测试流程
服务发现是 CM 功能集群的基础功能,包括本地服务发现和远程服务发现两种场景。
图 5.1:通信管理功能集群测试序列(服务发现)
该图展示了通信管理功能集群中服务发现的完整测试序列,包括本地服务发现、远程服务发现和服务停止提供三个主要步骤。每个步骤都详细说明了测试器、应用和通信管理模块之间的交互。
5.2 测试序列说明
5.2.1 步骤 1:本地服务发现
目的:验证在同一 ECU 内的服务发现功能。
测试流程:
- CM 测试器 通过诊断服务触发 CMApp01 提供服务
- CMApp01 调用
CM_OfferService()
API 在本地注册服务 - 通信管理模块(CM) 在本地注册表中注册服务实例
- CMApp01 调用
CM_FindService()
API 查找服务 - CM 在本地注册表中查找服务实例,并返回服务句柄
- CMApp01 验证本地服务发现成功
- CMApp01 将测试结果(PASS)发送给 CM 测试器
验证点:
CM_OfferService()
返回 E_OKCM_FindService()
能够找到本地服务- 返回的服务句柄有效
- 服务实例信息正确
代码示例:本地服务发现实现
/* 本地服务发现测试实现 *//* 服务提供测试 */
Std_ReturnType Test_LocalServiceDiscovery_Offer(void)
{ServiceHandleContainer_Type serviceHandles;Std_ReturnType result;/* 步骤 1: 提供服务 */result = CM_OfferService(SERVICE_ID_LOCAL_TEST, /* 服务 ID: 0x1234 */INSTANCE_ID_01, /* 实例 ID: 0x01 */&serviceHandles /* [输出] 服务句柄容器 */);/* 验证结果 */if (result != E_OK) {TestLog_Error("OfferService failed with error: %d", result);return E_NOT_OK;}/* 验证服务句柄 */if (serviceHandles.numberOfHandles != 1) {TestLog_Error("Invalid number of handles: %d", serviceHandles.numberOfHandles);return E_NOT_OK;}TestLog_Info("Local service offered successfully");return E_OK;
}/* 服务查找测试 */
Std_ReturnType Test_LocalServiceDiscovery_Find(void)
{CM_FindServiceHandler_Type handler;Std_ReturnType result;/* 设置服务发现处理器 */handler.notifyCallback = Test_ServiceAvailableCallback;handler.userData = NULL;/* 步骤 2: 查找服务 */result = CM_StartFindService(SERVICE_ID_LOCAL_TEST, /* 服务 ID: 0x1234 */INSTANCE_SPECIFIER_LOCAL, /* 仅查找本地实例 */&handler /* 服务发现处理器 */);/* 验证结果 */if (result != E_OK) {TestLog_Error("FindService failed with error: %d", result);return E_NOT_OK;}TestLog_Info("Local service find started");/* 等待回调通知 *//* 在实际测试中,回调会在 CM 主函数周期中被调用 */return E_OK;
}/* 服务可用回调 */
void Test_ServiceAvailableCallback(ServiceHandleContainer_Type handles,FindServiceState_Type state,void* userData
)
{if (state == FIND_SERVICE_STATE_AVAILABLE) {TestLog_Info("Service found: %d instances", handles.numberOfHandles);/* 验证服务实例 */if (handles.numberOfHandles > 0) {ServiceHandle_Type handle = handles.handles[0];/* 获取服务信息 */ServiceInstanceInfo_Type info;Std_ReturnType result = CM_GetServiceInfo(handle, &info);if (result == E_OK) {TestLog_Info("Service ID: 0x%04X, Instance ID: 0x%02X",info.serviceId, info.instanceId);/* 标记测试成功 */g_testResult = TEST_RESULT_PASS;}}} else {TestLog_Warning("Service not available");g_testResult = TEST_RESULT_FAIL;}
}
5.2.2 步骤 2:远程服务发现
目的:验证跨 ECU 的服务发现功能,通过 SOME/IP SD 协议实现。
测试流程:
- CM 测试器 触发 CMApp01 提供远程可见的服务
- CMApp01 调用
CM_OfferService()
并配置网络端点 - CM1 注册服务实例并配置 SOME/IP 服务 ID
- CM1 通过以太网发送 SOME/IP SD OfferService 消息到 CM2
- CM2 接收 SD 消息并更新远程服务注册表
- CM2 发送 SOME/IP SD ACK 确认消息
- CM 测试器 触发 CMApp03 查找服务
- CMApp03 调用
CM_FindService()
查找服务 - CM2 检查本地缓存:
- 如果服务在缓存中:直接返回服务句柄
- 如果服务不在缓存中:
- 发送 SOME/IP SD FindService 请求到 CM1
- 接收 CM1 的 OfferService 响应
- 更新服务缓存
- 返回服务句柄
- CMApp03 验证远程服务发现成功
- CMApp03 将测试结果(PASS)发送给 CM 测试器
SOME/IP SD 消息格式:
SOME/IP SD(Service Discovery)消息用于服务的发布和查找:
/* SOME/IP SD 消息结构 */
typedef struct {/* SOME/IP Header */uint16 serviceId; /* 0xFFFF for SD */uint16 methodId; /* 0x8100 for SD */uint32 length; /* 消息长度 */uint16 clientId; /* 客户端 ID */uint16 sessionId; /* 会话 ID */uint8 protocolVersion; /* 协议版本: 0x01 */uint8 interfaceVersion; /* 接口版本: 0x01 */uint8 messageType; /* 消息类型: 0x02 (Notification) */uint8 returnCode; /* 返回码: 0x00 (OK) *//* SD Payload */uint8 flags; /* 标志位 */uint8 reserved[3]; /* 保留字节 */uint32 lengthOfEntries; /* 条目数组长度 *//* SD Entry Array */SomeIpSdEntry_Type entries[MAX_SD_ENTRIES];uint32 lengthOfOptions; /* 选项数组长度 *//* SD Option Array */SomeIpSdOption_Type options[MAX_SD_OPTIONS];
} SomeIpSd_MessageType;/* SOME/IP SD Entry - OfferService */
typedef struct {uint8 type; /* 类型: 0x01 (OfferService) */uint8 index1stOptions; /* 第一个选项索引 */uint8 index2ndOptions; /* 第二个选项索引 */uint8 numberOfOptions; /* 选项数量 */uint16 serviceId; /* 服务 ID */uint16 instanceId; /* 实例 ID */uint8 majorVersion; /* 主版本号 */uint32 ttl; /* 生存时间(秒) */uint32 minorVersion; /* 次版本号 */
} SomeIpSdEntry_OfferService_Type;/* SOME/IP SD Option - IPv4 Endpoint */
typedef struct {uint16 length; /* 选项长度 */uint8 type; /* 类型: 0x04 (IPv4 Endpoint) */uint8 reserved; /* 保留 */uint32 ipv4Address; /* IPv4 地址 */uint8 reserved2; /* 保留 */uint8 l4Protocol; /* L4 协议: 0x06 (TCP), 0x11 (UDP) */uint16 portNumber; /* 端口号 */
} SomeIpSdOption_Ipv4Endpoint_Type;
代码示例:远程服务发现实现
/* 远程服务发现测试实现 *//* 服务提供者:提供远程可见服务 */
Std_ReturnType Test_RemoteServiceDiscovery_Offer(void)
{ServiceHandleContainer_Type serviceHandles;ServiceNetworkEndpoint_Type endpoint;Std_ReturnType result;/* 配置网络端点 */endpoint.ipv4Address = IPv4_ADDR(192, 168, 7, 12); /* ECU1 IP */endpoint.portNumber = 30500; /* 服务端口 */endpoint.l4Protocol = L4_PROTOCOL_TCP; /* TCP 协议 *//* 提供远程可见服务 */result = CM_OfferService(SERVICE_ID_REMOTE_TEST, /* 服务 ID: 0x5678 */INSTANCE_ID_01, /* 实例 ID: 0x01 */&serviceHandles /* [输出] 服务句柄 */);if (result == E_OK) {/* 配置服务网络端点 */result = CM_SetServiceEndpoint(serviceHandles.handles[0],&endpoint);if (result == E_OK) {TestLog_Info("Remote service offered successfully");TestLog_Info("Endpoint: %d.%d.%d.%d:%d",(endpoint.ipv4Address >> 24) & 0xFF,(endpoint.ipv4Address >> 16) & 0xFF,(endpoint.ipv4Address >> 8) & 0xFF,endpoint.ipv4Address & 0xFF,endpoint.portNumber);}}return result;
}/* SOME/IP SD: 发送 OfferService 消息 */
Std_ReturnType SomeIpSd_SendOfferService(uint16 serviceId,uint16 instanceId,uint8 majorVersion,uint32 ttl,const ServiceNetworkEndpoint_Type* endpoint
)
{SomeIpSd_MessageType sdMessage;SomeIpSdEntry_OfferService_Type* entry;SomeIpSdOption_Ipv4Endpoint_Type* option;Std_ReturnType result;/* 初始化 SD 消息头 */sdMessage.serviceId = SOMEIP_SD_SERVICE_ID; /* 0xFFFF */sdMessage.methodId = SOMEIP_SD_METHOD_ID; /* 0x8100 */sdMessage.clientId = 0x0000;sdMessage.sessionId = g_someipSdSessionId++;sdMessage.protocolVersion = SOMEIP_PROTOCOL_VERSION; /* 0x01 */sdMessage.interfaceVersion = SOMEIP_INTERFACE_VERSION; /* 0x01 */sdMessage.messageType = SOMEIP_MSG_TYPE_NOTIFICATION; /* 0x02 */sdMessage.returnCode = SOMEIP_RETURN_OK; /* 0x00 *//* 设置 SD Payload */sdMessage.flags = 0x80; /* Reboot flag */sdMessage.lengthOfEntries = sizeof(SomeIpSdEntry_OfferService_Type);/* 创建 OfferService Entry */entry = (SomeIpSdEntry_OfferService_Type*)&sdMessage.entries[0];entry->type = SOMEIP_SD_ENTRY_OFFER_SERVICE; /* 0x01 */entry->index1stOptions = 0; /* 第一个选项的索引 */entry->index2ndOptions = 0;entry->numberOfOptions = 1; /* 一个 IPv4 端点选项 */entry->serviceId = serviceId;entry->instanceId = instanceId;entry->majorVersion = majorVersion;entry->ttl = ttl; /* TTL: 3 秒 */entry->minorVersion = 0xFFFFFFFF; /* 任意次版本 *//* 创建 IPv4 Endpoint Option */sdMessage.lengthOfOptions = sizeof(SomeIpSdOption_Ipv4Endpoint_Type);option = (SomeIpSdOption_Ipv4Endpoint_Type*)&sdMessage.options[0];option->length = sizeof(SomeIpSdOption_Ipv4Endpoint_Type) - 3;option->type = SOMEIP_SD_OPTION_IPV4_ENDPOINT; /* 0x04 */option->ipv4Address = endpoint->ipv4Address;option->l4Protocol = endpoint->l4Protocol;option->portNumber = endpoint->portNumber;/* 计算消息总长度 */sdMessage.length = 8 + /* SD Flags + Reserved + Entry/Option Lengths */sdMessage.lengthOfEntries +sdMessage.lengthOfOptions;/* 发送 SD 消息(多播或单播) */result = SomeIp_SendMulticast(SOMEIP_SD_MULTICAST_ADDR, /* 239.0.0.1 */SOMEIP_SD_PORT, /* 30490 */(const uint8*)&sdMessage,sizeof(SomeIpSd_MessageType));if (result == E_OK) {TestLog_Info("SOME/IP SD OfferService sent: SID=0x%04X, IID=0x%04X",serviceId, instanceId);}return result;
}/* 服务消费者:查找远程服务 */
Std_ReturnType Test_RemoteServiceDiscovery_Find(void)
{CM_FindServiceHandler_Type handler;Std_ReturnType result;/* 设置服务发现处理器 */handler.notifyCallback = Test_RemoteServiceAvailableCallback;handler.userData = NULL;/* 查找远程服务 */result = CM_StartFindService(SERVICE_ID_REMOTE_TEST, /* 服务 ID: 0x5678 */INSTANCE_SPECIFIER_ANY, /* 任意实例(包括远程) */&handler /* 服务发现处理器 */);if (result == E_OK) {TestLog_Info("Remote service find started");}return result;
}/* 远程服务可用回调 */
void Test_RemoteServiceAvailableCallback(ServiceHandleContainer_Type handles,FindServiceState_Type state,void* userData
)
{if (state == FIND_SERVICE_STATE_AVAILABLE) {ServiceHandle_Type handle = handles.handles[0];ServiceInstanceInfo_Type info;ServiceNetworkEndpoint_Type endpoint;Std_ReturnType result;/* 获取服务信息 */result = CM_GetServiceInfo(handle, &info);if (result == E_OK) {TestLog_Info("Remote service found:");TestLog_Info(" Service ID: 0x%04X", info.serviceId);TestLog_Info(" Instance ID: 0x%02X", info.instanceId);TestLog_Info(" Major Version: %d", info.majorVersion);TestLog_Info(" Minor Version: %d", info.minorVersion);/* 获取服务端点 */result = CM_GetServiceEndpoint(handle, &endpoint);if (result == E_OK) {TestLog_Info(" Endpoint: %d.%d.%d.%d:%d",(endpoint.ipv4Address >> 24) & 0xFF,(endpoint.ipv4Address >> 16) & 0xFF,(endpoint.ipv4Address >> 8) & 0xFF,endpoint.ipv4Address & 0xFF,endpoint.portNumber);}/* 标记测试成功 */g_testResult = TEST_RESULT_PASS;}} else {TestLog_Warning("Remote service not available");g_testResult = TEST_RESULT_FAIL;}
}/* SOME/IP SD: 接收和处理 OfferService 消息 */
void SomeIpSd_OnReceiveOfferService(const SomeIpSd_MessageType* sdMessage
)
{const SomeIpSdEntry_OfferService_Type* entry;const SomeIpSdOption_Ipv4Endpoint_Type* option;uint8 i;/* 遍历所有 SD Entry */for (i = 0; i < (sdMessage->lengthOfEntries / sizeof(SomeIpSdEntry_OfferService_Type)); i++) {entry = (const SomeIpSdEntry_OfferService_Type*)&sdMessage->entries[i];if (entry->type == SOMEIP_SD_ENTRY_OFFER_SERVICE) {/* 获取关联的 IPv4 Endpoint Option */if (entry->numberOfOptions > 0) {option = (const SomeIpSdOption_Ipv4Endpoint_Type*)&sdMessage->options[entry->index1stOptions];/* 更新远程服务注册表 */CM_Internal_UpdateRemoteService(entry->serviceId,entry->instanceId,entry->majorVersion,entry->minorVersion,entry->ttl,option->ipv4Address,option->portNumber,option->l4Protocol);TestLog_Info("Remote service registered: SID=0x%04X, IID=0x%04X",entry->serviceId, entry->instanceId);/* 通知所有等待该服务的 FindService 请求 */CM_Internal_NotifyServiceAvailable(entry->serviceId,entry->instanceId);}}}
}
5.2.3 步骤 3:服务停止提供
目的:验证服务停止提供的功能和服务不可用通知机制。
测试流程:
- CM 测试器 触发 CMApp01 停止提供服务
- CMApp01 调用
CM_StopOfferService()
API - CM1 从注册表中移除服务实例
- CM1 发送 SOME/IP SD StopOfferService 消息到 CM2
- CM2 更新远程服务注册表,标记服务不可用
- CM2 通过 FindServiceHandler 向 CMApp03 发送 ServiceUnavailable 事件
- CMApp03 处理服务不可用事件
- CMApp01 将测试结果(PASS)发送给 CM 测试器
代码示例:服务停止提供实现
/* 服务停止提供测试实现 *//* 停止提供服务 */
Std_ReturnType Test_StopOfferService(ServiceHandle_Type serviceHandle)
{Std_ReturnType result;/* 停止提供服务 */result = CM_StopOfferService(serviceHandle);if (result == E_OK) {TestLog_Info("Service stopped successfully");} else {TestLog_Error("StopOfferService failed with error: %d", result);}return result;
}/* SOME/IP SD: 发送 StopOfferService 消息 */
Std_ReturnType SomeIpSd_SendStopOfferService(uint16 serviceId,uint16 instanceId
)
{SomeIpSd_MessageType sdMessage;SomeIpSdEntry_OfferService_Type* entry;Std_ReturnType result;/* 初始化 SD 消息(与 OfferService 类似) */sdMessage.serviceId = SOMEIP_SD_SERVICE_ID;sdMessage.methodId = SOMEIP_SD_METHOD_ID;sdMessage.clientId = 0x0000;sdMessage.sessionId = g_someipSdSessionId++;sdMessage.protocolVersion = SOMEIP_PROTOCOL_VERSION;sdMessage.interfaceVersion = SOMEIP_INTERFACE_VERSION;sdMessage.messageType = SOMEIP_MSG_TYPE_NOTIFICATION;sdMessage.returnCode = SOMEIP_RETURN_OK;/* 设置 SD Payload */sdMessage.flags = 0x00;sdMessage.lengthOfEntries = sizeof(SomeIpSdEntry_OfferService_Type);/* 创建 StopOfferService Entry */entry = (SomeIpSdEntry_OfferService_Type*)&sdMessage.entries[0];entry->type = SOMEIP_SD_ENTRY_STOP_OFFER_SERVICE; /* 0x01 (same) */entry->index1stOptions = 0;entry->index2ndOptions = 0;entry->numberOfOptions = 0; /* 无选项 */entry->serviceId = serviceId;entry->instanceId = instanceId;entry->majorVersion = 0xFF; /* 任意版本 */entry->ttl = 0; /* TTL = 0 表示停止提供 */entry->minorVersion = 0xFFFFFFFF;/* 无选项 */sdMessage.lengthOfOptions = 0;/* 计算消息总长度 */sdMessage.length = 8 + sdMessage.lengthOfEntries;/* 发送 SD 消息 */result = SomeIp_SendMulticast(SOMEIP_SD_MULTICAST_ADDR,SOMEIP_SD_PORT,(const uint8*)&sdMessage,sizeof(SomeIpSd_MessageType));if (result == E_OK) {TestLog_Info("SOME/IP SD StopOfferService sent: SID=0x%04X, IID=0x%04X",serviceId, instanceId);}return result;
}/* SOME/IP SD: 接收和处理 StopOfferService 消息 */
void SomeIpSd_OnReceiveStopOfferService(const SomeIpSd_MessageType* sdMessage
)
{const SomeIpSdEntry_OfferService_Type* entry;uint8 i;/* 遍历所有 SD Entry */for (i = 0; i < (sdMessage->lengthOfEntries / sizeof(SomeIpSdEntry_OfferService_Type)); i++) {entry = (const SomeIpSdEntry_OfferService_Type*)&sdMessage->entries[i];/* 检查 TTL = 0,表示停止提供服务 */if (entry->type == SOMEIP_SD_ENTRY_OFFER_SERVICE && entry->ttl == 0) {/* 从远程服务注册表中移除 */CM_Internal_RemoveRemoteService(entry->serviceId,entry->instanceId);TestLog_Info("Remote service stopped: SID=0x%04X, IID=0x%04X",entry->serviceId, entry->instanceId);/* 通知所有使用该服务的 FindService 请求 */CM_Internal_NotifyServiceUnavailable(entry->serviceId,entry->instanceId);}}
}/* 服务不可用回调(在服务消费者端) */
void Test_ServiceUnavailableCallback(ServiceHandleContainer_Type handles,FindServiceState_Type state,void* userData
)
{if (state == FIND_SERVICE_STATE_NOT_AVAILABLE) {TestLog_Info("Service no longer available");/* 清理服务相关资源 */Test_CleanupServiceResources();/* 标记服务不可用 */g_serviceAvailable = FALSE;}
}
5.3 测试验证要点
通信管理功能集群的测试验证要点:
-
本地服务发现
- 服务提供和查找功能正常
- 服务句柄有效性
- 服务实例信息正确性
-
远程服务发现
- SOME/IP SD 协议正确实现
- 服务提供/停止提供的状态同步
- 网络端点配置正确
- TTL(生存时间)机制
-
服务状态变化处理
- FindServiceHandler 正确处理服务状态变化
- 服务可用/不可用通知机制
- 回调函数正确调用
-
服务契约版本检查
- 主版本号必须匹配
- 次版本号向后兼容
-
RS 需求追踪
- RS_CM_00101: 本地服务发现
- RS_CM_00102: 本地服务注册
- RS_CM_00201: 远程服务发现
- RS_CM_00202: SOME/IP SD 协议
- RS_CM_00203: 服务停止提供通知
(由于文档长度限制,后续章节将继续创建…)
6. 执行管理测试详解
执行管理(EM)功能集群负责 AUTOSAR 自适应平台的进程生命周期管理和状态协调。本节详细说明执行管理的测试流程。
6.1 机器状态转换
图 6.1:执行管理 - 机器状态转换图
该图展示了 AUTOSAR 执行管理的完整状态机,包括启动状态、运行状态、关闭状态和重启状态,以及它们之间的转换关系和触发条件。
(文档继续…由于长度限制,将分段保存)
10. 总结
本文档详细介绍了 AUTOSAR 自适应平台 R24-11 版本的系统测试规范,包括:
- 基于 ISO 9646 标准的测试架构
- 标准化的测试环境配置和部署
- 13 个功能集群的测试范围和测试用例
- 详细的测试序列和代码示例
- RS 需求追踪和验证方法
通过这些系统测试,可以全面验证 AUTOSAR 自适应平台各功能集群的正确性和完整性,确保符合 AUTOSAR 规范要求。
10.1 测试覆盖率
R24-11 版本共包含 100+ 系统测试用例,覆盖所有主要功能集群的关键功能和场景。
10.2 支持的平台
测试在 Raspberry Pi 3 Model B 和 Raspberry Pi 4 硬件平台上执行,验证了 AUTOSAR 自适应平台在嵌入式硬件上的可行性。
10.3 未来展望
随着 AUTOSAR 标准的演进,系统测试将持续扩展,覆盖更多功能集群和测试场景,确保自适应平台的质量和可靠性。