01.覆盖率测试概念
“测试”在百度百科中的注释为:具有试验性质的测量,即测量和试验的综合。如今人们在提到“测试”时,通常指代的是软件测试(Software Testing),而本文着墨对象则为嵌入式系统测试(Embedded Testing)。嵌入式系统测试,特指对嵌入式系统中的软件部分进行测试,与软件测试有所不同。
1.1. 嵌入式系统的具体定义
IEEE(国际电机工程师协会):嵌入式系统是“控制、监视或者辅助装置、机器和设备运行的装置的简称”(Devices used to control, monitor, or assist the operation of equipment, machinery or plants)。
国内普遍认同的定义:以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统多功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。通常嵌入式系统对可靠性的要求比较高。
了解两种定义后,不难看出嵌入式系统是软件和硬件的综合体。
1.2. 嵌入式系统的软件部分
嵌入式软件通常包括嵌入式系统软件(操作系统、启动程序、中间件)和嵌入式应用软件,作为嵌入式系统的重要组成部分,其字面定义为“嵌入在硬件中的操作系统和开发工具”,如数字电视的中间件软件、洗衣机的自动控制软件、汽车的自动泊车辅助软件等。只有软件部分准确无误,嵌入式系统的功能才能被安全、准确地使用

嵌入式软件通常具有专用性(一个嵌入式软件只进行特定的一项或几项工作)、实时性(运行时间受严格限制)、内存容量较小等特点。时至今日,嵌入式设备逐渐开始向物联网转变,所带来的安全隐患也更令人担忧。若嵌入式软件安全性出现问题,因其应用场景的特殊性,很有可能会带来灾难性的后果,造成重大的生命、财产损失。因此,嵌入式软件对可靠性与安全性的要求通常会高于普通软件,对测试的要求也更高更精细。
为迎合当前软件开发和实践逐渐向敏捷(Agile)和DevOps发展的趋势,本文将讨论如何将之应用于嵌入式软件开发和测试。
02.敏捷、DevOps及其价值
敏捷
敏捷,又称敏捷开发,指以用户的需求进化为核心,采用迭代、循序渐进的方法进行软件开发。在敏捷开发中,开发者在软件构建初期就将项目整体分为多个子项目,并对每个子项目的成果都进行测试,使之具备可视、可集成和可运行使用的特征。
DevOps
DevOps是一组过程、方法与系统的统称,用于促进开发、运维和质量保障部门之间的沟通、协作与整合。(点击查看更多DevOps相关内容)

▲敏捷和DevOps分别对应不同阶段
纵观过往可以发现,物联网设备制造商的新产品发布周期通常为2-3年,但其软件更新则非常频繁。产品发布首年软件可能会更新3-4次,频繁者甚至每月都会定期更新。但发布后时间一长,由于软件开发和测试成本过高,更新便会停滞不前,设备也会随之变得陈旧。
如何保证更新质量,提升产品生命周期,从而提升产品销量、提高品牌信任度呢?采用敏捷和DevOps是个不错的选择。
03.如何应用敏捷和DevOps?
敏捷通过流程管理手段,应用一些理论框架(比如Scrum、Kanban),主要解决业务部门和开发部门之间的矛盾点,让双方能够进行快速沟通,达成高效协作。而DevOps主要通过一些工程实践方法,结合自动化工具,解决开发、测试、运维部门之间的矛盾,使产品功能能够快速、稳定的上线运行。
具体应如何执行?
(1) 充分了解项目构成与开发、测试的步骤,尽可能独立测试每一组件。
(2) 尽量对不同组件进行独立发布,耦合度越高的组件越容易产生影响整体发布进度的问题。
(3) 先进行单元测试、完整组件测试,确保接口经过完全测试,为集成测试做好准备。
尽管上述步骤可以确保集成测试顺利进行,但仍然存在一些困难:某些功能需要多个组件汇总后才能被公开和正确地测试,如果没有合适的测试工具,该项工作的难度是巨大的——嵌入式设备通常隶属于某一特定领域,需要的测试工具垂直性较强。
04.嵌入式系统测试的难度
(1) 嵌入式系统经过大量优化,通常运行的内存较小,随着系统复杂度越来越高,后期更新系统软件的某一部分时,但凡出现任何差错,都可能对其他部分产生无法预计的后果。
(2) 嵌入式系统的复杂度导致测试人员很难通过运行简单的测试代码来调试系统,而附加调试器则会改变软件的运行方式。
(3) Bug复现异常困难,但只有对其进行稳定复现,才能正确地对问题进行定位、解决及验证。
为解决上述困难中出现的问题,开发团队应避免将功能测试放到开发和测试周期的最后阶段,而应该将其贯穿于整个项目周期并频繁而彻底地执行,仔细跟踪每次构建更新后的系统性能指标,避免新代码与功能增加造成的性能下降。
尽可能独立测试每个组件也同样重要。这不仅仅需要测试人员进行独立测试工作,更需要设计、运维人员协同合作,使用敏捷和DevOps方法,能够减少组件之间的依赖关系,以便定期、可预测地进行软件发布,使发布节奏适应每个组件的特性,也能透明化发布节点、发布内容,提升团队内部协调性。
SkyEye,中文全称天目全数字实时仿真软件,是基于可视化建模的硬件行为级仿真平台,集合了自动化测试功能,在自动化测试完成后还可生成测试报告。嵌入式代码无需烧写到设备中即可通过SkyEye在PC机上运行。同时,SkyEye还可提供命令行工具的控制仿真,可以集成到持续集成工作流中,助力DevOps实践。
参考链接
https://www.devopsonline.co.uk/applying-devops-and-agile-to-embedded-testing/
原文链接:https://mp.weixin.qq.com/s/rla6dY4JwaUpjyZ9ibwEKw
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的: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?并散列所有无济于事。
我有一些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
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/
我遵循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
我已经构建了一些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
我在app/helpers/sessions_helper.rb中有一个帮助程序文件,其中包含一个方法my_preference,它返回当前登录用户的首选项。我想在集成测试中访问该方法。例如,这样我就可以在测试中使用getuser_path(my_preference)。在其他帖子中,我读到这可以通过在测试文件中包含requiresessions_helper来实现,但我仍然收到错误NameError:undefinedlocalvariableormethod'my_preference'.我做错了什么?require'test_helper'require'sessions_hel
只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您
我有: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