CAPL语言之TestModule(二)

两个案例

工程已经导入了sample.dbc文件;

用例一:雨刮的工作状态的检测

具体需求如下:


image.png

代码实现如下:

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);
  
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容