草庐IT

嵌入式软件测试的小结

乐却思蜀 2023-03-28 原文

 

 

 

 

 

 

 

 

 

 

 

 

 

 

文章内容为本人这三年来在嵌入式软件测试(黑盒)上的一些积累吧,说起来也挺快的,毕业三年的时间就这样过去了,在两家公司工作过(现在这家是第二家),这几年的测试项目基本都是围绕着嵌入式软件,同时需要兼顾测试App端、Web端功能、Web后端接口(Postman),只是测试业务重心还是在嵌入式软件上。

为什么测试的这么杂呢,其实这些全部加起来只是一个产品,只是因为目前就只有我一个测试,所以整套系统都是由我一个人来测。

就拿我现在这家公司做的一个视频会议系统来说吧,整套系统包含有硬终端(Linux端)、App端、Web端(用于后台账户/会议管理等)、PC端组成。

接触过嵌入式软件测试的同学应该都明白这些事,下面我就来说说自己这几年对嵌入式软件测试的理解和看法吧,欢迎留言补充或讨论,勿喷喔~

什么是嵌入式系统?

嵌入式系统是一种“完全嵌入受控器件内部,为特定应用而设计的专用计算机系统”。

嵌入式系统是“用于控制,监视或辅助操作机器和设备的装置”。

嵌入式系统还可以定义为“以应用为中心,以计算机技术为基础,软硬件可裁剪,功能、可靠性、成本、体积、功耗要求严格的专用计算机系统。”

嵌入式系统由嵌入式硬件和嵌入式软件两部分组成,硬件是支撑,软件是灵魂。
嵌入式系统按实时性分类,可分为非实时性,软实时性和硬实时性。
其中硬实时性是指系统对响应时间有严格要求,如果响应时间不能满足,就要引起系统崩溃或致命错误;软实时性是指系统对响应时间有要求,但是如果系统响应时间不能满足,不会导致系统出现致命的错误或崩溃。

什么是嵌入式软件?

嵌入式软件是基于嵌入式系统设计的软件,它是计算机软件的一种,同样由程序及其文档组成,可分为操作系统,支撑软件,应用软件三大类,是嵌入式系统的重要组成部分。

说通俗易懂一点就是一套安装在带有linux系统的PCB板子上的软件。像这样:

嵌入式软件的特征

  • 系统内核小
  • 专用性强
  • 系统精简
  • 高实时性操作系统
  • 基于硬件和软件的相辅相成
  • 与商用软件测试异同点

此文单从黑盒测试的角度来讲。

相同点

嵌入式软件测试和商用软件测试的目的和原则是相同的,都是为了找Bug、跟踪Bug、验证Bug,使产品实现需求文档上功能,满足用户需求。

不同点

需要的测试环境不同。

测试嵌入式软件的时候,你需要准备的环境是一整套设备,里面可能包含电源、网线、高清线(各种视频传输线)、交换机、摄像头、麦克风、U盘、路由器等等。

测试商用软件可能就是一个安装包,或者是一个测试URL,你需要准备的可能就是一个电脑或者一部手机。
 
测试的思维不同(要做到出现问题先自检)。
 
这里的测试思维并不是说设计测试用例时需要的思维方式,而是在定位Bug的时候,思维不一样。
 
在测试嵌入式软件的时候,如果出现某个功能无法实现,有可能是确实是功能实现问题,有可能是内存问题,有可能是硬件支持问题,有可能是驱动问题,有可能是网络问题,有可能是硬件物理接口问题。
 
虽然看似这些问题与我无关,但是如果是硬件支持的问题,你抛出Bug,开发排查完之后发现是你自己没有按照规格接入所能支持的硬件,到时候尴尬的是不是你?
 
再比如POE网口如果没有接入支持POE的网线,造成问题是不是你的不专业了等等,我们既然是测试工程师,那就应该要有工程师的专业程度来完成工作。
 
在测试商用软件的时候,遇到功能无法实现,我们大部分情况下就是直接抛出Bug给开发,附带Bug截图、log和操作步骤,通常都好使。 
如果对python自动化测试、web自动化、接口自动化、移动端自动化、面试经验交流等等感兴趣的测试人,可以 点我进测试行业圈,里面有我们收集的配套教程和相关技术文档提供给自学的伙伴…

需要的技能点不同

根据这几年的测试项目经验,发现嵌入式软件测试对计算机网络原理的应用比较频繁。

在测试嵌入式软件的时候,你要接入网线、进行网络配置、接入交换机、了解网络通信、数据传输等等……

也就是说嵌入式软件测试你需要的是(扎实的软件测试理论和测试方法+计算机网络相关基础知识)。

而测试商用软件的时候,由于环境搭建没有太复杂,涉及到计算机网络相关的知识比较少,需要的往往是扎实的软件测试理论和测试方法。

嵌入式软件测试的自身特点和测试困难:

  • 目前系统资源有限
  • 与硬件系统紧密关联
  • 运行平台多样化
  • 交叉式的测试模式
  • 系统的安全性、可靠性、系统运行结果的正确性等

嵌入式软件的测试策略与一般的商用软件有很大的区别。

有人可能会问嵌入式软件测试难吗?跟商用软件测试相比哪个难度更高?

我感觉在黑盒测试中,嵌入式软件测试是要比商用软件测试难度高的,我只站在嵌入式软件的黑盒测试角度来发言。为什么这么说呢,我暂时只想到以下几点:

硬件平台不同导致测试难度增大,由于嵌入式软件是跟硬件平台紧密关联的,也就是说同一套软件,如果移植到另一个平台上,就要从头到尾的测试一遍,在工作量上就比商用软件大,出错几率也会提升,相应的测试难度也会提高一点。我就遇到一个项目需要跑在两个平台的情况。

测试环境导致测试难度增大,我可以很肯定的说,同一套设备在A环境操作正常,我只要换一个交换机,搭建一个B环境,就很有可能会出现Bug,所以有经验的嵌入式软件测试同学在遇到客诉的Bug时第一时间都是问当时的环境是什么,设备有哪些,操作步骤是什么?必要时采取将设备全部寄回来复现。

硬件平台性能导致测试难度增大,硬件平台的芯片性能是肯定没有电脑上的CPU这么吊的,所以在测试的时候,我们往往会出现一些硬件性能上的问题导致一些Bug偶现,这对我们测试人员来说,想要找到一个偶现的Bug是非常的难,需要采取工具来跟踪操作步骤打印log。

外接设备导致测试难度增大,生活中基本上的嵌入式软件都是需要外接其他的设备的,比如接入U盘、摄像头、麦克风等等,在测试时如果发现某个工作无法实现,我们需要从三个方面去考虑:

1、是不是软件的功能Bug;

2、是不是硬件物理接口损坏问题;

3、是不是接入的外设与软件协议有问题或者驱动有问题等等原因增加了测试难度。

最后一个导致测试难度大的原因就是嵌入式软件测试相对来说是比较独立于软件测试的,相关的资料也是比较少的,并不像商用软件测试一样,只要一搜索,就能找到测试方法和一些测试文章。嵌入式软件测试更多的是一个实战,每一个应用场所的嵌入式软件测试的思维方式不一样。

如果对python自动化测试、web自动化、接口自动化、移动端自动化、面试经验交流等等感兴趣的测试人,可以 点我进测试行业圈,里面有我们收集的配套教程和相关技术文档提供给自学的伙伴…

结尾

测试也是一个有技术难度的岗位,需要不断的积累经验,老手测试和新手测试最大的不同就是老手测试可以很快的定位和发现Bug,老手测试可以有更多的测试方法和测试策略去找到Bug,有更好的测试管理经验和业务能力。

祝各位同学在测试的道路上越来越好,一起加油!

有关嵌入式软件测试的小结的更多相关文章

  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 - 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

  5. 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/

  6. 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

  7. 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

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

  9. ruby-on-rails - Cucumber 是否只是 rspec 的包装器以帮助将测试组织成功能? - 2

    只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您

  10. ruby-on-rails - 如何调试 cucumber 测试? - 2

    我有:When/^(?:|I)follow"([^"]*)"(?:within"([^"]*)")?$/do|link,selector|with_scope(selector)doclick_link(link)endend我打电话的地方:Background:GivenIamanexistingadminuserWhenIfollow"CLIENTS"我的HTML是这样的:CLIENTS我一直收到这个错误:.F-.F--U-----U(::)failedsteps(::)nolinkwithtitle,idortext'CLIENTS'found(Capybara::Element

随机推荐