分享

CANoe测试:CAPL Test Module的2种创建方式

 ghostvip 2022-09-17 发布于广东

内容参考1: 从零开始学习CANoe(五)—— CAPL 测试节点_蚂蚁小兵-CSDN博客

内容参考2:《CANoe开发从入门到精通》

在工程建立后(基于第三个仿真工程),有下面两种方式创建CAPL Test Module。

目录

1. 在Test SetUp创建CAPL Test Module

2 基于Simulation Setup创建CAPL Test Module

3. 附录:CAPL代码


1. 在Test SetUp创建CAPL Test Module

1-1 点击Test-TestSetUp,打开Test Setup for Test Modules窗口。

 1-2  在窗口右键,创建或使用已经建立好的Test Environment

1-3 选中创建的Test Environment 测试环境,创建CAPL TestModule。

1-4 选中创建的Test Module 右键编辑,进入.can文件,编写CAPL测试用例。

1-5 CAPL编辑完成后,双击Test Module名,可以在窗口看到CAPL中定义的测试用例。启动工程后,点击右下角三角形可以运行测试用例。

1-5 TestModule运行结束后,可以查看测试报告。测试报告的格式可以选择Test Viewer,或者XML/HTML格式打开。

 至此,使用TestSetup创建CAPL Test Module完成。

2 基于Simulation Setup创建CAPL Test Module

2-1 直接在仿真工程面板Simulation上,在总线上右键,添加CAPL Test Module

  

 2-2 创建后 会显示一个CAPL节点,右键点击Configuration可配置此节点属性,

2-3 配置完成后可点击小铅笔,编辑CAPL文件编写测试用例,并保存编译通过。    

 2-4 工程运行后,点击CAPL节点,可打开CAPL TestModule窗口,显示编辑好的CAPL测试用例。点击三角形,可运行TestModule。

 

 2-5 TestModule运行结束后,可以查看测试报告。

  至此,使用Simulation Setup创建CAPL Test Module完成。

3. 附录:CAPL代码

  1. /*@!Encoding:936*/
  2. /*
  3. 1.测试用例——检测报文周期
  4. 2.测试用例——检测报文长度DLC
  5. 3.测试用例——检测未定义报文undefined msg
  6. 4.测试用例——功能测试
  7. 5.测试用例——测试模块入口函数
  8. */
  9. includes
  10. {
  11. }
  12. variables
  13. {
  14. //TC1
  15. dword gCycCheckId;//声明检测事件的ID
  16. int gUndefinedMsgCheckResult;//声明未定义报文的检测结果
  17. const long kMIN_CYCLE_TIME = 40;//一般最小周期时间常量
  18. const long kMAX_CYCLE_TIME = 60;//一般最大周期时间常量
  19. const long Lingh_MIN_CYCLE_TIME = 490;//定义报文Light_Info最小周期时间常量
  20. const long Lingh_MAX_CYCLE_TIME = 510;//定义报文Light_Info最大周期时间常量
  21. const long kTIMEOUT = 4000;//定义测试等待时间常量
  22. }
  23. //周期时间检测结果函数
  24. CheckMsgCyc(float aCycMinCycleTime, float aCycMaxCycleTime)
  25. {
  26. long lQueryResultProbeAvg;//声明平均时间
  27. long lQueryResultProbeMin;//声明最小测量时间
  28. long lQueryResultProbeMax;//声明最大测量时间
  29. char lbuffer[100];
  30. testAddCondition(gCycCheckId);//在该函数中添加事件
  31. testWaitForTimeout(kTIMEOUT);//等待测试时间结束
  32. //统计平均时间
  33. lQueryResultProbeAvg = ChkQuery_StatProbeIntervalAvg(gCycCheckId);
  34. //统计min时间
  35. lQueryResultProbeMin = ChkQuery_StatProbeIntervalMin(gCycCheckId);
  36. //统计max时间
  37. lQueryResultProbeMax = ChkQuery_StatProbeIntervalMax(gCycCheckId);
  38. if(ChkQuery_NumEvents(gCycCheckId)>0)
  39. {
  40. //统计异常次数//打印报告
  41. snprintf(lbuffer,elCount(lbuffer),'Valid values %.0fms - %.0fms',aCycMinCycleTime,aCycMaxCycleTime);
  42. testStepFail('',lbuffer);
  43. snprintf(lbuffer,elCount(lbuffer),'Average cycle time: %dms',lQueryResultProbeAvg);
  44. testStepFail('',lbuffer);
  45. snprintf(lbuffer,elCount(lbuffer),'Min cycle time: %dms',lQueryResultProbeMin);
  46. testStepFail('',lbuffer);
  47. snprintf(lbuffer,elCount(lbuffer),'Average cycle time: %dms',lQueryResultProbeMax);
  48. testStepFail('',lbuffer);
  49. }
  50. else
  51. {
  52. snprintf(lbuffer,elCount(lbuffer),'Valid values %.0fms - %.0fms',aCycMinCycleTime,aCycMaxCycleTime);
  53. testStepPass('',lbuffer);
  54. snprintf(lbuffer,elCount(lbuffer),'Average cycle time: %dms',lQueryResultProbeAvg);
  55. testStepPass('',lbuffer);
  56. snprintf(lbuffer,elCount(lbuffer),'Min cycle time: %dms',lQueryResultProbeMin);
  57. testStepPass('',lbuffer);
  58. snprintf(lbuffer,elCount(lbuffer),'Average cycle time: %dms',lQueryResultProbeMax);
  59. testStepPass('',lbuffer);
  60. }
  61. ChkControl_Destroy(gCycCheckId);//销毁事件
  62. }
  63. //TC1:Check Cycle time of msg EngineData
  64. testcase CheckMsgEngineData()
  65. {
  66. float lCycMinCycleTime;//声明最小周期时间
  67. float lCycMaxCycleTime;//声明最大周期时间
  68. lCycMinCycleTime = kMIN_CYCLE_TIME;//赋值
  69. lCycMaxCycleTime = kMAX_CYCLE_TIME;
  70. //测试报告提示信息
  71. testCaseTitle('TC-1','TC-1:Check cycle time of msg EngineData');
  72. //开始观察待测报文
  73. gCycCheckId = ChkStart_MsgAbsCycleTimeViolation(EngineData,lCycMinCycleTime,lCycMaxCycleTime);
  74. CheckMsgCyc(lCycMinCycleTime,lCycMaxCycleTime);//周期时间检测结果函数
  75. testRemoveCondition(gCycCheckId);//移除测试条件
  76. }
  77. //TC-2:Check Cycle time of msg VehicleData
  78. testcase CheckMsgVehicleData()
  79. {
  80. float lCycMinCycleTime;
  81. float lCycMaxCycleTime;
  82. lCycMinCycleTime = kMIN_CYCLE_TIME;
  83. lCycMaxCycleTime = kMAX_CYCLE_TIME;
  84. testCaseTitle('TC-2','TC-2:Check cycle time of msg VehicleData');
  85. gCycCheckId = ChkStart_MsgAbsCycleTimeViolation(VehicleData,lCycMinCycleTime,lCycMaxCycleTime);
  86. CheckMsgCyc(lCycMinCycleTime,lCycMaxCycleTime);
  87. testRemoveCondition(gCycCheckId);
  88. }
  89. //TC-3:Check Cycle time of msg Gear_Info
  90. testcase CheckMsgGear_Info()
  91. {
  92. float lCycMinCycleTime;
  93. float lCycMaxCycleTime;
  94. lCycMinCycleTime = kMIN_CYCLE_TIME;
  95. lCycMaxCycleTime = kMAX_CYCLE_TIME;
  96. testCaseTitle('TC-3','TC-3:Check cycle time of msg Gear_Info');
  97. gCycCheckId = ChkStart_MsgAbsCycleTimeViolation(Gear_Info,lCycMinCycleTime,lCycMaxCycleTime);
  98. CheckMsgCyc(lCycMinCycleTime,lCycMaxCycleTime);
  99. testRemoveCondition(gCycCheckId);
  100. }
  101. //TC-4:Check Cycle time of msg Ignition_Info
  102. testcase CheckMsgIgnition_Info()
  103. {
  104. float lCycMinCycleTime;
  105. float lCycMaxCycleTime;
  106. lCycMinCycleTime = kMIN_CYCLE_TIME;
  107. lCycMaxCycleTime = kMAX_CYCLE_TIME;
  108. testCaseTitle('TC-4','TC-4:Check cycle time of msg Ignition_Info');
  109. gCycCheckId = ChkStart_MsgAbsCycleTimeViolation(Ignition_Info,lCycMinCycleTime,lCycMaxCycleTime);
  110. CheckMsgCyc(lCycMinCycleTime,lCycMaxCycleTime);
  111. testRemoveCondition(gCycCheckId);
  112. }
  113. //TC-5:Check Cycle time of msg Light_Inf
  114. testcase CheckMsgLight_Info()
  115. {
  116. float lCycMinCycleTime;
  117. float lCycMaxCycleTime;
  118. lCycMinCycleTime = kMIN_CYCLE_TIME;
  119. lCycMaxCycleTime = kMAX_CYCLE_TIME;
  120. testCaseTitle('TC-5','TC-5:Check cycle time of msg Light_Info');
  121. gCycCheckId = ChkStart_MsgAbsCycleTimeViolation(Light_Info,lCycMinCycleTime,lCycMaxCycleTime);
  122. CheckMsgCyc(lCycMinCycleTime,lCycMaxCycleTime);
  123. testRemoveCondition(gCycCheckId);
  124. }
  125. //TC6:DLC 报文长度测试
  126. testcase CheckDLCLock_Info()
  127. {
  128. dword checkId;
  129. //测试报告提示信息
  130. testCaseTitle('TC-6','TC-6:Check msg DLC of Lock_Info');
  131. //管事观测报文Lock_Info的DLC
  132. checkId = ChkStart_InconsistentDlc(Lock_Info);
  133. testAddCondition(checkId);
  134. //等待测试时间结束
  135. testWaitForTimeout(kTIMEOUT);
  136. testRemoveCondition(checkId);
  137. }
  138. //TC-7:检测未定义信号
  139. testcase CheckUndefinedMessage()
  140. {
  141. long lEventUndefineMessageId;//声明未定义报文Id
  142. char lbuffer[100];
  143. gUndefinedMsgCheckResult = 0;//?初始化未定义报文数量为0
  144. testCaseTitle('TC-7','TC-7:Check CAN channel for undefined message');
  145. //开始观测当前总线
  146. gCycCheckId = ChkStart_UndefinedMessageReceived('UndefinedMsgCallback');
  147. //延时,即测量该时间段
  148. testWaitForTimeout(kTIMEOUT);
  149. switch(gUndefinedMsgCheckResult)
  150. {
  151. case 1:
  152. write('Iam case1');
  153. //获取未定义报文ID
  154. lEventUndefineMessageId = ChkQuery_EventMessageId(gCycCheckId);
  155. snprintf(lbuffer,elCount(lbuffer),'Undefined message detected: Id 0x%x',lEventUndefineMessageId);
  156. testStepFail('',lbuffer);
  157. break;
  158. default:
  159. write('Iamdefault');
  160. testStepPass('','No undefined message detected!');
  161. break;
  162. }
  163. ChkControl_Destroy(gCycCheckId);//销毁事件
  164. }
  165. UndefinedMsgCallback(dword aCheckId)
  166. {
  167. //回调函数,检测到未定义报文时调用
  168. write('Iam here');
  169. ChkQuery_EventStatusToWrite(aCheckId);
  170. gUndefinedMsgCheckResult=1;//将未定义报文个数置为1
  171. }
  172. //TC-8:功能测试
  173. testcase CheckEngine_Speed()
  174. {
  175. dword checkId;
  176. testCaseTitle('TC-8','TC-8:Check Engine Speed Value');
  177. @Vehicle_Key::Unlock_Car = 1;
  178. @Vehicle_Key::Car_Driver = 0;
  179. @Vehicle_Key::Key_State = 2;
  180. @Vehicle_Control::Eng_Speed = 2000;
  181. //开始观测,信号值是否在范围内
  182. checkId = ChkStart_MsgSignalValueInvalid(EngineData::EngSpeed,1900,2100);
  183. testWaitForTimeout(kTIMEOUT);
  184. if(ChkQuery_EventSignalValue(checkId))
  185. {
  186. testStepPass('','Correct Engine Speed Value');
  187. }
  188. else
  189. {
  190. testStepFail('','Incorrect Engine Speed Value');
  191. }
  192. }
  193. //测试模块入口函数
  194. void MainTest()
  195. {
  196. testModuleTitle('NetworkTester');
  197. testModuleDescription('Message Specification Test and Function Test Demo.');
  198. testGroupBegin('Check msg cycle time','Check the differ mesage cycle time');
  199. Init_Test_Condition();
  200. CheckMsgEngineData();
  201. CheckMsgVehicleData();
  202. CheckMsgGear_Info();
  203. CheckMsgIgnition_Info();
  204. CheckMsgLight_Info();
  205. testGroupEnd();
  206. testGroupBegin('Check msg DLC','Check DLC of a message');
  207. CheckDLCLock_Info();
  208. testGroupEnd();
  209. testGroupBegin('Check undefined msg','Check the undefined message');
  210. CheckUndefinedMessage();
  211. testGroupEnd();
  212. testGroupBegin('Fucntion Test','Check the engine speed after setup');
  213. CheckEngine_Speed();
  214. testGroupEnd();
  215. }
  216. //初始化仿真工程状态,确保各个模块处于Online
  217. Init_Test_Condition()
  218. {
  219. @Vehicle_Key::Unlock_Car = 1;
  220. @Vehicle_Key::Car_Driver = 0;
  221. @Vehicle_Key::Key_State = 2;
  222. testWaitForTimeout(500);
  223. }
  224. on sysvar_update Test::IPC_Cluster_Info_off
  225. {
  226. if (@this==1)
  227. {
  228. }
  229. }

END

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多