CAPL語言之TestModule(二)

兩個案例

工程已經導入了sample.dbc文件;

用例一:雨刮的工作狀態(tài)的檢測

具體需求如下:


image.png

代碼實現(xiàn)如下:

includes
{
  
}

variables
{
  
  //前雨刮的控制報文 (HU控制報文的發(fā)出)
  message HU_0x55d msgReq;
  
  int checkResult;
  
}

MainTest(){
  testModuleTitle("測試雨刮功能");
  testModuleDescription("測試每個檔位是否能正常工作");
  
  
  FrontWiperLow();//雨刷低速刮
  FrontWiperHight();//雨刷高速刮
  FrontWiperOff();
  FrontWiperAuto();
}

//下面這就是一個完整的用例的使用

//雨刷低速刮
testcase FrontWiperLow(){
  
  testCaseTitle("用例1","測試前雨刮-->低速刮");
  testModuleDescription("發(fā)送低速刮的請求缓呛,驗證前雨刮狀態(tài)信號是否變?yōu)榈退俟?);
  
  testStep("用例開始時", "請求發(fā)送前,當前的工作狀態(tài)信號BCM_FrontWiperStatus為:0x%X", (int)$BCM_FrontWiperStatus);
  
  msgReq.HU_FronWiperRq = 0x01;
  output(msgReq);
  
  //檢查BCM操作后的雨刮工作狀態(tài);  testWaitForSignalMatch-->等待信號的出現(xiàn)并等于預期值
  checkResult = testWaitForSignalMatch(BCM_FrontWiperStatus,1,500);
  if(checkResult == 1){
     testStepPass("用例執(zhí)行成功", "請求發(fā)送后預期值[0x01],當前的前雨刮工作狀態(tài)信號BCM_FrontWiperStatus為:0x%02X", (int)$BCM_FrontWiperStatus);
  }
  else
  {
    testStepFail("用例執(zhí)行失敗", "請求發(fā)送后預期值[0x01],當前的前雨刮工作狀態(tài)信號BCM_FrontWiperStatus為:0x%02X", (int)$BCM_FrontWiperStatus);
  }
  
}


//雨刷高速刮
testcase FrontWiperHight(){
  
  testCaseTitle("用例2","測試前雨刮-->高速刮");
  testModuleDescription("發(fā)送高速刮的請求,驗證前雨刮狀態(tài)信號是否變?yōu)楦咚俟?);
  
  testStep("用例開始時", "請求發(fā)送前逮栅,當前的工作狀態(tài)信號BCM_FrontWiperStatus為:0x%X", (int)$BCM_FrontWiperStatus);
  
  msgReq.HU_FronWiperRq = 0x02;
  output(msgReq);
  
  //檢查BCM操作后的雨刮工作狀態(tài);  testWaitForSignalMatch-->等待信號的出現(xiàn)并等于預期值
  checkResult = testWaitForSignalMatch(BCM_FrontWiperStatus,2,500);
  if(checkResult == 1){
     testStepPass("用例執(zhí)行成功", "請求發(fā)送后預期值[0x02],當前的前雨刮工作狀態(tài)信號BCM_FrontWiperStatus為:0x%02X", (int)$BCM_FrontWiperStatus);
  }
  else
  {
    testStepFail("用例執(zhí)行失敗", "請求發(fā)送后預期值[0x02],當前的前雨刮工作狀態(tài)信號BCM_FrontWiperStatus為:0x%02X", (int)$BCM_FrontWiperStatus);
  }
  
}

//關閉雨刷
testcase FrontWiperOff(){
  
  testCaseTitle("用例3","測試前雨刮-->關閉雨刷");
  testModuleDescription("發(fā)送關閉雨刷的請求怒详,驗證前雨刮狀態(tài)信號是否變?yōu)殛P閉雨刷");
  
  testStep("用例開始時", "請求發(fā)送前,當前的工作狀態(tài)信號BCM_FrontWiperStatus為:0x%X", (int)$BCM_FrontWiperStatus);
  
  msgReq.HU_FronWiperRq = 0x00;
  output(msgReq);
  
  //檢查BCM操作后的雨刮工作狀態(tài);  testWaitForSignalMatch-->等待信號的出現(xiàn)并等于預期值
  checkResult = testWaitForSignalMatch(BCM_FrontWiperStatus,0,500);
  if(checkResult == 1){
     testStepPass("用例執(zhí)行成功", "請求發(fā)送后預期值[0x00]踪区,當前的前雨刮工作狀態(tài)信號BCM_FrontWiperStatus為:0x%02X", (int)$BCM_FrontWiperStatus);
  }
  else
  {
    testStepFail("用例執(zhí)行失敗", "請求發(fā)送后預期值[0x00]昆烁,當前的前雨刮工作狀態(tài)信號BCM_FrontWiperStatus為:0x%02X", (int)$BCM_FrontWiperStatus);
  }
  
}


//雨刷自動Auto
testcase FrontWiperAuto(){
  
  testCaseTitle("用例4","測試前雨刮-->Auto刮");
  testModuleDescription("發(fā)送Auto刮的請求,驗證前雨刮狀態(tài)信號是否變?yōu)锳uto刮");
  
  testStep("用例開始時", "請求發(fā)送前缎岗,當前的工作狀態(tài)信號BCM_FrontWiperStatus為:0x%X", (int)$BCM_FrontWiperStatus);
  
  msgReq.HU_FronWiperRq = 0x03;
  output(msgReq);
  
  //檢查BCM操作后的雨刮工作狀態(tài);  testWaitForSignalMatch-->等待信號的出現(xiàn)并等于預期值
  checkResult = testWaitForSignalInRange(BCM_FrontWiperStatus,1,2,500);
  if(checkResult == 1){
     testStepPass("用例執(zhí)行成功", "請求發(fā)送后預期值[0x01-0x02]静尼,當前的前雨刮工作狀態(tài)信號BCM_FrontWiperStatus為:0x%02X", (int)$BCM_FrontWiperStatus);
  }
  else
  {
    testStepFail("用例執(zhí)行失敗", "請求發(fā)送后預期值[0x01-0x02],當前的前雨刮工作狀態(tài)信號BCM_FrontWiperStatus為:0x%02X", (int)$BCM_FrontWiperStatus);
  }
  
}

用例二:報文的發(fā)送周期的檢測

需求:測試一段時間內,報文0x28B發(fā)送的周期是否在37~43ms之間;
矩陣表中標準是40ms一次,由于ECU的性能,可能出現(xiàn)偏差,進行驗證

includes
{
  
}

variables
{
  //定義一些全局的常量
  //檢查信號發(fā)送周期的時長 (這里是檢查10s時間內,28b的報文發(fā)送周期是否都符合預期)
  const int check_timeOut = 10000;
  
  //因為驗證的28b的報文發(fā)送周期是40ms一次;
  //發(fā)送的最小時間
  const int min_interval = 37;
  //發(fā)送的最大時間
  const int max_interval = 43;
  
}

MainTest(){
  
  testModuleTitle("28b性能測試");
  
  tc1();
  tc2();
  TestMsgSendInterval();//測試消息的發(fā)送間隔
  
  
  
}

//下面兩個函數(shù)主要是用于說明testcase中的函數(shù)的執(zhí)行是會堵塞線程的,
//只有tc1執(zhí)行完成,才會調用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;
  
  //主要使用函數(shù): ChkStart_MsgAbsCycleTimeViolation ,檢查發(fā)送周期是否在指定范圍內;
  testCaseTitle("用例1","檢查28b的報文發(fā)送周期是否符合預期");
  
  //返回一個檢查的id,用于獲取檢查過程中的一些信息;
  checkId = ChkStart_MsgAbsCycleTimeViolation(BCM_0x28b,min_interval,max_interval);
  
  //添加檢查條件: 把檢查的違規(guī)信息,寫入測試報告中;
  testAddCondition(checkId);
  
  //設置這個指令進行檢查的時長,也就是設置一個等待時間;
  testWaitForTimeout(check_timeOut);
  
  //移除檢查條件
  testRemoveCondition(checkId);
  
  
  //下面是通過id獲取這次檢查過程中得到的信息
  /************************************
     查詢檢查的各項結果
        查看違規(guī)次數(shù)                      —— ChkQuery_NumEvents
        查看報文出現(xiàn)次數(shù)/信號變化次數(shù)     —— ChkQuery_StatNumProbes
        查詢報文發(fā)送間隔的平均時間        —— ChkQuery_StatProbeIntervalAvg
        查詢報文發(fā)送間隔的最小時間        —— ChkQuery_StatProbeIntervalMin
        查詢報文發(fā)送間隔的最大時間        —— 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) // 沒有出現(xiàn)違反規(guī)則的時間(本例中所有探測的報文發(fā)送的間隔時間均規(guī)定范圍內)
  {
    testStepPass("用例通過", "報文發(fā)送間隔時間均在在%d~%d毫秒范圍", min_interval, max_interval);
  }
  else
  {
    testStepFail("用例失敗", "違反規(guī)則【報文發(fā)送間隔時間不在%d~%d毫秒范圍】的事件發(fā)生次數(shù):%d", min_interval, max_interval, NumEvents);
  }
  testStep("統(tǒng)計信息", "報文出現(xiàn)的次數(shù):%d", StatNumProbes);
  testStep("統(tǒng)計信息", "報文發(fā)送間隔的平均時間:%.3f", StatProbeIntervalAvg);
  testStep("統(tǒng)計信息", "報文發(fā)送間隔的最小時間:%.3f", StatProbeIntervalMin);
  testStep("統(tǒng)計信息", "報文發(fā)送間隔的最大時間:%.3f", StatProbeIntervalMax);
  
}
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末传泊,一起剝皮案震驚了整個濱河市鼠渺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌眷细,老刑警劉巖拦盹,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異溪椎,居然都是意外死亡普舆,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門校读,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沼侣,“玉大人,你說我怎么就攤上這事歉秫《曷澹” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵端考,是天一觀的道長雅潭。 經常有香客問我揭厚,道長,這世上最難降的妖魔是什么扶供? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任筛圆,我火速辦了婚禮,結果婚禮上椿浓,老公的妹妹穿的比我還像新娘太援。我一直安慰自己,他們只是感情好扳碍,可當我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布提岔。 她就那樣靜靜地躺著,像睡著了一般笋敞。 火紅的嫁衣襯著肌膚如雪碱蒙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天夯巷,我揣著相機與錄音赛惩,去河邊找鬼。 笑死趁餐,一個胖子當著我的面吹牛喷兼,可吹牛的內容都是我干的。 我是一名探鬼主播后雷,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼季惯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了臀突?” 一聲冷哼從身側響起勉抓,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎惧辈,沒想到半個月后琳状,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡盒齿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年念逞,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片边翁。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡翎承,死狀恐怖,靈堂內的尸體忽然破棺而出符匾,到底是詐尸還是另有隱情叨咖,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站甸各,受9級特大地震影響垛贤,放射性物質發(fā)生泄漏。R本人自食惡果不足惜趣倾,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一聘惦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧儒恋,春花似錦善绎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至牧嫉,卻和暖如春剂跟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背酣藻。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工浩聋, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人臊恋。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像墓捻,于是被迫代替她去往敵國和親抖仅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內容