CAPL编程系列_04
1_ 测试模块TestModule:基本使用
- 1)在Simulation Setup 中创建并配置 Test Module节点
- 2)编写测试脚本
- 【1】测试用例函数(testcase):实现具体测试逻辑
- 【2】主测试函数(Main Test):控制测试执行流程
- 3)执行测试用例并查看测试报告
Test Module 提供了 TFS(Test Feature Set):大量的测试相关的函数
1.在测试用例函数执行到某个步骤,想判定测试用例执行成功或者失败时:
(1) testStepPass("步骤序号","描述信息”,….)
(2) testStepFail("步骤序号","描述信息",...)
如果在testcase函数中调用了上述函数,那么结果被记录到测试报告中,并作为判定依据
//定义一个被测试的函数:计算2个数的和
long add(long a,long b)
{return a+b;
}//测试用例1 : 测试add函数计算两个整数相加的结果是否正确
testcase TestAdd01()
{long res;res = add(3,5);if(res == 8){//测试用例执行通过testStepPass ("1.1","add(3,5)测试用例执行成功,返回结果为 %d",res);}else{//测试用例执行失败testStepFail ("1.2","add(3,5)测试用例执行失败,返回结果为 %d",res);}
}//在主测试函数中按执行顺序,调用要执行的测试用例
//只有有了MainTest,才能执行测试用例,我们应该在MainTest中调用测试用例函数
void MainTest()
{TestAdd01();
}
2_测试模块TestModule:Test Setup
- 1) 在 Test Setup 中创建并配置 Test Environment 节点
- 2) 在Test Environment 节点下创建 Test Module 节点
- 3) 配置 Test Module 节点,编写测试脚本
- 4) 执行测试用例并查看测试报告
3_ 测试模块TestModule:用例组织和描述
Test Module的架构
- 一个测试模块中可以包含多个测试用例
- 一个测试用例中可以包含多个测试步骤
Test Module { 包含多条 Test Case 1 2 3 ......}
Test Case 1 { 包含多条 Test Step 1 2 3 ......}
· Test Module -> Test Case -> Test Step
- 可以使用测试组对测试用例进行分类
- 测试组可以嵌套
Test Module
1 Test Group
Test Case
Test CaseTest Case
1.1 Test Group
Test Case
Test Case
1.2 Test GroupTest Case
2 Test Group
Test Case
Test Case
//测试用例是从MainTest中启动的 void MainTest() {//指定测试模块的标题和描述testModuleTitle("测试模块的示例标题");testModuleDescription("测试模块的示例描述信息");//组 开始到结束testGroupBegin("测试分组1","测试分组1的详细描述");TestCase01();TestCase02();testGroupEnd();testGroupBegin("测试分组2","测试分组2的详细描述");TestCase03();TestCase04();TestCase05();testGroupEnd();testcase TestCase01() {testCaseTitle("TC01","测试用例1的示例标题");testCaseDescription("测试用例1的示例描述"); }testcase TestCase02() {testCaseTitle("TC02","测试用例2的示例标题");testCaseDescription("测试用例2的示例描述"); }testcase TestCase03() {testCaseTitle("TC03","测试用例3的示例标题");testCaseDescription("测试用例3的示例描述"); }testcase TestCase04() {testCaseTitle("TC04","测试用例4的示例标题");testCaseDescription("测试用例4的示例描述"); }testcase TestCase05() {testCaseTitle("TC05","测试用例5的示例标题");testCaseDescription("测试用例5的示例描述"); }}
4_ 测试模块TestModule:ECU自动化测试案例
1) 案例分析: HU(车机)请求控制雨刮器
需求描述
1、BCM(车身控制模块) 控制着雨刮器的工作,可以控制雨刮器: 关闭 / 低速刮/ 高速刮 / 自动。(1) BCM (车身控制模块)会周期性地发出CAN 报文,反馈雨刮器当前的工作状态。
(2) 报文 ID 为 0x387,其中【前雨刮工作状态】的信号名为:BCM_FrontWiperstatus
2、通过车机给 BCM(车身控制模块) 发送 CAN 报文 (其中包含请求控制雨刮的信号) 来实现雨刮器的控制请求。
(1) 车机 ( HU ) 会根据用户的操作 ( 按键 / 语音 ) 来发送相应的 CAN 报文。
(2) 报文 ID 为 0x55D,其中【请求控制前雨刮】的信号名为: HU_FronWiperRg
测试验证
BCM (车身控制模块)是否能根据车机指令相应地控制雨刮器工作,并发送对应雨刮器工作状态的 CAN 报文。
2) 案例设计:HU(车机)请求控制雨刮器
需求定义
1、BCM 控制着雨刮器的工作,周期性地发出 CAN 报文,反馈雨刮器当前的工作状态。(1) 报文 ID 为 0x387,其中【前雨刮工作状态】的信号名为: BCM_FrontWiperStatus
(2) 信号值: 0x0 ( off )、0x1 ( low )、0x2 ( high )、0x3 ( error )
2、车机给 BCM 发送 CAN 报文来实现雨刮器的控制请求。
(1) 报文 ID 为 0x55D,其中【请求控制前雨刮】的信号名为: HU_FronWiperRq(2) 信号值: 0x0 ( inactive )、0x1 ( low )、0x2 ( high )、0x3 ( auto )
所属模块 | 用例编号 | 用例标题 | 前置条件 | 执行步骤 | 预期 | 执行结果 |
BCM-雨刮器控制 | TC001 | HU给BCM发送雨刮器低速刮请求 | 1、BCM 上电 2、BCM控制的雨刮器当前是关闭状态【0x387中信号BCM_FrontWiperStatus为0】 | 1、模拟HU给BCM发送请求低速刮的报文【0x55D中信号HU_FronWiperRg值为1】 | 1、BCM发出的0x387中信号BCM_FrontWiperStatus值由0变更为1 | pass |
BCM-雨刮器控制 | TC002 | HU给BCM发送雨刮器高速刮请求 | 1、BCM 上电 2、BCM控制的雨刮器当前是关闭状态【0x387中信号BCM_FrontWiperStatus为0】 | 1、模拟HU给BCM发送请求高速刮的报文【0x55D中信号HU_FronWiperRg值为2】 | 1、BCM发出的0x387中信号BCM_FrontWiperStatus值由0变更为2 | pass |
3)案例脚本编写:HU(车机)控制雨刮器
variables
{message HU_0x55d msg55d;
}void MainTest()
{TestFrontWiperLow();
}testcase TestFrontWiperLow()
{TestCaseTitle("TC001","HU给BCM发送低速刮请求");TestCaseDescription("模拟HU给BCN发送低速刮请求的信号报文,验证BCM是否控制前雨刮低速刮,并返回相应状态的信号");/*1.先记录请求前BCM发出的前雨刮工作的状态信号是否是已关闭(0)2.先创建HU发出请求低速刮的信号(1)的报文,并发送3.等待2秒钟(2000毫秒)(让BCM完成对前雨刮的实际控制)4.验证BCM当前发出的前雨刮工作状态的信号是否为低速刮(1)*/testStep("Step 1","HU请求发出前,BCM_FrontWiperStatus信号的值: %d", (int)$BCM_FrontWiperStatus);msg55d.HU_FrontWiperRq = 1; //设置为请求低速刮output(msg55d);testStep("Step2","模拟HU发出请求低速刮(信号为1)的报文");testWaitForTimeout(2000); //让测试程序等待指定的时长testStep("Step3","测试程序休眠了2秒");if((int)$BCM_FrontWiperStatus == 1){testStepPass("Step 4 Pass","用例执行通过:前雨刮当前工作状态为低速刮(1)");}else{testStepFail("Step 4 Fail","用例执行失败:前雨刮当前工作状态的信号值为:%d", (int)$BCM_FrontWiperStatus);}
}
4)案例脚本编写:信号判断函数
1. 在超时时长内判断指定的信号是否符合预期【要等待】
① TestWaitForSignalMatch ( 信号, 比较值, 超时时长 )② TestWaitForSignallnRange ( 信号, 下限值, 上限值, 超时时长 )
③ TestWaitForSignalOutsideRange ( 信号, 下限值, 上限值, 超时时长 )
①②③ 只检查,不记录到测试结果
2. 检查 / 测试信号的当前值是否符合预期【不等待】
1) CheckSignalMatch ( 信号, 比较值 )2) CheckSignallnRange ( 信号, 下限值, 上限值, 超时时长 )
1) 2) 只检查,不记录到测试结果
3) TestValidateSignalMatch ( 步骤描述, 信号, 比较值 )
4) TestValidateSignallnRange ( 步骤描述, 信号, 下限值, 上限值, 超时时长 )5) TestValidatesignalOutsideRange ( 步骤描述, 信号, 下限值, 上限值, 超时时长 )
3) 4) 5) 检查并记录到测试结果
5)ECU报文发送周期的自动化测试【1】
1. 需求:
BCM 周期性地发出 ID 为 0x387 的 CAN 报文,周期为 100ms ( ± 8ms )
2. 思路:
步骤 ① 开启针对指定报文的发送周期的检查
步骤 ② 添加检查条件 ( 将检查结果记录到测试报告,并将违反规则的结果判定为 fail )
步骤 ③ 等待一段时间
步骤 ④ 移除检查条件
3. 相关函数:
ChkStart_MsgAbsCycleTimeViolation ( 报文,最小间隔,最大间隔 )
TestAddCondition( 检查 ID )
TestRemoveCondition ( 检查 ID )
void MainTest()
{TestMessageCycle ();
}//测试0x387的报文发送周期是否满足规定:100ms(±8ms)
testcase TestMessageCycle()
{dword checkId; //返回一个检测的ID的整数// 开始检查报文发送的周期(返回该检查的ID )checkId = chkStart_MsgAbsCycleTimeViolation(BCM_0x387,92,108);// 添加检查条件(开始向测试报告中记录,并且会判定违规的结果为Fail)TestAddCondition(checkID);// 让程序休眠3s(让检查进行3s)TestWaitForTimeout(3000);// 移除检查条件(不再测试报告中记录)testRemoveCondition(checkId);
}
5)ECU报文发送周期的自动化测试【2】
1. 需求:
BCM 周期性地发出 ID 为 0x387 的 CAN 报文,周期为 100ms ( ± 8ms )
2. 思路:
步骤 ① 开启针对指定报文的发送周期的检查
步骤 ② 等待一段时间
步骤 ③ 结束检查
步骤 ④ 查询各项统计结果
3. 相关函数:
ChkStart_MsgAbsCycleTimeViolation ( 报文,最小间隔,最大间隔 )
ChkControl_Stop ( 检查 ID )
ChkQuery_NumEvents ( 检查 ID )ChkQuery_StatNumProbes ( 检查 ID )
ChkQuery_StatProbeIntervalMin ( 检查 ID )
ChkQuery_StatProbeIntervalMax ( 检查 ID )
ChkQuery_StatProbeIntervalAvg ( 检查 ID )
void MainTest()
{TestMessageCycle ();
}//测试0x387的报文发送周期是否满足规定:100ms(±8ms)
testcase TestMessageCycle()
{dword checkId; //返回一个检测的ID的整数long numEvents;long numProbes;float intervalMin;float intervalMax;float intervalAvg;// 开始检查报文发送的周期(返回该检查的ID )checkId = chkStart_MsgAbsCycleTimeViolation(BCM_0x387,92,108);// 让程序休眠3s(让检查进行3s)TestWaitForTimeout(3000);// 停止检查ChkControl_(checkId);// 获取违反规则的事件次数(本例中:报文发送间隔违规: < 92 || > 108 )numEvents = ChkQuery_NumEvents(checkId);// 获取统计过程中的收到的报文次数numProbes = ChkQuery_StatNumProbes (checkId);// 获取报文之间的最小间隔intervalMin = ChkQuery_StatProbeIntervalMin(checkID);// 获取报文之间的最大间隔intervalMax = ChkQuery_StatProbeIntervalMax(checkID);// 获取报文之间的平均间隔intervalAvg = ChkQuery_StatProbeIntervalAvg(checkID);write("numEvents : %d, numProbes : %d, intervalMin : %.1f, intervalMax : %.1f, intervalAvg : %.1f,numEvents ,numProbes ,intervalMin ,intervalMax ,intervalAvg ")
}