摘要:随着计算机技术的普及,软件系统已经深入到生活的各个方面,从普通的计算机软件,到银行或超市的终端系统,甚至到手机的软件系统。对软件的质量要求也在不断提高,软件测试及其技术也有了飞速发展。在对软件测试技术相关基本概念研究解析的基础上,分析软件测试起源与发展,保证软件产品的质量、提高产品的可靠性。对于嵌入式软件系统,因其多样性,基于操作系统,使用的开发环境,微控制器都是日益繁多的,所以嵌入式软件测试与普通软件测试相比有其自身的特点。
关键字:软件测试;嵌入式测试;软件质量
1、引言
嵌入式软件的开发和测试也就与普通软件的开发和测试策略有了很大的不同,嵌入式软件系统是一种针对特殊任务、特殊环境而进行特殊设计的定制产品,有其专门的开发环境、软硬件紧密结合、严格的实时要求等特点。使得嵌入式软件测试与普通软件测试虽有相似之处,但有也有其自身独特的特点。
2、软件测试和嵌入式软件测试
2.1 软件测试的定义及目的
软件测试,即Software Testing。软件测试的定义有很多,在1979年出版的一本经典著作《软件测试艺术》(The art of software testing)中,GLEMFORD
J.MYERS曾经对软件测试下过如下定义:软件测试就是为了发现错误而执行程序或系统的过程。虽然它不太完善,但放在当时的情况下是可以说的通的。
随着计算机和软件技术的发展,软件应用的复杂性和规模的不断扩大,软件测试技术的研究也取得了很大的突破。早期的定义已经不适用了,许多专家对软件测试提出了各种各样的定义。综合起来,我们可以定义“软件测试是由一个程序的行为在有限测试用例集合上,针对期望的行为的动态验证组成,测试用例是从通常的无限执行域中适当选取的”。
长期以来对软件测试存在着两种不同的认识。一种观点认为,软件软件测试的目的是证明 软件的正确性;而另一种观点则认为,软件测试的目的是尽可能寻找软件中隐藏的错误和缺陷。
2.2 软件测试的特点
1)大多数硬件实验失败的方式和方法是固定的,而软件测试失败则是毫无规律的,探索所有软件测试失败的模式是不可能的。
2)软件方面的许多缺陷都源于设计和实现上的错误,而不是源于生产制造方面的缺陷。
3)软件质量保证的关键在于我们如何让避免产生错误和消除已经产生的错误,是程序中的错误密度达到尽可能低的程度。
4)软件测试是一个动态的执行过程,体现在输入、行为和行为的输出结果上。
5)软件测试是一个有限的集合。
2.3 嵌入式软件测试的定义及目的
嵌入式软件是一种比较特出的软件,软件经过分析,设计,编码后只有烧入硬件环境中才可以看见,比如数字电视的中间件软件,洗衣机的自动控制软件,手机游戏软件等等。嵌入式软件测试/嵌入式测试或叫交叉测试(cross-test)的目的与普通软件测试是相同的,都是为了发现软件缺陷,而后修正缺陷以提高软件的可靠性。嵌入式系统安全性的失效可能会导致灾难性的后果,即使非安全性失效,由于其应用场合特殊也会导致重大经济损失。因此,往往嵌入式软件对可靠性的要求比普通软件高。这就要求对嵌入式软件进行严格的测试、确认和验证,以提高产品的可靠性。
2.4 嵌入式软件测试的特点
嵌入式软件测试与普通软件测试相比,有其自身的特点:
嵌入式软件测试是在特定的硬件环境下才能运行的软件。
嵌入式软件测试除了要保证嵌入式软件在特定环境下运行的高可靠性,还要保证嵌入式软件系统的实时性。
嵌入式软件产品为了满足高可靠性的要求,不允许内存在运行时有泄漏等情况发生,因此嵌入式软件测试除了对软件进行性能测试、GUI测试、覆盖分析测试是同普通软件测试一样都不可或缺之外,还要对内存进行测试。
嵌入式产品不同于一般软件产品,在嵌入式软件和硬件集成测试完成之后,并不代表测试全部完成,在第一件嵌入式产品生产出来之后,还需对其进行产品测试。
嵌入式软件测试的最终目的是使嵌入式产品在能够满足所有功能的同时安全可靠的进行。
3、嵌入式软件测试与普通软件测试的异同点
3.1 嵌入式软件测试与普通软件测试的相同点
嵌入式软件测试作为一种特殊的软件测试,它的目的和原则与普通软件测试是相同的,都是为了发现软件缺陷,而后修正缺陷以提高软件的可靠性。它们的中心任务都是验证和确认其实际实现是否符合需求要求,在验证过程中发现系统缺陷。
嵌入式软件测试与普通软件测试具有相同的信息流,如图3-1。
图3-1 软件测试信息流
嵌入式软件测和普通软件测试对象相同,包括软件中所有内容,贯穿软件定义与开发的整个过程。也就是说,需求分析、概要设计、详细设计、程序编码等各阶段所得到的文档及源程序,包括需求规格说明、概要设计规格说明、详细设计规格说明以及源程序,都应当称为软件测试的对象。
3.2 嵌入式软件测试与普通软件测试的区别
由于嵌入式系统的自身特点,如实时性(Real-timing),内存不丰富,I/O通道少,开发工具昂贵,并且与硬件紧密相关CPU种类繁多,等等。嵌入式软件的开发和测试也就与一般商用软件的开发和测试策略有了很大的不同,可以说嵌入式软件是最难测试的一种软件。
嵌入式系统由于自己本身的特点,如实时性强、内存不丰富、I/O通道少、开发工具昂贵并且与硬件紧密相关、CPU种类繁多等等,决定了不同的嵌入式系统必须有不同的测试方法。
3.2.1 嵌入式软件测试的各个阶段测试的环境是不一样的
嵌入式软件开发和运行的环境是分开的,嵌入式软件开发环境往往是交叉开发环境。因此,各个阶段测试的环境是不一样的。
单元测试阶段:所有的单元测试都可以在宿主机环境下进行,只有个别情况下会特别指定单元测试要直接在目标机环境下进行。应该最大化在宿主机环境下进行软件测试的比例,通过尽可能小的目标单元访问其指定的目标单元界面,提高单元的有效性和针对性。
在宿主机平台上运行测试的速度比在目标机平台上快得多,当在宿主机平台上完成测试后可以在目标机环境下重复做一次简单的确认测试,确认测试结果在宿主机和目标机上没有不同。在目标机环境下进行确认测试将确定一些未知的、未预料到的、未说明的宿主机与目标机的不同之处,例如,目标机编译器可能有缺陷,但在宿主机编译器上没有。
集成测试阶段:软件集成也可在宿主机环境下完成,在宿主句平台上模拟目标环境运行,在此级别上的确认测试可以确定一些与环境有关的问题,比如内存定位和分配方面的一些错误。
在宿主机环境上的集成测试的使用,依赖于目标系统的具体功能有多少。有些嵌入式系统与目标机环境耦合的非常紧密,这种情况下就不适合在宿主机环境下进行集成。对于一个大型的软件开发而言,集成可以分几个级别。低级别的软件集成在宿主机平台上完成有很大优势,级别越高,集成越依赖于目标环境。
系统测试和确认测试:所有的系统测试和确认测试必须在目标机环境下执行。当然在宿主机上开发和执行系统测试,然后移植到目标机环境重复执行是很方便的。对目标系统的依赖性会妨碍将宿主机上的系统测试移植到目标系统上,况且只有少数开发者会卷入系统测试,所以有时放弃在宿主机上执行系统测试可能更方便。
确认测试最终必须在目标机环境中进行,因为系统的确认必须在真实系统下完成,而不能在宿主机环境下模拟,这关系到嵌入式软件的最终使用。
3.2.2 嵌入式软件测试的复杂多样
因为嵌入式系统的一个突出的特点,是其专用性,即一个嵌入式系统只进行特定的一项或几项工作,嵌入式软件运行的平台都是为进行这些工作而开发出来的专用硬件电路,他们的体系结构、硬件电路,甚至所用的元器件都是不一样的,所以嵌入式软件运行的平台也是复杂多样的。
由于开发平台的复杂多样性,使的嵌入式软件的测试从测试环境的建立到测试用例的编写也是复杂多样的。与不同的开发平台对应的嵌入式软件是肯定不相同的。嵌入式软件测试在一定程度的上并不只是对嵌入式软件的测试,很多情况下是对嵌入式软件在开发平台中同硬件的兼容性测试。因此,对于任何一套嵌入式软件系统,都需要有其自己的测试、创建其自己的测试环境、编写其自己的测试用例。
3.2.3 嵌入式软件测试中对实时性有严格要求
由于嵌入式系统的实时性,决定了嵌入式系统的运行时间也是受严格限制的。嵌入式软件在测试时应当充分考虑系统实时响应的问题,很多嵌入式系统会要求系统的响应时间应在多少毫秒之内。在测试有严格响应时间要求的嵌入式系统时要做负载测试。
3.2.4 嵌入式软件测试需要进行插桩测试
嵌入式软件最终的测试需要在目标机平台上进行,在对目标机进行测试时,我们需要对在宿主机上编译通过的代码进行插桩处理。插桩完成之后,需要重新对代码进行编译,如果编译通过,就可以将编译好的代码下载到目标机上执行。在目标机执行程序的时候,需要将插桩时预测好的数据返回到宿主机上,因此,宿主机和目标机上要有能够相互传递数据的网线或者串口线,宿主机上同时要有能够处理返回的数据的处理程序或软件
3.2.5 嵌入式软件对系统的可靠性和安全性要求比一般的软件系统高
因为嵌入式软件对系统的可靠性和安全性要求比一般的软件系统高,所以还需要进行系统的可靠性测试。对于不同的嵌入式系统,需要制定相应的符合系统需求的可靠级别,在进行可靠性测试时应该将系统的可靠性级别考虑进去。
一些嵌入式系统,比如工厂车间的某些控制系统,他们要在电磁很强的恶劣的环境下可靠的工作,而且要保证操作人员的安全。但是对于手机软件来说,他的可靠性和安全性就不如工厂车间的车床控制系统要求的高。