当前位置: 首页 > news >正文

CAPL编程系列_04

1_ 测试模块TestModule:基本使用

  • 1)在Simulation Setup 中创建并配置 Test Module节点

  • 2)编写测试脚本
  •       【1】测试用例函数(testcase):实现具体测试逻辑
  •       【2】测试函数(Main Test):控制测试执行流程

  • 3)执行测试用例并查看测试报告

  Test Module 提供了 TFS(Test Feature Set):大量的测试相关的函数

1.在测试用例函数执行到某个步骤,想判定测试用例执行成功或者失败时:

(1) testStepPass("步骤序号","描述信息”,….)

(2) testStepFail("步骤序号","描述信息",...)

      如果在testcase函数中调用了上述函数,那么结果被记录到测试报告中,并作为判定依据

//定义一个被测试的函数:计算2个数的和
long add(long a,long b)
{return a+b;
}//测试用例1 : 测试add函数计算两个整数相加的结果是否正确
testcase TestAdd01()
{long res;res = add(3,5);if(res == 8){//测试用例执行通过testStepPass ("1.1","add(3,5)测试用例执行成功,返回结果为 %d",res);}else{//测试用例执行失败testStepFail ("1.2","add(3,5)测试用例执行失败,返回结果为 %d",res);}
}//在主测试函数中按执行顺序,调用要执行的测试用例
//只有有了MainTest,才能执行测试用例,我们应该在MainTest中调用测试用例函数 
void MainTest()
{TestAdd01();
}




 2_测试模块TestModule:Test Setup

  • 1) 在 Test Setup 中创建并配置 Test Environment 节点
  • 2) 在Test Environment 节点下创建 Test Module 节点
  • 3) 配置 Test Module 节点,编写测试脚本
  • 4) 执行测试用例并查看测试报告

     




3_ 测试模块TestModule:用例组织和描述

Test Module的架构

  • 一个测试模块中可以包含多个测试用例
  • 一个测试用例中可以包含多个测试步骤

Test Module { 包含多条 Test Case 1  2  3 ......}

Test Case 1  { 包含多条  Test Step  1  2  3 ......}

· Test Module   ->     Test Case  ->     Test Step 

  • 可以使用测试组对测试用例进行分类
  • 测试组可以嵌套

Test Module

1 Test Group
     Test Case
     Test Case

     Test Case
     1.1 Test Group
          Test Case
          Test Case
     1.2 Test Group

          Test Case

2 Test Group

     Test Case

     Test Case

//测试用例是从MainTest中启动的
void MainTest()
{//指定测试模块的标题和描述testModuleTitle("测试模块的示例标题");testModuleDescription("测试模块的示例描述信息");//组 开始到结束testGroupBegin("测试分组1","测试分组1的详细描述");TestCase01();TestCase02();testGroupEnd();testGroupBegin("测试分组2","测试分组2的详细描述");TestCase03();TestCase04();TestCase05();testGroupEnd();testcase TestCase01()
{testCaseTitle("TC01","测试用例1的示例标题");testCaseDescription("测试用例1的示例描述");
}testcase TestCase02()
{testCaseTitle("TC02","测试用例2的示例标题");testCaseDescription("测试用例2的示例描述");
}testcase TestCase03()
{testCaseTitle("TC03","测试用例3的示例标题");testCaseDescription("测试用例3的示例描述");
}testcase TestCase04()
{testCaseTitle("TC04","测试用例4的示例标题");testCaseDescription("测试用例4的示例描述");
}testcase TestCase05()
{testCaseTitle("TC05","测试用例5的示例标题");testCaseDescription("测试用例5的示例描述");
}}




4_ 测试模块TestModule:ECU自动化测试案例

        1) 案例分析: HU(车机)请求控制雨刮器

需求描述
1、BCM(车身控制模块) 控制着雨刮器的工作,可以控制雨刮器: 关闭 / 低速刮/ 高速刮  / 自动。

   (1) BCM (车身控制模块)会周期性地发出CAN 报文,反馈雨刮器当前的工作状态。

   (2) 报文 ID 0x387,其中【前雨刮工作状态】的信号名为:BCM_FrontWiperstatus

2、通过车机给 BCM(车身控制模块) 发送 CAN 报文 (其中包含请求控制雨刮的信号) 来实现雨刮器的控制请求。

   (1) 车机 ( HU ) 会根据用户的操作 ( 按键 / 语音 ) 来发送相应的 CAN 报文。

   (2) 报文 ID0x55D,其中【请求控制前雨刮】的信号名为: HU_FronWiperRg

测试验证
BCM (车身控制模块)是否能根据车机指令相应地控制雨刮器工作,并发送对应雨刮器工作状态的 CAN 报文。


        2) 案例设计:HU(车机)请求控制雨刮器

需求定义
1、BCM 控制着雨刮器的工作,周期性地发出 CAN 报文,反馈雨刮器当前的工作状态。

        (1) 报文 ID 为 0x387,其中【前雨刮工作状态】的信号名为: BCM_FrontWiperStatus

        (2) 信号值: 0x0 ( off )0x1 ( low )0x2 ( high )0x3 ( error )

2、车机给 BCM 发送 CAN 报文来实现雨刮器的控制请求。
        (1) 报文 ID0x55D,其中【请求控制前雨刮】的信号名为: HU_FronWiperRq

        (2) 信号值: 0x0 ( inactive )0x1 ( low )0x2 ( high )0x3 ( auto )

所属模块用例编号 用例标题前置条件执行步骤预期执行结果
BCM-雨刮器控制TC001HU给BCM发送雨刮器低速刮请求

1、BCM 上电

2、BCM控制的雨刮器当前是关闭状态【0x387中信号BCM_FrontWiperStatus为0】

1、模拟HU给BCM发送请求低速刮的报文【0x55D中信号HU_FronWiperRg值为1】1、BCM发出的0x387中信号BCM_FrontWiperStatus值由0变更为1pass
BCM-雨刮器控制TC002HU给BCM发送雨刮器高速刮请求

1、BCM 上电

2、BCM控制的雨刮器当前是关闭状态【0x387中信号BCM_FrontWiperStatus为0】

1、模拟HU给BCM发送请求高速刮的报文【0x55D中信号HU_FronWiperRg值为2】1、BCM发出的0x387中信号BCM_FrontWiperStatus值由0变更为2pass

        3)案例脚本编写:HU(车机)控制雨刮器

variables
{message HU_0x55d msg55d;
}void MainTest()
{TestFrontWiperLow();
}testcase TestFrontWiperLow()
{TestCaseTitle("TC001","HU给BCM发送低速刮请求");TestCaseDescription("模拟HU给BCN发送低速刮请求的信号报文,验证BCM是否控制前雨刮低速刮,并返回相应状态的信号");/*1.先记录请求前BCM发出的前雨刮工作的状态信号是否是已关闭(0)2.先创建HU发出请求低速刮的信号(1)的报文,并发送3.等待2秒钟(2000毫秒)(让BCM完成对前雨刮的实际控制)4.验证BCM当前发出的前雨刮工作状态的信号是否为低速刮(1)*/testStep("Step 1","HU请求发出前,BCM_FrontWiperStatus信号的值: %d",                    (int)$BCM_FrontWiperStatus);msg55d.HU_FrontWiperRq = 1;  //设置为请求低速刮output(msg55d);testStep("Step2","模拟HU发出请求低速刮(信号为1)的报文");testWaitForTimeout(2000);  //让测试程序等待指定的时长testStep("Step3","测试程序休眠了2秒");if((int)$BCM_FrontWiperStatus == 1){testStepPass("Step 4 Pass","用例执行通过:前雨刮当前工作状态为低速刮(1)");}else{testStepFail("Step 4 Fail","用例执行失败:前雨刮当前工作状态的信号值为:%d",    (int)$BCM_FrontWiperStatus);}
}

        4)案例脚本编写:信号判断函数

1. 在超时时长内判断指定的信号是否符合预期【要等待】
        ① TestWaitForSignalMatch ( 信号, 比较值, 超时时长 ) 

        ② TestWaitForSignallnRange ( 信号, 下限值, 上限值, 超时时长 )

        ③ TestWaitForSignalOutsideRange ( 信号, 下限值, 上限值, 超时时长 )
                ①②③ 只检查,不记录到测试结果


2. 检查 / 测试信号的当前值是否符合预期【不等待】
        1) CheckSignalMatch ( 信号, 比较值 )

        2) CheckSignallnRange ( 信号, 下限值, 上限值, 超时时长 ) 

                1) 2) 只检查,不记录到测试结果

        3) TestValidateSignalMatch ( 步骤描述, 信号, 比较值 ) 
        4) TestValidateSignallnRange ( 步骤描述, 信号, 下限值, 上限值, 超时时长 )            

        5) TestValidatesignalOutsideRange ( 步骤描述, 信号, 下限值, 上限值, 超时时长 )

                3) 4) 5) 检查并记录到测试结果


         5)ECU报文发送周期的自动化测试【1】

1. 需求:
        BCM 周期性地发出 ID0x387 CAN 报文,周期为 100ms ( ± 8ms )
2. 思路:
        步骤 ① 开启针对指定报文的发送周期的检查
        步骤 ② 添加检查条件 ( 将检查结果记录到测试报告,并将违反规则的结果判定为 fail )
        步骤 ③ 等待一段时间
        步骤 ④ 移除检查条件

3. 相关函数:
        ChkStart_MsgAbsCycleTimeViolation ( 报文,最小间隔,最大间隔 )
        TestAddCondition( 检查 ID )
        TestRemoveCondition ( 检查 ID )

void MainTest()
{TestMessageCycle ();
}//测试0x387的报文发送周期是否满足规定:100ms(±8ms)
testcase TestMessageCycle()
{dword checkId;  //返回一个检测的ID的整数// 开始检查报文发送的周期(返回该检查的ID )checkId = chkStart_MsgAbsCycleTimeViolation(BCM_0x387,92,108);// 添加检查条件(开始向测试报告中记录,并且会判定违规的结果为Fail)TestAddCondition(checkID);// 让程序休眠3s(让检查进行3s)TestWaitForTimeout(3000);// 移除检查条件(不再测试报告中记录)testRemoveCondition(checkId);
}

         5)ECU报文发送周期的自动化测试【2】

1. 需求:
        BCM 周期性地发出 ID0x387 CAN 报文,周期为 100ms ( ± 8ms )
2. 思路:
        步骤 ① 开启针对指定报文的发送周期的检查
        步骤 ② 等待一段时间
        步骤 ③ 结束检查
        步骤 ④ 查询各项统计结果

3. 相关函数:
        ChkStart_MsgAbsCycleTimeViolation ( 报文,最小间隔,最大间隔 )
        ChkControl_Stop ( 检查 ID )
        ChkQuery_NumEvents ( 检查 ID )

        ChkQuery_StatNumProbes ( 检查 ID )

        ChkQuery_StatProbeIntervalMin ( 检查 ID )

        ChkQuery_StatProbeIntervalMax ( 检查 ID )

        ChkQuery_StatProbeIntervalAvg ( 检查 ID )

void MainTest()
{TestMessageCycle ();
}//测试0x387的报文发送周期是否满足规定:100ms(±8ms)
testcase TestMessageCycle()
{dword checkId;  //返回一个检测的ID的整数long numEvents;long numProbes;float intervalMin;float intervalMax;float intervalAvg;// 开始检查报文发送的周期(返回该检查的ID )checkId = chkStart_MsgAbsCycleTimeViolation(BCM_0x387,92,108);// 让程序休眠3s(让检查进行3s)TestWaitForTimeout(3000);// 停止检查ChkControl_(checkId);// 获取违反规则的事件次数(本例中:报文发送间隔违规: < 92 ||  > 108 )numEvents = ChkQuery_NumEvents(checkId);// 获取统计过程中的收到的报文次数numProbes = ChkQuery_StatNumProbes (checkId);// 获取报文之间的最小间隔intervalMin = ChkQuery_StatProbeIntervalMin(checkID);// 获取报文之间的最大间隔intervalMax = ChkQuery_StatProbeIntervalMax(checkID);// 获取报文之间的平均间隔intervalAvg = ChkQuery_StatProbeIntervalAvg(checkID);write("numEvents : %d, numProbes : %d, intervalMin : %.1f, intervalMax  : %.1f, intervalAvg : %.1f,numEvents ,numProbes ,intervalMin ,intervalMax  ,intervalAvg ")
}



希望对你有所帮助,谢谢观看。

http://www.dtcms.com/a/192672.html

相关文章:

  • Linux线程互斥锁
  • 【C++】set和multiset的常用接口详解
  • AWS Elastic Beanstalk控制台部署Spring极简工程
  • 【Java ee】关于抓包软件Fiddler Classic的安装与使用
  • React 第四十一节Router 中 useActionData 使用方法案例以及注意事项
  • 观测云产品更新 | 安全监测、事件中心、仪表板AI智能分析等
  • 唐婉歆携作品VoyEase亮相2025米兰设计周,以多感官沉浸式设计重塑全球旅行体验
  • 2025年5月AI科技领域周报(5.5-5.11):AGI研究进入关键验证期 具身智能开启物理世界交互新范式
  • 数据可视化-----子图的绘制及坐标轴的共享
  • Linux的进程管理和用户管理
  • C++ Mac 打包运行方案(cmake)
  • 工业大数据的定义
  • 国产数据库工具突围:SQLynx如何解决Navicat的三大痛点?深度体验报告
  • SQL优化总结
  • TASK02【Datawhale 组队学习】使用 LLM API 开发应用
  • 一:操作系统概述之操作系统发展历史和分类
  • string(c++)
  • Vscode 配置python调试环境
  • django中用 InforSuite RDS 替代memcache
  • Java实现MinIO上传PDF文件并配置浏览器在线打开及vue2上传页面
  • Vue3+ElementPlus 开箱即用后台管理系统,支持白天黑夜主题切换,通用管理组件,
  • 开启智能未来:DeepSeek赋能行业变革之路
  • 【数据处理】Python对CMIP6数据进行插值——详细解析实现(附源码)
  • Java基础(网络编程)
  • 今日行情明日机会——20250515
  • ThreadLocal、InheritableThreadLocal、TransmittableThreadLocal 详解与使用场景
  • 初始化一个Springboot项目
  • linux libdbus使用案例
  • 双目立体视觉
  • 紫外相机工作原理及可应用范围