兩個案例
工程已經導入了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);
}