王杨,段宁璐,张耀锋
(陕西汽车集团有限责任公司技术中心,陕西西安,710200)
近些年来,嵌入式软件的规模及复杂程度急剧增大,尤其在国防、轨道交通、汽车、民航以及工业控制等领域的用户对嵌入式软件质量要求更加严格,使用过程中对嵌入式软件缺陷的容忍度越来越低[1]。因此,如何有效提高嵌入式软件的质量成为目前迫切需要解决的问题。
众所周知,软件测试是保证高质量、高可靠性软件的重要手段,对嵌入式软件来说更是如此。嵌入式软件测试常使用的测试技术包括:黑盒测试技术与白盒测试技术。黑盒测试又称为功能测试,这类测试方法根据软件的用途和外部特征查找软件缺陷;黑盒测试最大的优势在于不需要了解程序内部结构,只需要根据需求设计相应的测试用例;但是黑盒测试获得的测试覆盖率较低,从而无法有力保证被测软件具有良好的可靠性与安全性。白盒测试又称结构测试,验证程序内部逻辑结构实现是否正确,测试人员必须了解软件的内部结构和处理流程,根据程序的内部结构查找软件的缺陷;白盒测试与软件的覆盖率有密切关系,能够对程序内部特定部位进行覆盖测试,获得较高的测试覆盖率;但是单纯使用白盒测试会出现对功能需求遗漏测试的现象并且测试效率低。
有鉴于此,本文提供基于灰盒测试技术的嵌入式软件测试方法,以将黑白盒测试要素有机结合起来,应用于面向对象设计的嵌入式软件单元测试设计与实现。它综合了白盒测试和黑盒测试的优点,克服了部分白盒测试和黑盒测试的缺点,能够较好地节约测试成本,提高测试效率[2]。
本文所阐述的基于灰盒测试技术的嵌入式软件测试用例设计方法的基本流程(如图1所示),具体实施过程的解释说明如下:
图1 基于灰盒测试技术的嵌入式软件测试流程图
(1)文挡测试与程序审查:首先研读挡位切换模块的软件需求与详细设计文挡,熟悉被测对象需要实现的功能与内部结构,然后对软件需求与设计文挡进行测试,并且进行包括:整数溢出、死逻辑、数组访问越界、被零除等内容的单元模块静态审查。
(2)软件单元测试需求分析与提取:第一步确定本次测试进行功能测试与结构测试;其次采用灰盒测试思维同时分析和提取基于程序内部逻辑的结构测试需求和基于输入输出的功能测试需求,并编写单元测试需求,最后制定测试覆盖指标。具体设计编写过程分为以下阶段(A、B阶段不分先后,可同时进行):
A.使用基于思维导图的黑盒设计方法提取功能测试需求:首先根据设计文挡,确定“明确功能需求”;然后细化测试颗粒度较大的功能,提取“继承的功能需求”;最后根据测试人员的测试经验和行业标准分析出“隐含功能需求”。
B.使用基于逻辑结构状态跳转图的白盒设计方法提取结构测试需求:通过研读设计文挡、分析被测模块的业务流程跳转过程,了解被测试对象内部的基本结构,绘制出相应的状态结构跳转图;然后根据逻辑状态跳转图分析出结构测试路径(测试场景),从而获得基于逻辑的结构测试需求。
(3)软件测试需求评审:分析与提取完成测试需求后,还要进行测试需求评审,也就是测试人员向设计人员反串讲软件的相关需求和详细设计,保证测试分析与功能设计之间的一致性,保证编写的测试需求符合被测对象的业务逻辑。
(4)软件单元测试用例设计:使用灰盒测试思想设计单元测试用例;首先使用黑盒测试用例设计方法-等价类分析法划分挡位切换模块的输入条件,将其分为有效子域和无效子域并选取有代表性的数值作为测试数据;接下来使用黑盒测试用例设计方法-因果图分析法梳理有效等价类或无效等价类之间相互依赖与制约关系(分析输入条件之间的“与”、“或”、“非”关系),进而得到基于某条测试路径的因果关系图;然后将因果图转换成包括输入条件和测试结果的判定表格并根据生成的判定表设计对应的测试用例;最后,使用基于MC/DC的白盒测试方法(该准则要求代码中所有可能输入输出取值一次,每个条件必须产生所有可能的输出结果至少一次,并且每个判定中 的每个条件必须能够独立影响一个判定的输出,即在其他条件不变的前提下仅改变这个条件的值,从而使判定结果改变[3]。)补充和筛选测试用例,进一步得到挡位切换模块单元测试用例最优解(测试用例数量少且测试覆盖率高)。
选取换挡保护模块中空挡(N挡)挂入前进挡(D挡)这一测试点(根据功能规范文挡分析得到空挡(N挡)换前进挡(D挡)的输入判定表达式为:踩刹车且车速小于2km/h且挡位由N挡变为D挡);使用上述步骤所阐述的测试用例设计与优化方法,设计得出如表1和表2所示的N挡切换D挡测试用例判定表和N挡切换D挡测试用例最优解。表中A=踩刹车、B=车速小于2km/h、C=挡位由N挡变为D挡,其中a表示制动开关信号,b表示制动踏板开度,“0”表示条件不成立,“1”表示条件成立。
表1 N挡切换D挡测试用例判定表
表2 N挡切换D挡测试用例最优解
表1为只使用黑盒测试技术设计出的N挡切换D挡测试用例,表2为使用黑白测试技术相结合的灰盒技术设计出的N挡切换D挡测试用例,通过对比表1与表2测试用例的数量,就可以看出使用灰盒技术设计出的测试用例数量明显下降,并且在后续测试执行中证明依照上述方法设计的测试用例,不仅数量少并且测试覆盖率还能达到100%。故按照这一方法,可以逐步得到整个换挡保护模块的测试用例最优解(测试用例数量少且测试覆盖率高)。
本文所阐述的基于灰盒测试技术的嵌入式软件测试用例设计方法有以下创新优势:(1)提取单元测试需求时,使用灰盒测试方法同时分析和提取功能测试需求和结构测试需求,并使二者形成相互映射关系;从而将白盒测试与黑盒测试技术真正的有机融合在一起,而非简单的组合叠加,保证了需求分析阶段在整个嵌入式软件测试生命周期内的一致性和统一性,减少了在测试需求分析阶段的损耗,提高了测试的整体效率并拥有更高的置信度。(2)使用灰盒测试思想设计单元测试用例,将黑盒测试用例设计方法和白盒测试用例设计方法有机融合起来,保证最终设计出既能够满足设计功能又拥有较高测试覆盖率的测试用例和测试数据,从而使所测试的产品具有更高的功能安全等级。