CAPL编程系列_04

发布于:2025-05-17 ⋅ 阅读:(11) ⋅ 点赞:(0)

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-雨刮器控制 TC001 HU给BCM发送雨刮器低速刮请求

1、BCM 上电

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

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

1、BCM 上电

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

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

        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 ")
}



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


网站公告

今日签到

点亮在社区的每一天
去签到