嵌入式软件作为嵌入式系统的重要组成部分,嵌入式软件质量问题可能会带来设备的损坏和人员的伤亡,因而用户对其质量有较高的要求。软件测试是对软件质量检验的一个非常重要的手段。而软件测试中动态测试最基础的测试就是单元测试。如何开展单元测试以及如何提高单元测试的效率是一个值得研究的问题。
1 软件单元测试的要求及重点
软件单元测试是对软件基本组成单元进行测试,测试软件单元是否正确地实现规定的功能,是否满足软件性能和接口要求。并验证程序与详细设计说明的一致性。因此在单元测试时,需要模拟被测单元与其他模块之间的交互,开发驱动模块和桩模块两种辅助模块,构建一个可执行的环境,驱动模块用于模拟被测单元的上层模块,测试执行时由驱动模块调用被测单元使其运行;桩模块用于模拟被测单元在执行过程中所调用的模块。
单元测试重点考虑的测试类型有:(1) 接口测试。接口测试主要检查实参与形参的数目是否相等、实参与形参的属性是否匹配、实参与形参的单位是否一致、传到被调用模块的实参的属性是否与形参的属性匹配、是否把常量当作变量传递等内容。(2)功能测试。功能测试主要是对照软件单元的设计说明,验证软件是否完成了所需的功能。(3)重要执行路径测试。应设计测试用例以发现错误的计算、不正确的比较和不正常的控制流向等错误。在计算中比较常见的错误是:误解或错误处理算术运算的优先次序、混用不同类的操作、计算精度不够等。另外在控制软件执行流程的比较操作中比较常见的错误有:不同数据类型的比较、不正确的逻辑操作符或不正确的优先次序、因精度不够使本应相等的数不相等(如浮点数)等。(4)软件单元的局部数据结构测试。软件单元的局部数据结构是一个主要的错误来源,应设计测试用例来发现不正确的或不一致的数据说明、初始化有错或没有赋初值、不正确的变量名、不一致的数据类型、上溢/下溢或引用错误等类型的错误。(5)错误处理路径测试。一般软件错误处理路径测试应考虑下面几种可能的错误:对错误的描述不易理解、指出的错误并不是所遇到的错误、出错时还没有进行出错处理就先进行系统干预、错误边界条件的处理不正确、描述错误的信息不正确从而不足以确定出错的原因等。(6)边界测试。边界测试是检测软件在其输入/输出域、过程参数、状态转换、功能界限等具有一定范围的边界或端点条件下的运行情况,考核软件的功能或性能在其边界条件下或边界的邻近区域内是否依然满足设计要求。按照上去要求进行单元测试时,为达到要求的覆盖条件,还需采取一定的技术手段对测试覆盖率进行记录和分析,确保达到相应的覆盖率指标。采用TBrun单元级测试工具,能自动产生软件测试驱动、桩模块,提供友好的输入输出人机交互和覆盖率统计功能,能有效提高单元测试的测试效率。
2 Testbed在单元测试中的应用
使用 Testbed/TBrun的基本方法是:设计测试用例;在Testbed/TBrun中加载被测单元文件,通过Testbed/TBrun对被测软件进行源程序自动插装;根据测试用例设定输入和预期的输出,执行插装好的源程序单元;分析输入数据、预期输出和实际输出;得到被测软件在当前的测试用例执行过程中代码的覆盖率。需要注意的是,每执行一个测试用例就需要重新编译并执行。Testbed/TBrun的覆盖率统计只具有累加的功能,因此不能查询每一测试用例执行后的覆盖率信息。在执行完所有的测试用例后会生成一個总的覆盖率文件,Testbed/TBrun通过对覆盖率文件的分析得出软件单元相应语句的覆盖情况,根据这些覆盖情况可以较快确定冗余的测试数据并增补遗漏的测试数据,从而指导新的测试用例设计。在实际应用Testbed单元测试时,需注意以下三个方面:(1)数组和指针类型的变量的输入。数组可以通过在Testbed/TBrun插装后的源代码中插入数组的初始化语句对数组赋值或者在 Testbed/TBrun 环境中对数
组的一部分赋值。因指针不能被直接赋一个地址,所以输入指针可采用映射的方式来赋值,将指针变量映射成相应的自定义变量,然后对自定义变量赋值。在测试执行的过程中,这个自定义变量的值就是指针的输入值。(2)被测单元代码的必要修改。在实际的测试过程中,有的代码单元不能直接使用Testbed/TBrun直接执行测试。须在分析之前对代码单元做少量修改。如Testbed/TBrun 插装源代码时会生成 main()函数,因此被测单元中的 main()函数要改为其他的名称以避免造成名字冲突;Testbed/TBrun 执行分析时会执行被测单元,因此被测单元中的 while(1)之类的死循环结构要去掉,否则分析将无法结束。(3)模块测试后显示最终整体覆盖率,不能查询每一测试用例执行后的覆盖率信息。
3 结语
Testbed有效地支持了测试人员的测试工作,相对于完全人工测试提高了测试效率。该工具仍存在不足,还需在实践中不断完善使用方法。
参考文献
[1] TBrun Manual.pdf -Testbed7.2 help document.