(国电南瑞科技股份有限公司信息系统集成分公司江苏省南京市211100)
摘要:本文关注电力系统软件可靠性,其归根为软件可靠性。贯穿需求工程、建模到软件测试的整个过程,探讨了将人为因素工程融入到软件开发过程中,提高软件可靠性的思路。我们建议通过分析在重建和建模阶段出现的人为错误,优化需求检查方法和建模方法/工具。我们还建议通过人为因素分析来扩展经典的测试技术,特别是关注人为错误的检测和结构。通过预测哪些类型的故障更有可能被用户和/或程序员触发或引入,我们专门设计了检测这些故障类型的测试策略。此外,通过对人类使用和发展历史的分析,我们可以根据分析结果对测试用例进行优先级排序,目的是在软件开发时及早发现更多的故障。
关键词:软件工程;可靠性;人为因素
引言
有一个支持正确的人机交互的系统接口和开发出来的系统的正确性同样重要。即使我们开发的系统以一种理想中的正确方式(符合其需求规格)运行,如果用户无法正确使用,这些是无济于事的。大部分事故都是人为造成的。因此,有必要使人为因素工程(humanfactorsengineering)成为软件开发过程的一部分。
人为因素工程学的基本目标是在人机交互时,减少误差、提高生产率和安全性。在进行此类工作时,我们必须系统地收集错误信息,制定错误分类法,并在此基础上确定防止此类错误的解决方案,因此,工程的容错不仅要从硬件和软件的角度进行分析,还要进行人为因素和人机交互(HCI)分析。
1、背景:人为因素
最初,由于在安全攸关的系统的开发和使用上发生了错误,人们开始了对人为因素和HCI的研究。特定的安全攸关系统,例如在自动驾驶领域,只使用受控语言和半形式语言是不够的,精确的形式规范对于确保系统的安全至关重要。
说到人为因素,我们主要关注工程错误范式。工程错误范式(EEP)所针对的人为因素通常包括人机界面的设计以及相应的自动化。在这个范例中,人类几乎等同于软件和硬件组件,但与此同时,人类被视为整个系统中“最不可靠的组件”。通过一些系统设计步骤的自动化,将人从主要系统动作中剔除出来,能够降低风险。
EEP的另一个重要观点是,人的错误往往是由于人机交互界面不匹配和对人的身体能力的高估而导致的。我们必须在设计过程中考虑人的能力和可靠度,对于模型和规范,我们必须关注清晰性和可读性。个人错误范式侧重于理解人们犯错的原因,然后试图解决这些问题。
2、以人为本的发展
为了在软件工程过程中嵌入人为错误分析的方法,我们必须对错误进行分类。
对软件需求检查的研究表明,人类检测需求文档中的不一致取决于他们的学习风格,即个人特有的获取、保留和检索信息的方式。我们建议将这些方法扩展到软件的实现和测试。
分析需求规格阶段和建模阶段分别出现的典型错误可以为优化测试提供帮助。测试用例优先级是通过(1)建模和实现阶段的分析、(2)用户与软件交互时出现的典型错误进行排序。重建、建模、实现以及用户与软件交互阶段具有不同的典型错误集。这些集合之间的分类对于改进软件开发过程可能很有效果。在各个阶段,我们必须指定特定的测试用例,并在测试用例优先排序期间将其考虑在内。
2.1以人为本的重新设计和建模
之前关于人为因素工程的工作中,我们将重点放在实现系统开发过程中重新建模使用的一些方法[2]。软件系统通常是迭代开发的,在开发过程中可以多次更新需求规范。如果在开发的建模/实现阶段经常更改系统模型或实现,则很难及时更新需求规格,这个问题可以通过适当的自动化来解决。模型生成以后,每次更新模型时,系统模型都会自动生成一个(半)形式化的规范,然而,这并不能解决开发过程第一次迭代时需求文档中的故障检测问题,因为模型不存在。
2.2以人为本的测试策略
2.2.1基于人为故障的测试
测试不能确保程序无故障,但是,我们可以对测试套件进行特殊设计,以确保程序不存在任何特定类型的故障。为此目的服务的测试策略称为基于故障的测试。最古老也是最典型的基于故障的测试方法之一是领域测试。为了检测域错误,需要从输入空间内每个域的边界上和边界附近选择测试用例。
基于故障的方法也被广泛应用于基于布尔类型的测试用例选择。
为了保证对某些故障类型的检测,人们提出了各种策略。我们建议在设计基于故障的测试时考虑人为因素,以提高测试效果。故障类型有很多种,但是,通过检查最终用户的行为,我们可以预测在使用软件时,哪些类型的故障更容易触发。此外,我们还可以分析开发人员的编程风格,以预测在开发过程中更可能引入哪些故障类型。根据分析结果,我们可以确定一些在测试中需要更多关注的特定类型的故障,从而设计在检测这些故障类型方面的策略。
2.2.2面向人的优先级回归测试
重新运行先前执行的测试用例,是对软件系统进行更改时的一个必要且重要的过程。为了最大限度地提高故障检测效率,学术界已经提出了各种优先排序技术[1]。如果优先排序技术能够更早地发现更多的故障,那么它被认为比另一种方法更有效。对测试用例进行优先排序的一个典型方法是测试软件的早期版本以搜集信息,例如搜集每个测试用例在早期版本上实现的覆盖率。
在我们的研究中,我们认为还应该调查被测软件的开发和使用历史,以指导测试用例的优先顺序。通常,用户/程序员在使用/开发软件时会犯类似的错误,如果测试用例T在原始版本中报错,则很可能T或类似于T的那些测试用例也会导致新版本报错。同样,具有类似背景的用户也可能犯类似的错误,因此我们可以按用户组对错误进行分类。识别这些错误并通过错误类型对用户组进行分类,可以(1)使我们能够构建用于生成测试用例的自动模型,(2)对测试用例进行优先级排序。
3.结论
本文介绍了我们正在进行的将人为因素工程纳入软件开发过程的研究。人为因素分析不仅可以提高软件模型的需求规格说明的质量和可读性,而且可以指导各种测试任务。在需求规格和系统建模的层次上,我们主要关注可读性和可理解性方面。在软件测试的层面上,我们建议采用面向人的策略来提高故障检测的效率。因此,我们建议分析哪些类型的故障更有可能被用户和/或程序员触发或引入,以专门设计检测这些故障类型的测试策略。
参考文献:
[1]S.Elbaum,A.G.Malishevsky,andG.Rothermel.Testcaseprioritization:Afamilyofempiricalstudies.IEEETransactionsonSoftwareEngineering,28(2):159–182,2002.
[2]M.Feilkas,F.H¨olzl,C.Pfaller,S.Rittmann,B.Sch¨atz,W.Schwitzer,W.Sitou,M.Spichkova,andD.Trachtenherz.ARefinedTop-DownMethodologyfortheDevelopmentofAutomotiveSoftwareSystems–TheKeylessEntrySystemCaseStudy.TechnicalReportTUM-I1103,TUM¨unchen,2011.
作者简介:盛健荣(1980-),男,江苏南通人,工程师,本科,电力自动化、IT基础架构、信息系统优化。