这里讨论的嵌入式软件测试是系统测试的概念,是结合要开发的软件系统(包括嵌入式操作系统和嵌入式应用软件)、硬件系统以及其他相关因素(如人员操作、数据采集等)对整个产品进行的综合测试。嵌入式系统的系统测试比PC系统软件测试难度大得多,主要体现在以下几个方面:
测试软件功能依赖硬件功能,不需要编码,难以快速定位软硬件错误;健壮性测试、可知性测试难以通过编码实现;跨测试平台的测试用例和测试结果上传困难;基于消息的系统测试的复杂性包括线程、任务、子系统之间的交互、并发、容错、时间要求等;性能测试、性能瓶颈识别困难;测试自动化技术难以实现。
嵌入式软件测试与传统软件测试的异同

与其他软件相比,嵌入式软件具有专业性,只能在需求所规定的硬件平台上执行。另外,嵌入式软件的开发环境和运行环境是不一致的,因此,即使在宿主环境中测试充分,也不能说软件在目标环境中运行时不会出现问题。因此,嵌入式软件还面临着目标环境的测试。这不仅增加了测试的成本,而且带来了嵌入式软件测试策略的问题,即哪些测试分配给宿主环境,哪些测试分配给目标环境(胡俊儒,2007)。
因此嵌入式软件测试比一般的软件测试更有必要,也更困难。
嵌入式软件测试与通用软件测试的相似之处
传统的软件测试是对软件进行不同层次的测试,包括模块测试(或单元测试)、集成测试、系统测试等。
嵌入式软件测试与通用软件测试有很多相似的问题和相似的解决方案,这才是我们所寻找的通用的嵌入式软件测试方法。
根据阶段不同,可分为单元测试、集成测试、系统测试和确认测试。
单元测试:完成软件设计最小单元的验证,只有在此基础上才能保证后续测试工作的顺利进行。白盒测试技术主要用来保证单元的最大覆盖率,发现编码和详细设计中的错误。单元测试一般可以在主机环境中运行。嵌入式测试系统一般分为以下几个单元:预处理及词法分析单元、存根单元、测试信息分析及显示单元、测试用例单元。
集成测试:就是把通过单元测试的模块按照软件结构组合成一个系统或子系统进行综合测试。主要用于发现程序架构和系统设计中的错误。虽然白盒测试可以保证大部分路径覆盖,但是黑盒测试在集成测试中还是比较常见的。集成测试一般在主机环境中进行。
系统测试:系统测试软件系统与其他资源(硬件、人机交互信息资源和数据库等)整合成一个完整的计算机应用系统进行测试。用于确保整个系统的性能、执行强度、安全性和功能符合我们的要求。因此,在这个阶段需要与硬件相结合,即用目标板、在目标环境中进行测试。确认测试:是将软件系统视为单一执行实体的需求有效性测试。其目的是验证我们的软件是否满足所有的功能、行为和执行要求。这部分主要使用黑盒测试。
根据测试时被测试程序是否运行,软件测试技术也可以分为静态测试方法和动态测试方法。
静态测试方法的主要特点是不运行被测程序,主要通过检查、技术评审和代码静态分析来检查被测软件的错误。对于嵌入式软件,这种测试只需要在主机上进行。动态测试方法是在相对真实的环境中运行被测代码,从多个角度观察程序运行时所能体现的功能、行为、结构等,从中发现错误。它分为白盒测试方法和黑盒测试方法。对于嵌入式软件,为保证测试的真实性,一般要求在目标环境中进行。
根据测试是否针对系统的内部结构和逻辑处理过程,通常可以分为:白盒测试和黑盒测试。
黑盒测试又称功能测试、数据驱动测试或基于规范的测试,它必须依靠能够反映这种关系和程序功能的需求规范来考虑测试用例,推断测试结果的正确性,即只能依据程序的外部特性来进行。因此,黑盒测试是从用户角度进行的测试。黑盒测试方法包括等价类划分、边界值分析、因果图、正交设计等基于软件功能的测试技术。在进行嵌入式软件黑盒测试时,应以系统的预期用途作为重要依据,根据需求中对负载、时序、性能等的要求来判断软件是否满足这些要求。为了保证测试正确,还需要检查与硬件的接口。嵌入式软件黑盒测试的一个重要方面是极限测试。在使用环境中,通常要求嵌入式软件的故障过程是平稳的,因此黑盒测试不仅要检查软件的工作过程,还要检查软件的故障过程。
白盒测试又称结构测试、逻辑驱动测试或基于程序的测试。采用这种测试方法,测试人员可以看到被测试的源程序,分析程序的内部结构,并根据其内部结构设计测试用例。此时,测试人员可以完全忽略程序的功能。白盒测试方法还包括基于软件内部结构的测试技术,如逻辑覆盖、符号测试、路径分析、程序插入和程序变异等。白盒测试与代码覆盖率密切相关,测试的代码覆盖率可以在白盒测试的同时计算出来,以保证测试的充分性。由于严格的安全性和可靠性要求,嵌入式软件测试通常要求比非嵌入式软件测试更高的代码覆盖率。在软件工程测试中有一个非常实用的覆盖标准,即当语句覆盖率为100%、分支覆盖率≥85%时,测试被认为是理想的,可以发现近90%的软件错误,并且时间和空间消耗是允许的。日本日立公司和美国空军都采用此标准。 对于嵌入式软件来说,白盒测试一般不需要在目标硬件上进行,比较实用的方式是在开发环境中通过硬件模拟来进行,因此所选的测试工具应该支持在主机环境中进行测试。
嵌入式软件测试强调白盒测试,一般的白盒测试包括语句覆盖、分支覆盖、条件覆盖。
嵌入式系统软件的独特之处
由于嵌入式系统具有实时性强、内存有限、I/O通道少、开发工具价格昂贵且与硬件关系密切、CPU种类繁多等特点,不同的嵌入式系统必然有不同的测试方法。下面介绍在测试不同的嵌入式产品时应特别注意的几个问题。
一个系统——“一次性”开发
有些系统,例如卫星,一旦发射就无法维护。这类系统是“独特系统”,即一次性建造。
自治系统
一些嵌入式系统可以无限期地自主运行,执行运行后不需要人工干预或交互的任务。
硬件限制
硬件资源的限制对嵌入式软件施加了某些约束,例如内存使用和功耗。有时特定硬件还依赖于软件中的时序解决方案。这些对软件的限制不会影响所需的系统功能,但它们是系统运行的首要条件,需要进行大量深入和技术测试。51Testing 软件测试网 (P8/,U&^&p H+H
硬实时行为
“实时”的本质是输入或输出能够在发生的瞬间影响系统的行为。
控制系统
控制系统通过连续反馈机制与环境交互:系统的输出影响环境,进而影响控制的行为。
重视安全系统
当嵌入式系统的故障会对人体健康造成严重危害(甚至更为可怕的后果)时,该系统就被称为“安全关键”的。大量嵌入式系统与人体有直接的物理接触,故障会直接造成物理损坏,例如航空电子设备、医疗设备、核反应堆等。对这类系统进行风险分析极其重要,需要采用严格的技术来分析和提高系统的可靠性。
极端环境条件
有些系统需要在极端环境条件下持续运行,例如极热或极冷、机械振动、化学物质或放射性。测试这些系统需要特殊设备来提供极端条件。当在真实环境中进行测试太危险时,需要设备来模拟环境。
嵌入式软件集成测试注意事项
嵌入式软件集成测试不仅要求软件行为的正确性,而且要求与其控制的硬件设备正确交互。具体的测试过程可能包括以下几个方面的测试(胡逸飞,2007)
任务测试:首先对系统中的每个任务进行独立测试,并针对每个任务设计白盒和黑盒测试用例。任务测试可以发现任务中的逻辑错误和功能错误,但无法发现实时性错误和行为错误;行为测试:利用CASE工具创建的软件模型模拟实时系统,根据外部事件(如中断、控制信号、数据)的发生顺序检查其行为的正确性。可以先对每个事件进行独立测试,然后将事件随机输入到系统中,检查系统行为的正确性;
任务间测试:独立任务测试完成后,可以联合使用多个任务来测试与时间相关的错误。通过测试不同数据速率和处理负载的任务间通信来测试错误,以确定任务之间是否会发生同步;此外,还测试通过消息队列和数据存储进行通信的任务,以发现这些数据存储区域大小的错误。
集成测试:将软件和硬件集成在一起,检测软件与硬件之间的接口错误,同时测试中断处理是否存在错误,包括中断优先级是否分配正确,中断处理是否正确,中断处理是否满足时间要求,当出现多个中断时系统的功能和性能是否存在问题等。