嵌入式系统中软件的测试用例生成研究
2017-11-24
(广东威灵电机制造有限公司 电机开发研究院,顺德 528311)
嵌入式系统中软件的测试用例生成研究
付彦超
(广东威灵电机制造有限公司 电机开发研究院,顺德 528311)
探讨了软件测试中常见的几大误区,并利用黑盒测试和白盒测试相结合的测试策略,针对嵌入式系统中电机矢量控制方法中的空间矢量脉宽调制(SVPWM)算法进行测试,详述了各个测试方法的原理及其对应测试用例的设计过程。
软件测试;黑盒测试;白盒测试;SVPWM;测试用例
引 言
微电子技术的发展日新月异,使得嵌入式系统在医疗电子、智能家居、电力控制等领域得到广泛的应用。嵌入式系统的功耗、性能及可靠性与嵌入式软件的质量息息相关,而软件测试又是软件开发的核心环节,是在软件投入使用之前,对软件需求规格说明、设计规格说明和编码的最终复审,是确保软件质量、提高软件可靠性的关键步骤[1]。
本文首先针对软件测试存在的一些思维误区进行探讨,随后以电机驱动控制中常用的空间矢量脉宽调制(SVPWM)算法软件为例,介绍了一种黑盒测试和白盒测试相结合的软件测试方法,详述了测试原理及相应的测试用例设计过程。
1 软件测试领域中常见的思维误区
随着嵌入式系统的大量应用,已经有许多企业相继组建了自己的软件测试部门或团队,对于大型软件系统,很多企业甚至还引入了第三方评测机构。尽管如此,很多是软件测试人员对于软件测试领域的认知还存在许多误区[2]。下面对一些常见的思维误区进行探讨。
1.1 误区一:对软件测试目的的认识本末倒置
软件测试的效果不尽如人意,很大原因是由于测试人员对软件测试目的认识错误造成的。有相当数量的软件测试人员会认为:软件测试就是证明软件不存在错误的过程;软件测试的目的在于证明软件能够正确完成其预定的功能。这些对软件测试的理解是本末倒置的。
首先,进行软件测试的最终目的是为了提高软件的质量;其次,预设的目标会对人的行为产生重要的心理影响。具体而言,如果进行测试的目的是为了验证软件的正确性,那么测试人员在潜意识中会更倾向于实现这个目标,也就是说, 测试人员会倾向于设计出较少导致被测软件失效的测试用例。如果进行测试的目的是为了发现软件中隐藏的错误,那么测试人员会倾向于设计出更多发现问题的测试用例。显然,后者更有助于提高软件的质量。
因此,对软件测试更为合理的理解应该是:软件测试是为发现错误而执行程序的过程[3]。
1.2 误区二:软件测试可以完全通过自动化测试工具进行
部分软件测试人员,甚至项目经理也会认为,有了自动化测试工具,便可以完成全部的软件测试,可以完全取代诸如代码检测、走查与评审等人工测试过程。
这是一种片面的理解,原因有二。其一,根据大量实践证明,人工测试可以发现很多自动化测试工具无法识别的错误。这些错误的典型特点是既不违反代码编写规范,又未出现任何逻辑错误,甚至可以执行出一个貌似正确的结果使程序跑下去。比如,绝大多数软件工程师在使用C语言进行编码时,都犯过错用“=”和“==”的错误,但这个错误难以被自动化测试工具识别,最多只能给出一个警告(warning)。其二,许多软件语言在最初的设计上并不完美。以目前嵌入式软件中流行的C语言为例,正如在Kernighan和Ritchie合著的C语言经典著作《The C Programming Language》中所述:“有些运算符的优先级是错误的!”尽管如此,ANSI C在修改C语言运算符优先级方面并没有采取什么修正措施,这也毫不奇怪,因为如果对运算符的优先级做了修改,大量现有的代码就会出现问题[4]。
1.3 误区三:软件测试人员只是执行测试用例,并将执行结果与预期结果进行比较
这种观点把测试看作是一种简单的比较活动,并没有看到软件测试人员必须设计测试用例,并确定预期输出结果。实际上,测试一个软件所需要的创造性很可能超过了开发该软件所需要的创造性[3]。大多数的测试设计都是基于探索式推断[5],这意味着要以一种不能事先预测的方式,通过一种思想引出另一种思想,然后再引出下一种思想[6]。软件的编写可以按照设计阶段制定的功能需求或者说明书进行开发,然而软件的测试却并没有明确的功能说明书用于参考。
1.4 误区四:软件测试是在代码发布后进行的
图1 瀑布模式开发流程图
许多软件开发小组习惯于采用瀑布模式作为软件开发模式。在瀑布模式中,每一个阶段的结束同时也是下一个阶段的开始,工作流程按照指定的顺序进行。工作的实现从一个阶段“流动”到另一个阶段,就像瀑布从山上流下,如图1所示。
这个模式的好处是,当软件工程师开始一个新的阶段时,前一阶段的所有工作都已完成。另一个潜在好处是它能够强制软件工程师在动手编写代码前尽可能多地进行思考和设计。然而,这个模式的最大缺点是不灵活。比如,在测试阶段发现了一个由于设计缺陷而导致的错误,修正起来会非常困难,因为设计阶段已经结束了。而事实上,瀑布模式的设计者Winston Royce的本意,是要将其设计成一种迭代的过程[7]。
和瀑布模式相比,V字模型模式更适合软件开发[8]。具体而言,软件测试应该在编程的最开始就进行,这样做最大的优点是可以降低修正错误的成本。这并不难理解,试想,如果是在代码已经发布(接近开发完成)的情况下再进行软件测试,为了纠正在测试中发现的错误,可能需要返回到很早的时间(甚至是软件开发时的需求定义阶段),这样越到后来,往前返工需要重做的事情就越多。所以,修改后期的错误所做的工作量要比修改前期的错误多得多。错误的发现和解决处理得越迟,其带来的成本就越高[9]。Boehm在《软件工程经济》一书中表示:平均而言,如果在需求阶段修正一个错误的代价是1,那么,在设计阶段发现并修正该错误的代价将是3~6倍,在编程阶段才发现该错误的代价是10倍,在内部测试阶段则会变成20~40倍,在外部测试阶段则是它的30~70倍,而到了产品发布出去时,这个数字就会高达40~1000倍。修正错误的代价不是随时间线性增长,而几乎是呈指数级增长的。
1.5 误区五:软件可以被完全测试
很多软件开发小组成员、项目经理、甚至是公司都希望能对开发的软件进行全面的测试,并借此来发现所有隐藏的错误,进而完善软件的质量。然而,针对一套软件进行完全测试是不可能的。因为软件的输入范围太大,不可能对其进行穷尽测试。同时,程序中可能的运行路径太多,也不可能穷尽测试。
Myers为了说明这个问题,在1979年编写了一个简单的程序,仅有一个loop循环和一些if语句,如果使用C语言编写,可以将这段程序控制在20行以内。这组程序有1018条不同的路径,Myers提醒人们宇宙的寿命也不过4×1017秒而已[10]。
2 软件测试的执行
Myers已经证明了穷举的黑盒和白盒测试通常是不可能的,但同时也建议将这两种测试的要素组合起来可以得到一种更加合理的测试策略,因为某种方法遗漏掉的错误,用其他的方法就可能找出来。
下面将分别针对人工测试技术、黑盒测试中的边界值分析法和等价类划分法、白盒测试中的判定覆盖法的原理进行阐述,并详述基于以上方法如何进行测试用例的设计。
2.1 代码检查和走查
大多数人认为,因为程序最终是为了提供给机器执行而编写的,那么也应该由机器来对程序进行测试。实际上,这种想法是有问题的。人工测试方法在暴露错误方面同样是很有成效的。
代码检查和走查是两种主要的人工测试方法,都要求一个小组来阅读特定的程序代码,在类似于一种头脑风暴会的评审会议中,尽可能多地发现软件中的错误。
检测小组一般由3~4位工程师组成,其中一位是代码的作者,负责讲解代码;一位是称职的软件工程师,但不是代码的作者,负责协调整个会议,包含会议进程的安排、会议评审资料的准备、记录发现的所有错误、在会议后确保所有的错误都已经予以纠正;其余1~2位是称职的软件工程师(其中一人最好是其他项目里的软件工程师),但同样不是代码的作者,并且熟悉常见的编码错误,在会议中负责倾听与提问。
在评审会议中,由代码的作者逐条语句讲述程序的逻辑结构。在讲述的过程中,小组的其他成员应根据自己的理解提出问题,判断是否存在错误。在实际应用中,常常遇到的情况是代码的作者在讲述的过程中自己发现了大部分的错误。评审会议的节奏由协调人负责把握,确保大家的注意力全部集中在更多地发现错误上,而不是在发现错误后讨论如何修正这个错误。同时,详细记录会议中发现的每一个错误。这样,评审会议结束后,小组会得到一份错误清单。如果错误清单上的错误数较多,需要对该清单的内容进行归纳、总结,以提高日后的代码检查效率。评审会议可以培养团队内良性竞争的气氛,因为组员喜欢通过发现问题来展示自己的能力。
代码检查和走查与自动化测试是互补的,缺少其中任何一种,错误检查的效率都会降低。
代码检查和走查不仅对于测试新开发的程序有着不可估量的作用,而且对于测试更改后的程序依然具有相同的作用,甚至更大。根据测试经验,修改一个现存的程序比编写一个新程序更容易产生错误。因此,除了回归测试方法之外,更改后的程序还要进行这些人工方法的测试。
2.2 测试用例的设计
2.2.1 SVPWM原理简述
SVPWM的原理及其工程实现方法在此不做赘述,详细内容参阅参考文献[11],本文只对SVPWM软件模块的规格说明进行描述。SVPWM软件模块框图如图2所示。
图2 SVPWM软件模块框图
它包括:
① 双输入(Uα和Uβ),三输出(Ta、Tb、Tc)。
② 输入变量已标幺化,其取值范围为[0,1]。
③ 标幺化后的输入变量又被Q格式化,且为Q14格式,则其取值范围为Uα、Uβ∈[0,214]。
④ 两个输入变量彼此正交。
⑤ 两个输入变量最终合成一个电压矢量Uout,且满足关系式(1):
式中,T为PWM中断周期,T1和T2分别为基础相量U0和U60的加载时间。
⑥ 输出变量Ta、Tb、Tc的取值如表1所列。
表1 Ta、Tb、Tc在不同矢量区间中的取值
在表1中,taon、tbon、tcon按照式(2)求取:
式中,t1、t2的取值如表2所列。
表2 t1、t2在不同矢量区间中的取值
在表2中,X、Y、Z按照式(3)求取:
2.2.2 根据边界值分析法确定测试用例
经验证明,考虑了边界条件的测试用例与其他没有考虑边界条件的测试用例相比,具有更高的测试回报率。所谓边界条件,是指输入和输出等价类中那些恰好处于边界、或超过边界、或在边界以下的状态。
按照如上原则,生成的测试用例有:
a. 输入为空;
b. 输入变量Uβ为0;
c. 输入变量Uβ为1638(即_IQ14(0.1));
d. 输入变量Uβ为14745(即_IQ14(0.9));
e. 输入变量Uβ为16384(即_IQ14(1));
f. 输入变量Uβ为18022(即_IQ14(1.1));
g. 输入变量Uα为0;
h. 输入变量Uα为1638(即_IQ14(0.1));
i. 输入变量Uα为25395(即_IQ14(1.55));
j. 输入变量Uα为27033(即_IQ14(1.65));
k. 输入变量Uα为27197(即_IQ14(1.66))。
2.2.3 根据等价类划分法确定测试用例
等价类划分测试的思想是,将程序输入范围进行划分,将其划分为有限数量的等价类,如果等价类的某个测试用例发现了某个错误,则该等价类的其他用例也应该能发现同样的错误。这种思想可以确保采用较少的测试用例子集发现较多的错误子集。
下面根据等价类划分法确定测试用例,其过程如下:
① 为每个等价类设置一个不同的编号。
② 设计测试用例,尽可能多地覆盖那些尚未被涵盖的有效等价类,直到包含所有的有效等价类。
③ 设计新的测试用例,覆盖一个且仅一个尚未被涵盖的无效等价类,直到包含所有的无效等价类。
以上步骤都以表格形式记录在表3中,括号中的数字代表不同等价类的标识符。
表3 等价类列举表
按照表3设计一系列测试用例,用以涵盖一个或多个有效等价类,如:
涵盖了表3中第(1)、(4)、(7)等价类。而无效等价类及其测试用例如下所示:
(2) Uα或Uβ=4096,即_IQ13(0.5)
(3) Uα或Uβ=16384,即_IQ15(0.5)
(5) Uα或Uβ=0xDFFF,即_IQ14(-0.5)
(6) Uα或Uβ=18022,即_IQ14(1.1)
此时,所有的等价类都被以上7个测试用例全部覆盖了。
2.2.4 根据判定覆盖法确定测试用例
判定覆盖法要求每个判断都必须有“是”和“否”的结果,并且每条语句都至少被执行一次。换言之,即每个判断都必须有“是”和“否”的结果,而且每个入口点都必须至少被调用一次。SVPWM程序的流程图如图3所示。
图3 SVPWM程序流程图
根据判定覆盖法的原则,设计测试用例如表4所列。
表4 根据判定覆盖法设计的测试用例集
结 语
[1] Perry William E.软件测试的有效方法[M].兰雨晴,等译.北京:机械工业出版社,2004.
[2] 乔勇诚.探讨软件测试误区[J].通信技术,2011(8):149-151.
[3] Glenford J Myers.软件测试的艺术[M].张晓明,等译.北京:机械工业出版社,2016.
[4] Peter Van Der Linden.C专家编程[M].徐波,译.北京:人民邮电出版社,2008.
[5] Lakatos.证明与反驳:数学发现的逻辑[M].方刚,等译.上海:上海译文出版社,1987.
[6] Cem Kaner.软件测试经验与教训[M].韩柯,等译.北京:机械工业出版社,2004.
[7] Winston Royce.Managing the Development of Large Software Systems[C]//Proceedings of IEEE WESCON 26,1970.
[8] Alan Page.微软的软件测试之道[M].张爽,等译.北京:机械工业出版社,2009.
[9] 朱少民.全程软件测试[M].北京:电子工业出版社,2007.
[10] Cem Kaner.计算机软件测试[M].王峰,等译.北京:机械工业出版社,2004.
[11] Erwan Simon.Implementation of a Speed Field Oriented Control of 3-phase PMSM MotorUsing TMS320F240[C]//Application Report SPRA588,1999.
付彦超(硕士研究生),主要研究方向为电机驱动控制。
ResearchonTestCasesGenerationofSoftwareinEmbeddedSystem
FuYanchao
(Motor Development Research Institute,Guangdong Weiling Motor Manufacturing Co.,Ltd.,Shunde 528311,China)
In the paper,several misunderstandings of the software testing are discussed,and a method that combines black-box testing and white-box testing is used to test the SVPWM algorithm which is widely applied in motor drive system.The design principles and design process of test cases are also explored in this paper.
software testing;black-box testing;white-box testing; SVPWM;test case
TP311
A
2017-07-07)