1嵌入式软件测试技术嵌入式软件测试技术(基础篇)(基础篇)皮永辉2012年8月2内容提要嵌入式软件测试基础所需预备知识关于软件测试嵌入式软件测试的特点¾嵌入式系统与嵌入式软件¾嵌入式软件测试的特点嵌入式软件测试的基本方法¾交叉测试¾可用于交叉测试的调试方式¾基于需求的测试¾源代码分析3嵌入式软件测试基础:预备知识本课程所需基础知识C语言¾C程序设计¾开发环境使用嵌入式软件开发基础¾嵌入式系统的组成及特点¾嵌入式软件的开发方式¾嵌入式开发环境使用软件测试基础知识¾软件测试基本概念¾软件测试基本技术4嵌入式软件测试基础:关于软件测试回顾软件测试软件测试基本概念¾定义、原则、过程、分类、模型¾测试用例、插装、打桩¾静态测试、动态测试¾白盒测试、黑盒测试¾策略与管理通过软件测试,我们要解决什么问题?¾软件功能——对不对?¾代码质量——高不高?¾测试过程——得唔得?5嵌入式软件测试基础:关于软件测试软件测试的三个基本问题软件功能——对不对?¾需求准确¾功能正确、完整¾性能可靠代码质量——高不高?¾规范(可维护、易理解)¾少缺陷¾健壮(容错、结构化)测试过程——得唔得?¾有效¾有利¾有序6嵌入式软件测试基础:关于软件测试软件测试的基本策略“两条腿走路”技术是基础¾静态测试¾动态测试管理是保障¾计划¾策略¾资源配置¾过程管理¾缺陷追踪代码质量?软件功能?测试过程?7嵌入式软件测试基础:关于软件测试软件测试的基本策略现代软件工程的测试策略测试贯穿于开发的全过程不形成专门的“测试阶段”需求定义设计编码调试系统集成需求分析用例设计静态分析单元测试集成测试8嵌入式软件测试基础:关于软件测试软件测试的基本策略测试从需求开始需求定义是软件生命的开始准确的需求是软件测试的前提质量从代码抓起软件质量的基础是“优质”的代码如何获得高质量的代码¾“预防”¾“治病”¾“强身”9嵌入式软件测试基础:关于软件测试软件测试的基本策略先静后动——先静态分析,再动态测试多数缺陷源于编程语言使用不当¾静态分析能有效地发现之静态分析能大大减轻后续测试的工作量,明显提升动态测试的效果静态分析能及早地发现问题,改正问题静态分析实施容易,操作简单由小到大——先单元测试,再集成测试单元测试完成了,集成测试才有意义10嵌入式软件测试基础:关于软件测试软件测试的基本策略测试工具选择工欲善其事,必先利其器通常工具是必需的,但不是万能的。不要期望“一招鲜,吃遍天”根据自己的需要和工具的特长进行选择¾明确自己要做什么?期望达到怎样的目标?¾测试工具的关键特性?¾其它因素o人员、资源、价格等11软件测试的基本策略加强软件测试的管理测试过程管理¾计划、进度¾测试文档管理¾需求的可追溯¾节点监控¾资源配置缺陷追踪与管理¾测试过程中,会有各式各样的错误或缺陷(bug/defect)出现。需要建立有效的机制:报告、存储、分配、修复、追踪…¾避免混乱、丢失、重复变更管理——软件配置管理嵌入式软件测试基础:关于软件测试12嵌入式软件测试基础:嵌入式软件测试的特点嵌入式系统与嵌入式软件什么是嵌入式系统¾以应用为中心、以计算机技术为基础、适应特殊环境要求的专用计算机系统¾嵌入式系统通常都是实时系统,即有一定时间约束的计算机系统嵌入式系统的组成¾嵌入式微处理器、外围硬件¾嵌入式操作系统、应用软件什么是嵌入式软件¾嵌入式系统或产品中的软件¾“非嵌入式”软件:通用计算机软件嵌入式系统的典型特征:硬件软件专用13嵌入式系统与嵌入式软件嵌入式软件的特点¾大部分软件用高级语言(C、C++等)编写¾依赖于特定硬件环境,无统一的平台¾与硬件密切相关,交互工作¾实时性o实时约束o实时控制¾交叉式开发o需要专门的环境及工具o目标软件与开发环境运行在不同的平台¾资源受限嵌入式软件测试基础:嵌入式软件测试的特点14嵌入式软件测试的难点实时性——要求测试工具准确测试软件性能资源有限——要求对被测软件不能附加太多代码冗余软硬结合——软件与硬件紧密相关,硬件可能成为测试的瓶颈交叉开发——嵌入式软件与测试工具运行在不同的平台,载入目标系统执行需要特定的硬件测试工具配套多样性——没有统一的硬件平台,需要“专款专用”实验测试环境与真实运行环境存在差异测试工具与目标系统的连接方式影响测试的可靠性汇编语言难以测试成本较高嵌入式软件测试基础:嵌入式软件测试的特点15嵌入式软件测试的基本思路软件测试发展至今已形成了较为完整的理论、技术和策略,虽然它们大都针对计算机软件,但幸运的是其基本原理和典型方法同样适用于嵌入式软件。基于两种软件的共性——同为高级语言,我们首先利用通用计算机软件的测试技术,即“拿来主义”然后从嵌入式软件的特点出发,采取一些有针对性的方法,比如“交叉测试”。嵌入式软件测试基础:嵌入式软件测试的特点16嵌入式软件测试的基本方法动态测试方法¾交叉测试¾基于需求的测试静态测试方法¾源代码分析¾结构化测试系统测试方法¾真实环境下系统测试¾全数字模拟测试¾实时在线测试¾故障注入测试嵌入式软件测试基础:嵌入式软件测试的基本方法17交叉测试(Host/Target测试)利用交叉开发环境的测试方法¾测试工具需要支持目标环境利用高级语言的特性,使用“常规的”软件测试方法测试是在“主机”和“目标系统”中分别进行的:¾与硬件无关的大部分测试在“Host”上完成¾与硬件密切相关的小部分在“Target”上完成¾再根据需要,将“Host”上的测试在“Target”上验证嵌入式软件测试基础:嵌入式软件测试的基本方法18交叉测试的特点将大部分工作转移到PC平台上,在硬件环境未建好或调试工具缺乏时就可以开展适用于高级语言,如C,C++主要用于动态测试,如单元测试(功能测试)¾测试用例设计是关键操作方便,测试成本较低。实时性受调试环境的制约目标环境中测试时要占用一定的目标资源注意目标环境和主机环境的差异¾目标编译器的影响¾内存资源嵌入式软件测试基础:嵌入式软件测试的基本方法19为什么不把所有测试都放在目标上进行在Target上测试软件,可能会造成与开发者争夺目标平台或使用时间。要避免这种矛盾只有提供更多的目标平台。目标平台可能还不可行,或者主机与目标的连接不方便。比起主机平台环境,目标平台通常是不精密的和不方便的。成本问题。提供给开发者的目标平台和开发环境通常是很昂贵的。开发和测试工作可能会妨碍目标上已经存在持续的应用。嵌入式软件测试基础:嵌入式软件测试的基本方法20如何开展交叉测试选用带有支持目标环境的软件测试工具确定哪些模块与硬件无关,哪些与硬件相关配置相应的调试环境和目标环境设计测试用例分别进行Host和Target测试嵌入式软件测试基础:嵌入式软件测试的基本方法执行编译/链接TargetHost测试结果测试结果被测代码测试用例目标支持执行编译/链接开发环境21交叉测试的条件测试工具要支持目标系统Target测试需要合适的开发环境配合¾编译环境(编译器/链接器)¾调试环境(仿真器、调试器)可用于交叉测试的调试环境嵌入式软件的调试的基本方法:模拟器(Simulator)调试器(Debugger)仿真器(Emulator)嵌入式软件测试基础:嵌入式软件测试的基本方法22模拟器(Simulator)大多数集成开发环境(IDE)都具有调试功能,“模拟器”就是其中的一种。模拟器和待调试的嵌入式软件都在主机上运行,由主机提供一个模拟的目标运行环境,可以进行“指令集”调试,包括算法和流程等。纯软件,简单方便,无需目标板,成本低功能有限,无法体现硬件特性大多数开发环境都提供Simulator功能,如ARM开发环境ADS1.2中的AXD(ARMulator)嵌入式软件测试基础:嵌入式软件测试的基本方法23调试器(Debugger)即在线调试器,有两种形式Monitor调试JTAG调试Monitor调试器主机和目标平台通过某种接口(如串口、网口、USB等)连接,主机上运行调试器,代码“下载”到目标板上运行。调试之前要在Host和Target之间建立起通信联系,目标板上需要先期烧录“监控程序(Monitor或bootloader)”纯软件,价格较低,简单,有一定的硬件调试能力制作Monitor可能成为瓶颈(需要经验,且要求目标板工作正常),调试功能、实时性有限。例如,Linux和WinCE开发环境就提供这种调试方式嵌入式软件测试基础:嵌入式软件测试的基本方法DebuggerDebuggerMonitorMonitorTarget串口串口Host24JTAG调试器基于集成在芯片上的调试接口(调试和跟踪逻辑)的一种调试方式。常见的调试接口有JTAG(边界扫描)和BDM(背景调试模式)等通过一个硬件调试体(俗称JTAG仿真器或调试器),连接主机和目标系统。¾主机端:串口、USB、网口等¾目标板:调试接口(JTAG、BDM等)调试软件运行在主机上,待调试代码则由JTAG仿真器控制,通过调试接口下载到目标板上运行。嵌入式软件测试基础:嵌入式软件测试的基本方法TargetTargetHostHost接口BDM/JTAG仿真器BDM/JTAG仿真器JTAG接口25JTAG调试器的特点软硬件结合,试用方便,无须制作Monitor,软硬件均可调试。是当今最常用的嵌入式调试方式。需要目标板,且目标板工作基本正常。适用于有调试接口的微处理器许多流行的嵌入式微处理器都支持这种方式。常见的JTAG调试器有:¾ARM系列:Trace-ICP、Probe-ICE、MAJIC、Hitex等¾MIPS系列:MAJIC¾PowerPC系列:iSystem嵌入式软件测试基础:嵌入式软件测试的基本方法26仿真器(Emulator)即传统意义上的“全仿真调试”方式。仿真器具备目标系统微处理器的全部功能,并配有必要的存储器、外设等硬件资源。使用时仿真器取代目标板微处理器,开发者就可以全盘控制和调试目标系统仿真器与目标板通过“仿真头”连接,与主机有串口、并口、网口或USB口等连接方式仿真器一般自成体系,调试时既可以连接目标板,也可以不连接目标板(Standalone)。功能强大,实时性强,软硬件均可调试价格昂贵,通用性差。一般用在低速、低位数处理器中嵌入式软件测试基础:嵌入式软件测试的基本方法27调试方式对软件测试的影响模拟器(Simulator)¾最方便,成本低,使用资源无限制¾实时性、硬件特性差调试器(debugger)¾最常用,成本较低,使用资源受目标板硬件限制¾硬件特性较好,对monitor调试器来说,测试结果输出可能受限仿真器(emulator)¾最真实,成本较高,使用资源受目标板或仿真器限制¾实时性、硬件特性好嵌入式软件测试基础:嵌入式软件测试的基本方法28基于需求的测试什么是需求(Requirement)?¾需求就是用以说明软件“是什么”的文档,即产品的“规格说明书(specification)”¾需求是软件生命周期的起点和源头¾需求定义决定了软件的功能统计表明,软件测试中超过半数的错误可以追溯到“不良”的需求或缺少需求上测试所付出的成本中,超过80%消耗在追踪需求的错误上嵌入式软件测试基础:嵌入式软件测试的基本方法Requirements56%Design27%Other10%Code7%Requirements82%Design13%Other4%Code1%29基于需求的测试没有需求,就没有真正的测试¾好的测试需要好的需求¾好的需求支撑好的测试¾准确的需求是功能测试的基础需求测试能够帮助您面对功能测试中的挑战:¾如何确保功能覆盖,即功能的完整性?¾在保证功能覆盖的前提下,如何减少测试的数量?o穷尽是不现实的o随意是不负责任的¾如何确认测试的正确性,即是由于“正确的原因”得到了“正确的结果”?o避免“歪打正着”嵌入式软件测试基础:嵌入式