目录

CANOE-仿真测试

CANOE 仿真+测试

仿真+测试

CANoe的自动化测试系统简介

基于CANoe的自动化测试系统架构,根据ECU的测试环境和测试规范,搭建基于CANoe的测试系统,通过开始测试模块(Test Module)或测试单元(Test Unit)、网络控制硬件接口(如VN2600)、外围的硬件在环设备(如TV System)以及数据采集和控制I/O等板卡,实现高效的自动化测试。

Canoe TFS(Test Feature Set)

Canoe Test Feature Set是一套专为Canoe测试工具开发的功能集,旨在提供全面、完善的测试功能,帮助测试工程师进行各种测试任务,TFS包含一系列测试功能函数。

测试判别函数

函数功能描述
TestCaseFail用于将当前测试用例的判别设为fail
TestGetVerdictLastTestCase用于返回上一次测试用例的判别结果
TestGetVerdictModule用于返回测试模块的当前判别结果
TestSetVerdictModule用于设定测试模块的当前判别结果
TestStepFail用于描述当前测试步骤的错误信息

测试架构函数

函数功能描述
TestCaseDescription用于将测试用例的描述写入测试报告
TestCaseSkipped用于在测试报告描述中跳过某个测试用例
TestCaseTitle用于设定测试用例的标题
TestCaseReportMeasuredValue用于在测试报告中添加测试参数的测量值
TestGroupBegin用于测试分组的开始
TestGroupEnd用于测试分组的结尾
TestModuleDescription用于在测试报告中描述测试模块
TestModuleTitle用于设定测试模块的标题
TestStep用于报告测试步骤信息,而不对测试结果有任何影响
TestStepErrorInTestSystem用于描述某个测试步骤在测试系统中发生一个错误
TestStepFail用于描述某个测试步骤发生错误
TestStepInconclusive用于描述某个测试步骤测试结果无法判别通过(pass)还是失败(fail)
TestStepPass用于描述某个测试步骤测试结果通过(pass),满足期望结果
TestStepWarning用于描述某个测试步骤的警示信息
TestInfoTable用于创建一个新表格,使测试报告显示更加结构化
TestInfoHeadingBegin用于在表格中添加一个表头
TestInfoHeadingEnd用于在表格中添加表头结束
TestInfoRow用于在表格中添加一个行
TestInfoCell用于在表格或者表头行添加单元格内容

测试报告函数

函数功能描述
TestCaseComment用于在测试用例中添加一个备注信息
TestReportAddEngineerInfo用于在测试报告中添加一些测试配置信息,如测试员、测试设定和待测样品等
TestReportAddSetupInfo用于在测试报告中添加一些测试配置信息,如测试员、测试设定和待测样品等
TestReportAddSUTInfo用于在测试报告中添加一些测试配置信息,如测试员、测试设定和待测样品等
TestReportAddExtendedInfo用于在测试报告中直接添加其他协议的信息(如HTML、text或XML),而处理不依赖于CANoe
TestReportAddExternalRef用于在测试报告中添加外部应用(如URL)
TestReportAddImage用于在测试报告中添加图片
TestReportAddMiscInfo用于在测试报告中添加一些额外信息
TestReportAddMiscInfoBlock用于在测试报告中添加一些额外信息区域
TestReportAddWindowCapture用于在测试报告中对某个测试用例抓取指定窗口图片
TestReportFileName用于动态设定测试报告名称
TestReportWriteDiagObject用于将某些指定对象以HTML表格形式写入测试报告
TestReportWriteDiagResponse用于将接收到的诊断响应以一个HTML表格的形式写入测试报告

检测函数

CANoe为用户提供了多种检测函数(CheckDescriptions),主要包括以下几个方面的检测。

  1. SignalEvaluation〔信号验证〕:包括信号的数值有效性、周期和稳定性等检测。
  2. MessageEvaluation(报文验证〕:包括报文丢失、周期、数据长度、错误帧等检测。
  3. TimeEvaluation〔时间验证〕:包括连续帧及超时等检测。

创建自动化测试工程

  1. 点击Test下面的Test Setup

    https://i-blog.csdnimg.cn/blog_migrate/2bd11c4618e364e5f0461d4dd0695cfa.png

  2. 空白位置右击,新建测试环境,并命名。

    https://i-blog.csdnimg.cn/blog_migrate/cdf5342787f70f3cc989d101709f0c7e.png

  3. 插入CAPL测试模块,并简单配置该模块。

    https://i-blog.csdnimg.cn/blog_migrate/9414b356102683b45da4f53d1c3c153f.png

  4. 双击该测试名称,进入编辑界面,点击下方的小铅笔,可以开始进行测试脚本编写。

    https://i-blog.csdnimg.cn/blog_migrate/92bd9fbfa3d1480e4ed4c812aaef9c06.png

  5. 测试脚本样例

variables
{
  const kTIMEOUT=5000;//常变量 测试等待时间为5s
}

void MainTest()//void返回值为空 ,测试程序的主入口
{
  testModuleTitle("TestDemo002");//测试模块名称
  testModuleDescription("这是Demo002的测试集");//测试模块描述
  testGroupBegin("测试组","测试组描述");//测试组开始
  checkEngineSpeed();
  testGroupEnd();//测试组结束

}


testcase checkEngineSpeed()
{
  dword checkId;//存放检测函数的返回值
  testCaseTitle("TC-1","TC-1测试引擎转速区间");//测试用例标题
  testCaseDescription("应用报文的功能测试");//测试用例描述
  //判断信号的值所在区间
  checkId=ChkStart_MsgSignalValueRangeViolation(Engine::EngineSpeed,2000,5000);
  testAddCondition(checkId);//添加测试条件
  if(checkId!=0)
  {
    testStepPass("引擎转速区间在2000-5000之间");
  }
  else
  {
    testStepFail("引擎转速区间不在2000-5000之间");
  }
  testWaitForTimeout(kTIMEOUT);//添加测试等待时间
  testRemoveCondition(checkId);//测试结束后 移除测试条件
  //测试报告的测试用例处添加
  TestReportAddMiscInfoBlock("测试参数");//额外信息区域
  TestReportAddMiscInfo("Max. voltage", "19.5 V");//额外信息
  TestReportAddMiscInfo("Max. current", "560 mA");
  TestReportAddImage("IP Snapshot", "IP.png", "400px", "");
}
  1. 仿真测试

    此测试项目参考 ,需要先运行项目,然后进行仿真,最后测试面板点击三角符号,进行仿真测试

    https://i-blog.csdnimg.cn/blog_migrate/a1dc0b9bdda4dd71f558e27296e431d9.png

  2. 测试结果查看

    https://i-blog.csdnimg.cn/blog_migrate/cbb68754c6b9f3eaa26277431c44594f.png

    https://i-blog.csdnimg.cn/blog_migrate/bbfe4681ef3067964c01d690f5539147.png

  3. 查看函数的含义,测试过程中有一个比较重要的函数是 ChkStart_MsgSignalValueRangeViolation ,如果不清楚函数的含义,可以鼠标移动到函数的位置,点击F1查看官方的帮助文档。

    https://i-blog.csdnimg.cn/blog_migrate/0a6db882f2c68095b6a1b2c54916e401.png

其他常用函数

  1. ChkStart_InconsistentDlc:检查DLC(数据长度代码)不一致的情况。
  2. ChkStart_UndefinedMessageReceived:检查是否接收到未定义的消息。
  3. ChkStart_MsgAbsCycleTimeViolation:检查消息的绝对周期时间是否超出限制。
  4. ChkStart_MsgRelCycleTimeViolation:检查消息的相对周期时间是否超出限制。
  5. ChkStart_NodeMsgsRelCycleTimeViolation:检查节点消息的相对周期时间是否超出限制。
  6. ChkStart_ErrorFramesOccured:检查是否发生错误帧。
  7. ChkQuery_NumEvents:查询事件数量。
  8. ChkStart_MsgOccurrenceCount:检查消息的出现次数是否超出限制。
  9. ChkStart_MsgDistViolation:检查消息分布是否超出限制。
  10. ChkStart_AllNodesDead:检查所有节点是否都不存活。
  11. ChkStart_AllNodesBabbling:一个时间间隔,在这个时间间隔内传输是被允许的。一旦超过了这个时间间隔,所有节点都不能再发送消息。
  12. ChkStart_NodeMsgsAbsDistViolation:检查节点消息的绝对分布是否超出限制。
  13. ChkStart_MsgRelOccurrenceViolation:检查消息的相对出现次数是否超出限制。
  14. ChkStart_MsgSignalValueInvalid:检查消息的信号值是否无效。
  15. ChkStart_SignalValueChange:检查信号值是否发生改变。
  16. ChkStart_SignalCycleTimeViolation:检查信号的周期时间是否超出限制。
  17. ChkStart_Timeout:检查是否发生超时。
  18. 故障注入函数
On key 'z'
{
testSetMsgDlc(EngineState,5);将报文EngineState的DLC设置为5
testResetMsgDlc(EngineState);将报文EngineState的DLC重置为默认值
testSetMsgCycleTime(0x150,50);故障注入将引擎报文的循环周期设置为50ms
TestDisableMsg(0x250);禁用报文0x250
TestWaitForTimeout(2000);等待超时时间为2000毫秒
TestSetMsgEvent(0x250);设置报文0x250的事件
TestEnableMsg(0x250);启用报文0x250
}