两个案例
工程已经导入了sample.dbc文件;
用例一:雨刮的工作状态的检测
具体需求如下:
代码实现如下:
includes
{
}
variables
{
//前雨刮的控制报文 (HU控制报文的发出)
message HU_0x55d msgReq;
int checkResult;
}
MainTest(){
testModuleTitle("测试雨刮功能");
testModuleDescription("测试每个档位是否能正常工作");
FrontWiperLow();//雨刷低速刮
FrontWiperHight();//雨刷高速刮
FrontWiperOff();
FrontWiperAuto();
}
//下面这就是一个完整的用例的使用
//雨刷低速刮
testcase FrontWiperLow(){
testCaseTitle("用例1","测试前雨刮-->低速刮");
testModuleDescription("发送低速刮的请求,验证前雨刮状态信号是否变为低速刮");
testStep("用例开始时", "请求发送前,当前的工作状态信号BCM_FrontWiperStatus为:0x%X", (int)$BCM_FrontWiperStatus);
msgReq.HU_FronWiperRq = 0x01;
output(msgReq);
//检查BCM操作后的雨刮工作状态; testWaitForSignalMatch-->等待信号的出现并等于预期值
checkResult = testWaitForSignalMatch(BCM_FrontWiperStatus,1,500);
if(checkResult == 1){
testStepPass("用例执行成功", "请求发送后预期值[0x01],当前的前雨刮工作状态信号BCM_FrontWiperStatus为:0x%02X", (int)$BCM_FrontWiperStatus);
}
else
{
testStepFail("用例执行失败", "请求发送后预期值[0x01],当前的前雨刮工作状态信号BCM_FrontWiperStatus为:0x%02X", (int)$BCM_FrontWiperStatus);
}
}
//雨刷高速刮
testcase FrontWiperHight(){
testCaseTitle("用例2","测试前雨刮-->高速刮");
testModuleDescription("发送高速刮的请求,验证前雨刮状态信号是否变为高速刮");
testStep("用例开始时", "请求发送前,当前的工作状态信号BCM_FrontWiperStatus为:0x%X", (int)$BCM_FrontWiperStatus);
msgReq.HU_FronWiperRq = 0x02;
output(msgReq);
//检查BCM操作后的雨刮工作状态; testWaitForSignalMatch-->等待信号的出现并等于预期值
checkResult = testWaitForSignalMatch(BCM_FrontWiperStatus,2,500);
if(checkResult == 1){
testStepPass("用例执行成功", "请求发送后预期值[0x02],当前的前雨刮工作状态信号BCM_FrontWiperStatus为:0x%02X", (int)$BCM_FrontWiperStatus);
}
else
{
testStepFail("用例执行失败", "请求发送后预期值[0x02],当前的前雨刮工作状态信号BCM_FrontWiperStatus为:0x%02X", (int)$BCM_FrontWiperStatus);
}
}
//关闭雨刷
testcase FrontWiperOff(){
testCaseTitle("用例3","测试前雨刮-->关闭雨刷");
testModuleDescription("发送关闭雨刷的请求,验证前雨刮状态信号是否变为关闭雨刷");
testStep("用例开始时", "请求发送前,当前的工作状态信号BCM_FrontWiperStatus为:0x%X", (int)$BCM_FrontWiperStatus);
msgReq.HU_FronWiperRq = 0x00;
output(msgReq);
//检查BCM操作后的雨刮工作状态; testWaitForSignalMatch-->等待信号的出现并等于预期值
checkResult = testWaitForSignalMatch(BCM_FrontWiperStatus,0,500);
if(checkResult == 1){
testStepPass("用例执行成功", "请求发送后预期值[0x00],当前的前雨刮工作状态信号BCM_FrontWiperStatus为:0x%02X", (int)$BCM_FrontWiperStatus);
}
else
{
testStepFail("用例执行失败", "请求发送后预期值[0x00],当前的前雨刮工作状态信号BCM_FrontWiperStatus为:0x%02X", (int)$BCM_FrontWiperStatus);
}
}
//雨刷自动Auto
testcase FrontWiperAuto(){
testCaseTitle("用例4","测试前雨刮-->Auto刮");
testModuleDescription("发送Auto刮的请求,验证前雨刮状态信号是否变为Auto刮");
testStep("用例开始时", "请求发送前,当前的工作状态信号BCM_FrontWiperStatus为:0x%X", (int)$BCM_FrontWiperStatus);
msgReq.HU_FronWiperRq = 0x03;
output(msgReq);
//检查BCM操作后的雨刮工作状态; testWaitForSignalMatch-->等待信号的出现并等于预期值
checkResult = testWaitForSignalInRange(BCM_FrontWiperStatus,1,2,500);
if(checkResult == 1){
testStepPass("用例执行成功", "请求发送后预期值[0x01-0x02],当前的前雨刮工作状态信号BCM_FrontWiperStatus为:0x%02X", (int)$BCM_FrontWiperStatus);
}
else
{
testStepFail("用例执行失败", "请求发送后预期值[0x01-0x02],当前的前雨刮工作状态信号BCM_FrontWiperStatus为:0x%02X", (int)$BCM_FrontWiperStatus);
}
}
用例二:报文的发送周期的检测
需求:测试一段时间内,报文0x28B发送的周期是否在37~43ms之间;
矩阵表中标准是40ms一次,由于ECU的性能,可能出现偏差,进行验证
includes
{
}
variables
{
//定义一些全局的常量
//检查信号发送周期的时长 (这里是检查10s时间内,28b的报文发送周期是否都符合预期)
const int check_timeOut = 10000;
//因为验证的28b的报文发送周期是40ms一次;
//发送的最小时间
const int min_interval = 37;
//发送的最大时间
const int max_interval = 43;
}
MainTest(){
testModuleTitle("28b性能测试");
tc1();
tc2();
TestMsgSendInterval();//测试消息的发送间隔
}
//下面两个函数主要是用于说明testcase中的函数的执行是会堵塞线程的,
//只有tc1执行完成,才会调用tc2
testcase tc1(){
write("tc1-----1");
testWaitForTimeout(3000);
write("tc1-------2");
}
testcase tc2(){
write("tc2----1");
testWaitForTimeout(4000);
write("tc2-----2");
}
testcase TestMsgSendInterval(){
int checkId;
int NumEvents;
int StatNumProbes;
float StatProbeIntervalAvg;
float StatProbeIntervalMin;
float StatProbeIntervalMax;
//主要使用函数: ChkStart_MsgAbsCycleTimeViolation ,检查发送周期是否在指定范围内;
testCaseTitle("用例1","检查28b的报文发送周期是否符合预期");
//返回一个检查的id,用于获取检查过程中的一些信息;
checkId = ChkStart_MsgAbsCycleTimeViolation(BCM_0x28b,min_interval,max_interval);
//添加检查条件: 把检查的违规信息,写入测试报告中;
testAddCondition(checkId);
//设置这个指令进行检查的时长,也就是设置一个等待时间;
testWaitForTimeout(check_timeOut);
//移除检查条件
testRemoveCondition(checkId);
//下面是通过id获取这次检查过程中得到的信息
/************************************
查询检查的各项结果
查看违规次数 —— ChkQuery_NumEvents
查看报文出现次数/信号变化次数 —— ChkQuery_StatNumProbes
查询报文发送间隔的平均时间 —— ChkQuery_StatProbeIntervalAvg
查询报文发送间隔的最小时间 —— ChkQuery_StatProbeIntervalMin
查询报文发送间隔的最大时间 —— ChkQuery_StatProbeIntervalMax
************************************/
NumEvents = ChkQuery_NumEvents(checkId);
StatNumProbes = ChkQuery_StatNumProbes(checkId);
StatProbeIntervalAvg = ChkQuery_StatProbeIntervalAvg(checkId);
StatProbeIntervalMin = ChkQuery_StatProbeIntervalMin(checkId);
StatProbeIntervalMax = ChkQuery_StatProbeIntervalMax(checkId);
if(NumEvents == 0) // 没有出现违反规则的时间(本例中所有探测的报文发送的间隔时间均规定范围内)
{
testStepPass("用例通过", "报文发送间隔时间均在在%d~%d毫秒范围", min_interval, max_interval);
}
else
{
testStepFail("用例失败", "违反规则【报文发送间隔时间不在%d~%d毫秒范围】的事件发生次数:%d", min_interval, max_interval, NumEvents);
}
testStep("统计信息", "报文出现的次数:%d", StatNumProbes);
testStep("统计信息", "报文发送间隔的平均时间:%.3f", StatProbeIntervalAvg);
testStep("统计信息", "报文发送间隔的最小时间:%.3f", StatProbeIntervalMin);
testStep("统计信息", "报文发送间隔的最大时间:%.3f", StatProbeIntervalMax);
}