集成到开发人员IDE中的统一测试工具为开发测试提供了最高效的环境。诸如Parasoft C/C++test之类的统一工具使团队能够将测试的重点放在高风险和最新修改的代码上。
软件验证和确认是软件开发的固有部分。特定V&V项目的投入和预算取决于许多因素,例如项目的功能安全目标,业务风险级别或组织的质量文化。无论什么因素促使组织实施质量计划和流程,生产安全和高质量的软件产品都需要付出更多的决心。
由于许多原因,选择适当的测试方法是一项艰巨的任务。技术发展日新月异,公司必须选择采用哪种软件测试工具。在许多情况下,在开源产品和商业产品之间进行选择也很困难。
**这篇文章说明了如何结合使用自动化测试技术(例如高级静态分析,运行时内存监视,自动化单元测试和流分析)来改善质量保证流程,并确定实现统一测试工具的好处。**此处讨论的概念是通用的,可以应用于任何编程语言,但是此处的示例考虑了使用Parasoft C/C++test创建的C和C++编程语言。
缺陷类别和工具自动化
在考虑可能的高级软件故障时,可以区分几类软件错误:由于缺少需求而导致的错误,由错误指定的需求引起的错误以及由于需求编码不正确而发生的错误。前两类软件缺陷属于需求工程类别,这里不再讨论。在这里,我将重点介绍由于实施不当而导致的错误,其中包括许多团队都在努力解决的各种潜在软件问题。
那么,需求编码不正确意味着什么?可能有很多事情。以不正确实施的需求为例-旨在检查正确的实施失败和测试自动化工具检测并报告缺陷的单元测试。在另一个示例中,运行时分析工具可能会在单元测试期间检测到严重的内存访问错误,而该错误仅从单元测试结果中无法检测到。如下所示,使用不同的工具更好地检测某些类型的错误。
图1.软件缺陷和检测策略概况。
显然,并非所有软件项目都需要使用所有可用技术来测试和提高软件质量,并且组织面临着如何平衡预算和质量的难题。与功能安全相关的项目可能会选择所有可用技术,以确保质量不受影响,并符合软件安全标准(例如ISO 26262)。其他团队可能会决定只选择静态分析和单元测试,因为它们似乎涵盖了很大一部分软件缺陷,而有些团队可能会发现一个开源的单元测试框架就足够了。
人们不愿实施多种测试技术,通常是因为担心使用多种技术会给开发速度带来巨大的开销,更不用说预算了。如果团队决定选择未集成的工具,那么这更可能是一个真正的问题。多个单独工具的成本,学习曲线以及在不同使用模型和界面之间进行切换的必要性可能会成问题。结果,开发人员可能会避免使用工具和自动化,因为这会将他们的注意力从编写代码重定向到使用工具,从而降低了生产率。
统一测试工具的价值
在讨论其价值之前,指定一个统一测试工具的期望值很重要。理想情况下,工具应:
- 支持多种测试技术
- 易于使用
- 检测功能问题和回归
- 提供从需求到测试的可追溯性
- 衡量代码的复杂性,可移植性和可维护性
- 通过在编写代码时提供即时反馈来教育开发人员
- 提供有关开发进度的信息
- 结合不同技术的结果进行高级分析
统一和集成的测试工具可帮助避免许多问题:
- 通过使用具有不同接口的分离式工具,出现多个学习曲线和可用性问题
- 分散开发人员编写代码的注意力
- 防止工具链的不同元素之间的信息交换
检测尽可能多的缺陷
软件缺陷分为不同的类别,因此不能期望通过一种测试技术来识别所有缺陷。例如,手动系统级测试。为了提供更具体的示例,请遵循以下示例代码片段:
上面的几行代码包含几个问题。具体来说,在第16行中,开发人员试图使用在calculateIdx()函数中计算出的索引值来初始化全局缓冲区,但是他们无法验证其是否在允许范围内。即使运行了几十个手动测试会话,它们也可能不会显示此问题,因为将整数值写入随机存储器位置很少会立即产生引人注目的效果。
但是有一天,很可能是在发布之后,内存布局可能会发生变化,第16行的操作会使应用程序崩溃。有趣的是,由于用于计算索引的循环,静态分析也可能无法标记该问题。由于性能原因,静态分析工具中使用的数据和控制流分析必须在合理的时间内应用启发式方法和简化方法来完成代码分析,并且通常将它们循环应用,这意味着可能会遗漏一些错误。
一个内存监视工具可以检测到此错误,该工具通过注入特殊检查来检测源代码并报告不正确的内存操作。运行时分析工具仅在实际执行的路径上检测软件问题,而无需做出任何猜测——与静态分析相比,这是一个很大的优势,因为报告的问题的准确性非常高。
在此示例中,Parasoft的内存错误检测功能很容易确定问题所在:
同样可能出现相反的情况——静态分析可能会检测到运行时内存监视无法识别的问题。例如,在下面的代码片段中,第27/28行可能会取消空指针的引用。在人员指针参数为null的情况下调用storePersonToFile函数会导致错误,但这仅在retrivePersonFromDB函数返回null时才会发生。在系统测试会话期间不太可能出现这种情况,因为数据库连接很可能按预期运行,因此运行时内存监视工具保持沉默。但是,静态分析工具中的流分析很容易检测到从该函数返回的空指针,并报告潜在的空指针解除引用问题。
图4.静态分析结果示例。
检测功能性问题和回归
总是完美执行但不符合要求的代码又如何呢?静态和动态分析对识别此类问题没有用。要检测预期结果与实际结果之间的差异,需要将计算结果与预定义值进行比较。有许多实现此类检查的流行方法,包括手动系统级测试,集成测试和单元测试。
在许多领域中,统一的测试工具可以促进单元测试过程。福利清单包括:
- 例如,通过提供用于创建、编辑和配置测试用例的图形向导,在创建测试用例时提高开发人员的生产力
- 与Test Double框架集成,可轻松进行模拟和存根,以模拟复杂的测试场景,而无需涉及大型代码库
- 将测试用例与代码覆盖率报告相关联,以评估测试的完整性
- 通过自动计算验证代码增量所需的最少测试用例集来优化测试会话
- 合并其他测试技术(例如手动/系统级测试或集成测试)的代码覆盖率报告,以识别未经测试的代码
- 将结果追溯到需求,以更好地了解失败的测试的影响
通过使QA团队参与编写单元测试的过程,使用图形向导或编辑器创建测试可以提高整个组织的生产率,从而使他们为开发过程做出积极的贡献。对于QA团队成员而言,使用图形向导比在代码编辑器中编写适当的测试代码要容易得多,因为使用输入表单(如下所示)配置值不需要高级编码技能,并且耗时更少,尤其是在团队成员缺乏经验的情况下。例如,下面的屏幕截图显示了Parasoft C/C++test的C/C++单元测试功能示例,该向导可帮助创建单元测试。
使用统一测试工具的另一个好处是它提供有关测试的完整性和关键业务需求的运行状况的反馈。即使语句覆盖率报告显示较高的值,MC/DC覆盖率报告中的数字较低也可能表示分支覆盖范围不足。这种分析需要一个支持多个覆盖率指标的工具链,从而使团队可以从简单的事情开始,例如行或语句覆盖率,并在改进测试用例的过程中逐步实现更彻底的代码覆盖率。
测试可追溯性的要求
单元测试和系统测试覆盖率报告是有关测试过程的大量信息来源,尤其是结合使用时。但是,如果测试结果与需求不相关,则团队将缺少一些关键信息。通过查看“测试到需求”可追溯性报告,您可以快速确定需求覆盖的状态。此类报告的示例如下所示:
将需求与不同类型的测试结果相关联的能力是使用统一测试工具的巨大好处。可以将单元测试、系统测试、集成测试结果以及编码标准和代码度量结果进行关联,以提供有关关键和非关键需求的运行状况的反馈。
结合不同技术的结果进行高级分析
当您将项目中使用的各种测试技术中的数据组合在一起时,您可以获得二级指标和更复杂的分析。使用统一的测试工具,团队可以从全新的角度查看代码。失败的单元测试用例对开发人员而言可能具有不同的含义,这取决于发生在通过代码度量分析评定为高风险或低风险的代码中。如果将此信息与源代码控制中的统计信息进一步结合在一起,并与需求相关联,则团队可以就何时以及如何更正代码做出更好的决策。
使用Parasoft工具套件,您可以利用基于变更的测试来提高团队生产力。基于变更的测试技术捕获源代码,测试用例和代码覆盖率结果之间的关系,以计算最佳的测试用例集,以验证和确认特定的代码增量。实际上,团队可以通过只运行一小部分测试而不是完整的回归套件来限制其测试会话。这种只测试绝对必要条件的方法可以节省大量资金,特别是对于中型或大型项目。
放在一起:Parasoft C/C++test和DTP
上面讨论的所有测试技术都可以在Parasoft C/C++test和Parasoft DTP中使用。Parasoft C/C++test是用于C和C++项目的统一测试工具。C/C++test可作为流行IDE(如Eclipse和Visual Studio)的插件提供。与IDE的紧密集成可防止上述问题。开发人员可以在编写代码时立即运行编码标准符合性检查或执行单元测试。质量保证小组成员可以在监视应用程序的代码覆盖率和运行时错误的同时执行手动测试方案。离线分析(例如静态分析提供的流量分析)可以在连续集成阶段中执行。服务器会话由方便的命令行界面支持,可将分析结果报告给Parasoft DTP,后者会汇总来自开发环境的信息。Parasoft DTP提供了广泛的报告功能,包括集成来自第三方工具的数据,将测试结果发送到开发人员的IDE以及计算高级分析的能力。在工作流的每个阶段提供的连续反馈可加快敏捷开发速度,并降低达到安全标准要求的成本。
还应注意,此处讨论的质量保证过程和体系结构的方法不限于C/C++项目。Parasoft为Java和C#/.NET提供了类似的解决方案。
结论
软件质量改进不是一项统一的工作,它需要不同的技术来消除不同类型的软件缺陷。关键的挑战是如何以有效和高效的方式做到这一点,从而避免破坏性的项目预算并损害开发人员的士气。集成到开发人员IDE中的统一测试工具为开发测试提供了最高效的环境。诸如Parasoft C/C++test之类的统一工具具有统一测试各个方面的指标和结果的能力,通过允许团队将测试重点放在高风险和最新修改的代码上,从而提供了额外的好处。