嵌入式软件单元测试

软件测试是保证软件产品质量的重要手段之一。它是测量、评估软件产品特点和能力的活动。现在,国内一些软件企业对于软件测试的重视程度还很不够,认为测试工作非常简单,只是简单地操作所测的软件产品而已。这种错误的思想严重影响了国内软件质量,应该引起我们的高度重视。

软件测试阶段可以分为若干个小的阶段,阶段的划分有多种,我现在按流程顺序将其分为四个阶段:

*单元测试:由项目小组完成

*集成测试:由项目小组完成

*系统测试:由专业测试小组完成

*交接测试:用户和开发商共同完成。

测试的四个阶段完全逆向检测了软件开发的各个阶段。单元测试主要是测试程序代码,集成测试主要是对设计的检测,系统测试主要测试了软件的功能,交接测试主要是对用户需求的一种检测。但是每个测试阶段仍要对其它测试阶段的测试内容加以测试,只是测试重点不同。

在这篇文章中,我只对单元测试流程加以阐述,曾经的特斯拉被评为美国最不可靠汽车品牌,据报道是因为特斯拉为Model X增加了过于复杂的功能(高科技多也怪我咯),如前门采用电动开启方式,中排座椅实现了电动移动,所有这些功能整合在一个平台上,导致可靠性下滑。通俗解释下就是电动门有个小bug,电动座椅又有个小bug,一堆小bug最终导致的大bug,人命关天了,现在的特斯拉已经今非昔比,因为每个软件开发中都严格使用了避免小bug的技术:单元测试。

在单元测试前,先让我们明白以下几个问题,这可以使我们对单元测试更加清晰。

*单元测试的目标: 确保模块被正确地编码

*由谁去做:    通常由程序人员测试

*怎样去测试:   功能测试可以用黑匣测试方法,代码测试可用白匣测试方法

我们在清楚以上问题后就可以编写测试用例了。测试用例是输入、执行条件和一个特殊目标所开发的预期结果集合。它按测试目的不同可分为以下几种类型:

*需求测试用例:测试是否符合需求规范

*设计测试用例:测试是否符合系统逻辑结构

*代码测试用例:测试代码的逻辑结构和使用的数据

需求测试用例通常是按照需求执行的功能逐条地编写输入数据和期望输出。一个好的需求用例是可以用少量的测试用例就能够覆盖所有的程序功能。

设计测试用例检测的是代码和设计是否完全相符。是对底层设计和基本结构上的测试。设计测试用例可以涉及到需求测试用例没有覆盖到的代码空间(例如界面的设计)。

代码测试用例是基于运行软件和数据结构上的。它要保证可以覆盖所有的程序分支、最小的语句和输出。

以上三种用例所用的数据又可分为正常数据、边缘数据和错误数据。

*正常数据:在测试中所用的正常数据的量是最大的,而且也是最关键的。少量的测试数据不能完全覆盖需求,但我们要从中提取出一些具有高度代表性的数据作为测试数据,以减少测试时间。

*边缘数据:边缘测试是界于正常数据和错误数据之间的一种数据。它可以针对某一种编程语言、编程环境或特定的数据库而专门设定。例如若使用SQL Server数据库,则可把SQL Server关键字(如:';AS;Join等)设为边缘数据。其它边缘数据还有:HTML的HTML;<>等关键字以及空格、@、负数、超长字符等。边缘数据要靠测试人员的丰富经验来制定。

*错误数据:显而易见,错误数据就是编写与程序输入规范不符的数据从而检测输入筛选、错误处理等程序的分支。

由于执行测试用例的数据量巨大以及还要进行回归测试,所以可以考虑使用自动测试工具,winAMS基于RAD模型开发,实现了与RAD模型的丰富集成,在功能上覆盖了需求分析、单元测试、集成测试、覆盖率分析、回归测试、部分系统测试等软件测试所涉及的各个环节。GAIO公司的覆盖率专家winAMS获得机能安全标百准ISO26262/IEC61508工具认证,是日本工业制造度领域普遍使用的针对C/C++的单元/集成测试工具.winAMS将通过交叉编译生成的原始代码作为评价代码,具有使用芯片仿真器进行仿真功能的测试工具.不仅可以对C/C++语言编写的程序进行逻辑水平的测试,还可以对嵌入式软件特有的依存于芯片的问题点进行确认。

有了测试用例,我们就可以进行测试了吧?许多公司也是这样做的,但在这里我建议大家最好要先进行代码的审议。可以使用winAMS配套的静态分析工具CasePlayer2,可以自动生成MISRA-C 1998/2004的规范检查报告,也可以自动生成流程图、式样书等说明书。通过代码审议找到的错误可以比测试用例测试所能找到的错误更加深入,并且发现错误的时间也比测试用例要早。代码审议要以代码标准(根各公司具体情况自行制定)为依据,一般情况下要检查以下几点:

*代码风格和规则审核

*程序设计和结构的审核

*业务逻辑的审核

代码风格和规则的审核是在每个程序员完成一个模块或类的时候要进行编码规范的检查。要召开审核会议让所有的项目组人员都参加。在会前项目经理要做一个检查表,以表的内容为检查依据,检查表的内容主要是检查的要点。在审核会上项目组的每一个人员都能看到自己和其他人员的编码问题,从而起到预防的作用。这些问题都要被解决,并且解决的结果要在审议会上被确认。进行程序设计和结构的审议是因为开发工具的不同和项目时间的限制而造成设计不详细。比较深入的设计通常是在编码阶段完成的,但由于程序人员和设计人员的经验是不同的,所以会出现很大的问题。我们引入了程序设计和结构审核来保证质量。审核人员要有先进的技术开发经验。在审核之前也要一个审核列表,列出主要几项,如:程序的概要、详细设计。但仅局限于列表是不够的,审议人员还要审议程序的精巧度和具有创造力的方面,这只能靠经验而不能只靠列表中的内容来审议。对于不同的程序员所检测代码的宽度和深度也是不同的。项目经理可以根据程序员经验的不同制定被审议人员的宽度和深度。例如:年轻的程序员要审议所有代码。但有经验的就可适当减少。

业务逻辑性审议必须要在代码完成后审议。业务逻辑审议实际上是审议单元模块的功能。这些功能是以系统说明为依据的。审议人员要有开发的经验并且对系统也要熟悉。审议人员通过执行程序从而了解底层代码的状态。这阶段的审议实际也包含了前两种审议,因为审议者也可以通过最后的结果检测单元模块设计和结构的准确性。

以上三种审议都要耗费一定的时间和资源,但是它却能更早地发现和解决不易显现的错误。

审议通过后,我们终于可以使用用例来进行代码测试和调试了。我们应该通过一步步的调试去运行每个程序的所有语句和分支。如果我们想要百分之百地覆盖就应适当运用边缘数据和错误数据。测试在这个阶段的质量是难以掌握的。它基于程序员的责任心和经验。当这阶段完成后,每个程序员所测的深度也是不同的。因此,在这个测试阶段之前,项目经理(或测试工程师)应制定出测试指导和计划书。它们至少应包括以下内容:

*测试的主要对象

*主要调试点

*怎样测试

*什么时候可以完成

至今为至,我们已完成了代码的审议和调试。如果我们是严格按照以上步骤做的,那就可以保证代码没有太多的错误,至少没有使程序运行中断的错误了。如果我们不能很好地执行代码审议和正确的调试,那我们就不能顺利地通过测试,有时我们还要不得不返回来做这些事。

好了,我们终于完成了单元测试的工作,程序员们可以喘口气了,但不要忘记还有更加严格的集成测试要我们去做。

你可能感兴趣的:(嵌入式软件单元测试)