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);
  
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容