草庐IT

CANoe自动化测试的配置方式总结分析(一)——CAPL编程方式

Mr.Cssust 2023-04-25 原文

文章目录

前言

一、例程功能

二、仿真EUC

三、测试模块

四、测试运行效果

五、分析和应用

总结


前言

        近期在做的一个自动化测试项目,尝试了一种以前没用过的测试配置方式,感觉效果还不错。然后又回顾了一下以前用过的其他几种方式,利用周末时间总结分享出来,希望对相关领域的网友有所帮助。

        由于实际项目比较庞大,而且不便在网络公开,所以就参考其中一项典型的测试来做一个例程,重点是讲解其中自动化测试配置的用法。

一、例程功能

        该例程的功能是测试一个ECU的CAN接收功能,要求测试工程能够自动激励仿真信号,并自动判定测试结果。这里我们用VN1630A的CAN1作为测试节点,发送下表中的激励报文,CAN2作为ECU的仿真节点,接收和解析这些报文。最终在测试模块中比对接收内容与发出的内容是否一致,给出判定结果。

IDIsStadLengthData
配置10x00140x05 0x05 0x05 0x05
配置20x10140x0A 0x0A 0x0A 0x0A
配置30x20x080x50 0x50 0x50 0x50 0x50 0x50 0x50 0x50
配置40x40x080xA0 0xA0 0xA0 0xA0 0xA0 0xA0 0xA0 0xA0

二、仿真ECU

        ECU仿真节点的创建和仿真代码如下。该节点从接收到的CAN报文中,提取ID、报文类型、DataLength和Data,暂存到中间变量,供测试模块调用。

on message CAN2.*
{
  write("ECU Received");
  @MiddleVar::ID_r = this.id;
  if(isExtId(this)) @MiddleVar::IsStad_r = 0;
  else @MiddleVar::IsStad_r = 1;
  @MiddleVar::Data_r[0] = this.byte(0);
  @MiddleVar::Length_r = this.DataLength;
  
}

三、测试模块

        测试节点的创建和编程代码如下。该模块使用纯CAPL编程的方式,自动发送已定义的激励报文,并与仿真ECU解析的接收报文相对比,自动判定测试结果。

testcase Case1()
{
  int i;
  
  write("Load Cfg");
  TestMsg.can = 1;
  TestMsg.id = 0x00;
  TestMsg.DataLength = 4;
  for(i=0;i<4;i++) TestMsg.byte(i) = 0x05;

  write("Test Start");
  output(TestMsg);
  
  if(TestWaitForMessage(0x00, 5000))
    {
      write("Judge Received");
      if(@MiddleVar::ID_r != 0x00) testCaseFail();
      if(@MiddleVar::IsStad_r != 1) testCaseFail();
      if(@MiddleVar::Data_r[0] != 0x05) testCaseFail();
      if(@MiddleVar::Length_r != 4) testCaseFail();
      testStepPass();
    }
  
  testWaitForTimeout(1000);  
  
}

testcase Case2()
{
  int i;
  
  write("Load Cfg");
  TestMsg.can = 1;
  TestMsg.id = 0x10;
  TestMsg.DataLength = 4;
  for(i=0;i<4;i++) TestMsg.byte(i) = 0x0A;

  write("Test Start");
  output(TestMsg);
  
  if(TestWaitForMessage(0x10, 5000))
    {
      write("Judge Received");
      if(@MiddleVar::ID_r != 0x10) testCaseFail();
      if(@MiddleVar::IsStad_r != 1) testCaseFail();
      if(@MiddleVar::Data_r[0] != 0x0A) testCaseFail();
      if(@MiddleVar::Length_r != 4) testCaseFail();
      testStepPass();
    }
  
  testWaitForTimeout(1000);  
  
}

testcase Case3()
{
  int i;
  
  write("Load Cfg");
  TestMsg.can = 1;
  TestMsg.id = 0x20x;
  TestMsg.DataLength = 8;
  for(i=0;i<8;i++) TestMsg.byte(i) = 0x50;

  write("Test Start");
  output(TestMsg);
  
  if(TestWaitForMessage(0x20x, 5000))
    {
      write("Judge Received");
      if(@MiddleVar::ID_r != 0x20x) testCaseFail();
      if(@MiddleVar::IsStad_r != 0) testCaseFail();
      if(@MiddleVar::Data_r[0] != 0x50) testCaseFail();
      if(@MiddleVar::Length_r != 8) testCaseFail();
      testStepPass();
    }
  
  testWaitForTimeout(1000);  
  
}

testcase Case4()
{
  int i;
  
  write("Load Cfg");
  TestMsg.can = 1;
  TestMsg.id = 0x40x;
  TestMsg.DataLength = 8;
  for(i=0;i<8;i++) TestMsg.byte(i) = 0xA0;

  write("Test Start");
  output(TestMsg);
  
  if(TestWaitForMessage(0x40x, 5000))
    {
      write("Judge Received");
      if(@MiddleVar::ID_r != 0x40x) testCaseFail();
      if(@MiddleVar::IsStad_r != 0) testCaseFail();
      if(@MiddleVar::Data_r[0] != 0xA0) testCaseFail();
      if(@MiddleVar::Length_r != 8) testCaseFail();
      testStepPass();
    }
  
  testWaitForTimeout(1000);  
  
}

四、测试运行效果

        实际测试运行的效果如下。一键执行测试模块中的四个测试配置,激励报文的发送与前面定义的报文一致。每个测试配置执行后的finished提示行是绿色,表示测试结果的判定为Pass。相反出现红色提示行时,表示Fail。

五、分析和应用

        上述纯CAPL编程实现自动化测试配置的方式,特点是各个测试参数全部使用固定写死的常量,比如CAN ID是0x10x的测试配置,直接对ID赋值0x10x即可。这种方式的优点是,实现起来相对比较简单和快捷,且编程代码一目了然不容易出错。缺点是,每个测试配置都要单独进行编程,而且每当测试配置发生变化时都要修改CAPL代码。整体而言,这种方式适合应用于临时创建的自动化测试工程,且测试配置比较少的情况。

总结

        以上就是本人在对CANoe自动化测试配置方式进行总结分析时,首先讲解的第一种实现方式。主要讲解了例程的功能和框架,展示了实现该方式的详细代码和实际运行效果,最后分析了这种配置方式的特点以及适用场景。

        后续还会更新另外几种CANoe自动化测试配置的实现方式,欢迎评论区留言、点赞、收藏和关注,这些鼓励都将成为笔者持续分享的动力。

        另外,上述例程使用的Demo工程可以到笔者的主页查找和下载。


        版权声明:原创文章,转载和引用请注明出处与链接,侵权必究!

有关CANoe自动化测试的配置方式总结分析(一)——CAPL编程方式的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  3. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  4. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  5. ruby-on-rails - 正确的 Rails 2.1 做事方式 - 2

    question的一些答案关于redirect_to让我想到了其他一些问题。基本上,我正在使用Rails2.1编写博客应用程序。我一直在尝试自己完成大部分工作(因为我对Rails有所了解),但在需要时会引用Internet上的教程和引用资料。我设法让一个简单的博客正常运行,然后我尝试添加评论。靠我自己,我设法让它进入了可以从script/console添加评论的阶段,但我无法让表单正常工作。我遵循的其中一个教程建议在帖子Controller中创建一个“评论”操作,以添加评论。我的问题是:这是“标准”方式吗?我的另一个问题的答案之一似乎暗示应该有一个CommentsController参

  6. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  7. ruby-on-rails - 从应用程序中自定义文件夹内的命名空间自动加载 - 2

    我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty

  8. ruby - 鸭子输入字符串、符号和数组的优雅方式? - 2

    这是针对我无法破坏的现有公共(public)API,但我确实希望对其进行扩展。目前,该方法采用字符串或符号或任何其他在作为第一个参数传递给send时有意义的内容我想添加发送字符串、符号等列表的功能。我可以只使用is_a吗?数组,但还有其他发送列表的方法,这不是很像ruby​​。我将调用列表中的map,所以第一个倾向是使用respond_to?:map。但是字符串也会响应:map,所以这行不通。 最佳答案 如何将它们全部视为数组?String的行为与仅包含String的Array相同:deffoo(obj,arg)[*arg].eac

  9. ruby-on-rails - 有没有一种工具可以在编码时自动保存对文件的增量更改? - 2

    我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功

  10. ruby - 如何以编程方式删除实例上的 "singleton information"以使其编码(marshal)? - 2

    我创建了一个由于“在运行时执行的单例元类定义”而无法编码的对象(这段代码的描述是否正确?)。这是通过以下代码执行的:#defineclassXthatmyusesingletonclassmetaprogrammingfeatures#throughcallofmethod:break_marshalling!classXdefbreak_marshalling!meta_class=class我该怎么做才能使对象编码正确?是否可以从对象instance_of_x的classX中“移除”单例组件?我真的需要一个建议,因为我们的一些对象需要通过Marshal.dump序列化机制进行缓存。

随机推荐