来源:http://www.51testing.com/
安全认证和所需的测试和验证在软件开发预算中占了很大的比重。将软件的测试转移到左边(即在软件开发生命周期的早期),同时利用自动化技术,在成本、风险和进度方面都有很大的好处。下图1显示了商业航空公司软件开发每千行代码的成本(以百万美元为单位)(波音和空客的数据),它清楚地显示了指数级的增长。
图1:商业航空项目每行代码的软件开发成本。数据取自空客和波音的项目指标。
错误的产生和发现地点,以及对成本的影响
不足为奇的是,大多数缺陷都是在项目开始时引入的,甚至是在编写第一行代码之前。大多数缺陷是在测试期间发现并修复的,但有相当一部分(高达20%!)是在运行期间发现的,即在产品销售和发货之后。在认证系统中,这要么意味着极其昂贵的修复-测试-再认证的周期,要么意味着操作者对问题的变通。图2显示了在软件开发生命周期的每个阶段引入和检测到的bug的相对百分比。
图2:图表显示了在开发的不同阶段引入和检测到的缺陷的百分比。
在生命周期的早期,缺陷的修复是最便宜的,而随着项目时间的推移,发现和修复缺陷的成本会成倍增加。在运营中,产品运到客户手中后,其修复成本是最高的。部署后的缺陷修复成本是保守的,不包括现场安全事故对品牌的损害和责任。图3显示了在生命周期的每个阶段修复缺陷的相对成本。显然,我们的目标是将发现和修复的缺陷移到生命周期的早期,换句话说,就是“左移”。此外,最好是减少通过客户的缺陷数量(每个领域都是现实)。
图3:每个开发阶段发现和修复缺陷的相对成本。在需求和设计期间是基线(1x),也是修复缺陷成本最低的地方。图2和图3的来源:SAVI在2012年INCOSE SE会议上的演讲。
测试自动化在换挡中的作用
安全关键型软件行业认识到需要改变工作方式。太多的项目都在重新发明“轮子”,而认证全新的软件既耗时又昂贵。新产品的连接性和功能的增长意味着方法需要改变。在这篇文章中,我们不会涵盖所有被提出的技术,而是集中在测试自动化在左移减少、检测和修复缺陷和安全漏洞方面的作用。
任何安全关键型项目的一个重要部分就是测试,而自动化对于实现安全、保安和质量目标是绝对必要的。以下是测试自动化工具支持新的软件开发方法并提高测试和文档生产力的一个例子。
支持敏捷和迭代开发方法:瀑布法的问题已经被理解,许多团队正在使用更现代化的开发方法来提高质量和安全性。测试自动化是任何迭代开发方法的重要组成部分,因为在模块、组件等的每一次新迭代上都要运行测试套件。测试自动化通过可重复的自动化测试来支持这些方法,为每个测试提供不同级别的报告,但也提供随着时间的推移而累积的结果。动态分析工具对检测难以发现的运行时错误至关重要,静态分析在测试开始前检测缺陷方面发挥着重要作用。
支持软件检查:在开发生命周期早期消除缺陷的最佳实践之一是检查。检查意味着审查一切,而不仅仅是源代码。例如,检查需求和设计对于防止系统中的主要错误来源至关重要(见图2)。许多bug实际上是被设计到系统中的。工具在这个阶段发挥的作用较小,但确实能提高代码审查的效果。自动单元测试、动态错误检测和静态分析在项目的早期编码阶段提供了大大提升的错误检测。自动化测试的结果可以呈现在代码评审中,从而降低了对人工错误检测的依赖性,有更多的时间来检测错误的需求和设计决策。
提高测试效率:人工测试是乏味的,而且可重复性较低。结果收集可能是临时的,尽管结果是“正确的”,但还是会漏掉错误。实现所需的代码覆盖率,根据项目的安全标准和关键性而有所不同,很难跟踪。测试自动化不仅使测试大大减少了繁琐和可重复性,而且先进的测试工具的报告功能可以创建有关项目状态的重要管理信息。增加动态分析,即在代码运行时分析代码(以检测棘手的运行时错误),以及静态分析,即在代码运行前分析代码,大大增加了测试工具的错误检测能力。
自动化编码标准合规性:许多安全关键型项目都需要源代码标准。例如,MISRA在汽车软件中很常见,但在其他行业也得到了认可。一些标准要求代码符合公司标准,以满足某些目标。在每一种情况下,手动执行编码合规性都很乏味,而且容易出错。静态分析工具是执行合规性的理想选择,高级工具可以进一步检测出格式违规以外的错误。
自动化认证文档:在实现软件安全认证的过程中,很大一部分工作量是在记录流程、验证和核实方面。测试自动化大大降低了记录测试结果和覆盖率分析的成本。
加速第三方软件的再利用:提高生产力的一个关键策略是重复使用软件。理想情况下,可以使用已经认证的组件来降低这些子单元的开发成本。项目需要利用COTS(现成的商业软件)软件,也可能利用开放源码和其他源代码。利用静态和动态分析工具自动评估这些软件,可以降低使用这些组件的风险。
提高质量、安全和保障:即使是严格的测试机制也会遗漏关键错误。例如,在安全攻击或多线程代码的情况下,仅靠代码覆盖率不足以确保正确的行为。静态分析工具可以在不运行特定测试的情况下检测源代码中的错误,并且可以发现单元测试或系统测试中难以发现的错误,如安全漏洞。动态分析工具可以在测试过程中检测到运行代码中的错误,这些错误可能会反映在测试结果中(例如内存泄漏速度慢)。系统测试期间的模糊和渗透测试可以发现正常运行条件下遗漏的漏洞。总的来说,最先进的工具所发现的额外缺陷和安全漏洞有助于降低成本、风险,以及许多进入生产的20%左右的bug。
左移有什么影响?
很明显,必须采取一些措施来解决图2中如此清晰显示的问题。太多的缺陷在生命周期的开始阶段就被引入,并且一直没有被发现,当产品生产出来并到了客户手中(或在飞机或汽车上,视情况而定),太多的缺陷被留在了产品中。采用新的开发方法,重复使用组件,利用COTS和开源,以及工具自动化都是提高开发生产力的关键步骤。
假设使用最先进的工具的开发流程,在生命周期的早期发现并修复更多的缺陷,单元测试是非常有效的,帮助更少的错误通过生产。在图4中,一个假设的例子显示了生命周期中缺陷检测的变化--其中大部分的缺陷检测和修复被转移到左边,在生命周期的早期。
图4:一张图显示了改进后的开发流程,该流程将缺陷和安全漏洞的检测转移到了生命周期的早期。
从上面的图3我们知道,在开发的每个阶段,成本都会大幅上升。下图5显示了传统方法与图4所示的新的改进方法中修复缺陷的成本比较。不出所料,早期发现并修复缺陷的成本要比后期修复缺陷的成本低。在这里介绍的情况下,总体成本差异约为40%,有利于向左移动的方法。
图5:一张图显示了传统方法与左移方法中修复bug的相对成本。即使在总缺陷数量相同的情况下,早期检测也能显著降低成本。
认证工具链和资格协助的重要性
在安全关键型项目中使用自动化工具需要对工具本身的信任。产品制造商有责任相信用于创建软件的程序和工具符合标准的要求。工具供应商可以在这方面提供帮助,在向制造商销售工具之前,让工具获得安全标准机构的认证,或者在不可能进行这种预先认证的情况下,提供资格认证协助。然后,他们可以在自己的认证提交中使用工具供应商的认证证据,减少所需的努力。(例如,Parasoft C/C++test已经通过TüV SüD认证,符合IEC 61508和ISO 26262标准的安全相关软件开发资格)
在一些软件安全标准中,如DO-178B和DO-178C,认证是在系统层面上进行的,单个工具和软件并没有独立的认证。在这些情况下,工具供应商会提供资格认证工具箱,并在文档和专业服务方面提供帮助,大大降低了对项目中使用的工具进行资格认证所需的成本和精力。
结束语
安全关键型软件无疑陷入了成本危机。新的大型安全关键型项目的开发成本太高,甚至可能无利可图。开发安全关键型软件需要新的方法,这种努力必须减少在软件开发生命周期后期发现的错误数量。将缺陷和安全漏洞的检测和修复转移到尽可能早的生命周期中,可以大大降低成本。测试自动化在提高测试效率和结果方面发挥作用,是安全关键软件开发新方法的重要组成部分。