草庐IT

汽车OTA自动化测试解决方案

东舟技术 2024-03-08 原文

随着 5G 等无线通信技术的快速发展,汽车行业与无线通信技术进一步融合,正快速推动着汽车智能化的发展进程,而OTA技术则是汽车智能化的标志之一,OTA升级持续给客户提供新的功能,不断增强用户体验。同时也可以修复用户反馈的软件问题,增强制造商的售后服务体验。

目前OTA远程升级技术已成为众多汽车制造商的标配。由于OTA升级可能会带来潜在的风险(特别是包含ECU固件更新的FOTA升级),针对OTA系统的测试过程就尤为重要。

汽车OTA测试内容 Vehicle OTA test content

1) 人机交互测试(OTA功能测试)

1、OTA后台管理操作(与TSP交互)

OTA后台管理操作主要负责OTA包的上传、OTA升级策略制定,包含后台登录、车型选择、车辆VIN号确认、OTA发布等。

2、OTA升级前资源预置

在OTA升级之前,需先将车机刷为初始版本(OTA升级之前的版本),之后会进行资源预置(例如安装常用的App、复制音视频文件、输入聊天记录),目的是检查OTA升级之后现场是否会发生变化(已安装的App或者聊天记录是否会丢失)。

3、执行OTA升级操作

测试工程师会分三种方式执行下载任务(中控屏下载、手机端下载、定时下载操作),将服务端的OTA升级包下载到车机,下载完成后系统提示测试工程师进行安装包的升级,如果满足升级条件则进入升级包安装过程,安装完成后测试工程师会检查版本号信息,以判断是否升级到最新版本,并同时检查之前安装的App和聊天记录是否有丢失的现象,以此判断本次升级是否成功。

4、异常场景下相关功能测试

OTA过程中的异常场景可能导致系统崩溃,OTA测试需要模拟这些场景并验证该场景下系统是否做了规避处理,这些异常场景包含断点续传(掉电、通信中断或网络变差引起的下载中断)、下载失败/重试以及升级失败回滚到之前的系统版本等。

2) 软件可靠性及压力测试

1、OTA升级前置条件测试

安全性是汽车设计首要考虑的需求,OTA升级对各控制器系统进行更新,势必影响车辆状况,同时升级失败会导致车辆系统无法运行,确保升级的安全是各车辆系统设计的重中之重,因此在执行OTA包安装之前系统会对当前的车辆状况进行检查,一些特定的车辆状况下不允许进行OTA升级,例如汽车正在充电中、汽车电量不足等状况。测试工程师需要模拟上述前置条件,验证上述前置条件下系统是否会拒绝安装OTA包,以最大程度确保了升级过程的安全。

2、OTA升级成功率测试

OTA升级面向大量的汽车用户,为了确保安全需要测试多辆车升级的成功率,在正式发布OTA之前需要进行对多辆车进行多次OTA下载、安装过程的重复测试,以验证本次OTA升级的失败概率,提前发现一些随机潜在的风险,避免大规模OTA升级过程中出现问题。

3、多终端OTA下载的压力测试

支持OTA功能的车型越来越多,较多车辆可能会同时进行OTA下载操作,同时也考虑静默升级模式下OTA下载的场景,检验多终端同时下载OTA包场景下对服务器的影响,避免出现大规模升级时出现异常状况。

3) 各控制器功能、性能测试

OTA升级是对各控制器系统进行更新,表现可能是新增功能、系统性能优化、系统bug修改等,测试工程师除了要验证修改的点之外,还要检查是否引起新问题,特别是变化较大的模块,测试工程师需要根据OTA升级的内容制定相应控制器的测试策略。

人工OTA测试的痛点 Pain points of manual OTA test

1、OTA升级测试的一些特殊工况难以实现,这些工况涉及到不允许升级的前置条件、不同的网络环境等,往往很多制造商缺乏这方面的测试流程而带来一些潜在风险。

2、手动测试OTA过程繁琐,涉及多模块协同、多链路切换,不仅仅涉及TSP端操作,还涉及到手机与车机间操作;不仅涉及无线蜂窝网环境,也有无线WiFi环境以及局域网链路等。在上述环境下人工切换效率非常低。

3、车型多、版本多,人工测试工作量大、成本高、效率低,极大影响OTA发布进度。

如何应对OTA测试的挑战 How to deal with the challenges of OTA testing

1、通过仿真系统模拟不同的升级环境,实现对复杂环境的仿真,在试验环境中模拟实车的各种业务场景。

2、通过自动化测试系统全程控制整体测试方案,不需要人工参与,通过程序自动调用各个模块完成整个测试过程。

东舟OTA测试解决方案 Dongzhou OTA test solution

东舟OTA测试方案由人机交互系统、仿真系统、断言系统、自动化软件系统、TSP交互系统(OTA后台自动化管理)以及被测系统(各域控制器以及交互屏幕构成)构成。

1、人机交互系统(执行系统)

通过HMI机械手和ADB的方式实现与车机、手机的交互操作,模拟人工对测试过程的操作,实现单击、双击、滑动等,24小时不间断测试,提升测试效率,缩短测试周期。

2、仿真系统

仿真系统可模拟各种测试环境和工况,特别是针对人工测试难以实现的环境(如OTA安装的前置条件以及各种网络环境等)。

3、断言系统

提供图像、文字、声音以及报文等多种断言方式,自研图像算法,不受光线和角度影响,各种断言方式覆盖所有测试场景,确保对测试结果断言的准确性。

4、被测系统

由车机、屏幕和各种控制器组成,集成到台架上,通过CAN总线、ETH总线、LIN总线等连接在一起。

5、TSP自动化交互系统
TSP自动交互系统实现对OTA后台的操作管理,包含自动登录、升级策略确认、车辆选择、车辆VIN号确认等。

6、自动化软件测试系统(上位机)

东舟自研自动化测试系统,对整个测试过程进行控制,实现对测试过程的管理和执行。

东舟OTA测试方案的优势 Advantages of Dongzhou OTA test scheme

1、OTA自动化测试系统模块化设计,系统形态多样,可根据用户需求适配不同的自动化测试方案,目前有实车OTA专项、实验室UI交互专项和整车测试OTA方案。

2、图形化用例编写,编写过程简单,可读性强,无需编程基础亦可快速上手。

3、采用机械手模拟人机交互过程,最大程度还原用户与被测设备交互过程,确保了测试的准确性。

4、自研图像算法,不受光线以及角度的影响,确保了图像断言方式的准确性和稳定性。

5、自动化软件测试系统根据客户需求通过测试任务分发,自动执行测试过程,实现后台管理、升级过程以及升级后各模块测试的完全自动化,大大缩短测试周期。

 

有关汽车OTA自动化测试解决方案的更多相关文章

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

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

  2. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  3. ruby - Ruby 的 Hash 在比较键时使用哪种相等性测试? - 2

    我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。

  4. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  5. ruby - RSpec - 使用测试替身作为 block 参数 - 2

    我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere

  6. ruby - Sinatra:运行 rspec 测试时记录噪音 - 2

    Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/

  7. ruby-on-rails - 迷你测试错误 : "NameError: uninitialized constant" - 2

    我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test

  8. 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("

  9. ruby - 即使失败也继续进行多主机测试 - 2

    我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r

  10. ruby-on-rails - 如何使辅助方法在 Rails 集成测试中可用? - 2

    我在app/helpers/sessions_helper.rb中有一个帮助程序文件,其中包含一个方法my_preference,它返回当前登录用户的首选项。我想在集成测试中访问该方法。例如,这样我就可以在测试中使用getuser_path(my_preference)。在其他帖子中,我读到这可以通过在测试文件中包含requiresessions_helper来实现,但我仍然收到错误NameError:undefinedlocalvariableormethod'my_preference'.我做错了什么?require'test_helper'require'sessions_hel

随机推荐