APP下载

知识库系统在软件测试复用中的应用研究

2021-10-28罗浩榕朱卫星史涯晴万进勇

软件导刊 2021年10期
关键词:测试人员测试用例软件测试

罗浩榕,朱卫星,史涯晴,万进勇

(陆军工程大学指挥控制工程学院,江苏南京 210001)

0 引言

软件测试对于保证软件质量至关重要。作为一项智力密集、知识密集型活动,软件测试各阶段都会产生大量测试文档,这些文档包含被测软件特征、测试人员分析与决策等诸多信息,有效利用这些信息可帮助测试人员减少重复劳动,更加高效地确定测试需求、选择测试方法、设计测试用例,避免重复错误发生[1]。然而,目前仍存在以下3类问题制约软件测试知识复用:①数据异构:测试文档的存储有多种形式,包括结构化的关系数据库、非结构化的Word 文本、Excel 表格等,需要使用不同的获取手段,具有一定挑战性;②描述差异:现实世界中同一个对象可能存在多个描述术语,知识融合存在困难,共指消解技术值得研究;③信息孤岛:缺乏在机构与人员之间进行知识共享的机制和平台,未形成整体测试知识,存在测试知识适配障碍、知识可共享环境差、低重用性问题。

本体是知识管理中一种常用的使能技术,包含共享性、概念化、明确性、形式化4 个方面含义[1-2]。利用本体建立软件测试知识库,确定软件测试领域的规范术语集,提取并存储异构测试文档中的知识,有利于测试人员和计算机理解、处理、共享测试知识。

1 软件测试知识复用

1.1 软件测试知识

要进行软件测试知识复用,首先应确定哪些信息可以转化为可以帮助测试人员开展测试活动的知识。测试复用即识别和利用满足测试充分性条件的历史测试文档内容,这也意味着应当对测试文档内容、充分性判定规则建模。本文对软件测试知识的定义为:

定义1:测试需求(Test Requirement)。测试需求即确定测试目标、测试内容和质量特性,确定测试充分性要求,提出测试活动应当遵循的基本原则和要求,确定测试资源和技术需求。使用Target 表示测试目标,Description 表示被测件描述,Phase 表示测试阶段,Type 表示测试类型,Environment 表示测试环境,Method 表示测试方法,Evaluate 表示判断软件符合需求未发生失效的规则,那么测试需求可以表示为七元组,记为:

经验表明,同一领域的测试项目往往遵循相同的行业规范、标准等,同一类型软件的使用场景、功能结构、性能要求等存在很大相似性,因此具备了知识复用的基础。

定义2:测试用例(Test Case)。测试用例是指测试人员根据软件需求说明和程序内部结构,精心设计出的一组测试输入、执行条件以及预期结果,用于核实软件是否满足某个特定需求。采用RequiredTrace 表示测试用例对应的软件测试需求项,Precondition 表示执行测试用例的前提条件,InputData 表示输入数据集合,OperationSequence 表示操作软件的动作序列,ExceptResult 表示预期输出结果,那么测试用例可以记为五元组:

测试用例设计是软件测试的核心工作,对测试用例的复用是目前研究最多的方向,除了查找相似的测试用例直接获取历史经验,还可以归纳形成测试设计模式。

定义3:问题报告(Bug Report)。问题报告是对未通过的测试用例进行记录和总结,提出复现软件缺陷的最短路径,分析定位错误。采用CaseTrace 表示发现软件缺陷的测试用例,ActualResult 表示实际输出结果,BugCharacter 表示软件缺陷的作用表征,BugLocation 表示造成缺陷的代码或文档,Influence 表示缺陷的影响范围和程度,那么问题报告可以记为五元组:

问题报告中蕴含了测试人员对软件缺陷的总结,可以帮助后续开发人员定位缺陷,对于修复问题具有重要意义。

测试文档之间并不是孤立的,而是具有紧密联系,单独收集管理其中某一类可能会造成测试知识缺失,难以为基于知识的测试复用提供支撑。从软件测试工作规律的角度,至少可以提出以下规则联系:

(1)isDesignBy 关系。测试用例的设计依赖于测试需求分析,测试需求中描述了一个被测需求项,并指明了测试所需的软件、硬件环境以及适宜使用的测试技术。因此,对于用例集TC 中的任一测试用例tc,存在一个测试需求项tr 属于测试需求集TR,tc 与tr 具有isDesignBy 关系,可表达为:

(2)isFindBy 关系。软件缺陷必然通过测试用例的执行而发现,即对于任一软件缺陷项br,存在一个测试用例tc,该软件缺陷br 由用例tc 的执行而被发现,可表达为:

(3)isDiffrent 关系、isNotSatisfy 关系。软件缺陷的发现必然是由于实际结果与预期结果不同且不满足判断软件正确的规则。因此,对于任一软件缺陷br,存在一组测试执行的实际结果ar、测试用例的预期结果er 和测试判定规则ev。由ar 与er 具有isDiffrent 关系得出缺陷br 不满足测试判定规则ev,br 和ev 具有isNotSatisfy 关系,可表达为:

1.2 软件测试复用方法

现有的软件测试复用研究一般存在两个假设:①历史项目中的测试需求、测试用例和问题报告等均是准确的,满足测试正确性、充分性的要求;②当两个项目存在某种相似性时,其测试需求、测试用例、潜在问题等也应当存在较大相似性。

基于上述假设,软件测试复用意味着从历史测试项目中获取信息和知识支撑当前测试工作中的决策,例如测试环境和测试方法选择、测试数据设计等,这涉及到一个获取、存储、分类、检索、使用历史知识的过程。按照相似性表达和计算方式的不同可将复用方法分为3 类,分别为基于主题词检索和特征的复用方法、基于需求模型匹配的复用方法、基于语义本体的复用方法。按照复用对象的不同可将其分为两类,分别为对测试全过程文档(如测试资产)的复用和对单一测试文档(如测试用例)的复用,具体如表1 所示。

可以看出,软件测试资产复用中存在3 个问题:①缺乏形式化归纳知识的有效机制,难以深入挖掘测试资产之间的复杂关系以及其中蕴含的经验知识,从而形成抽象层次更高的测试模式、测试策略等;②难以集成和管理不同来源的信息,没有解决测试文档本身的模糊性和不精确性,相似性计算结果存在较大误差,可能造成复用结果不准确的问题;③无法解决测试文档的正确性验证问题,由人编写的测试文档不可避免地会存在问题,复用错误的经验可能降低测试项目的可靠性和工作效率,从项目中获取新知识后应当进行推理验证。因此,有必要在软件测试中引入知识管理的方法(例如本体),建立一个结构良好的知识库,在测试人员之间传递测试知识和经验,利用知识支持测试设计、执行和解释,并促进新知识的产生。为达到上述目的,目前亟需解决测试知识的表达方式、异构知识来源的获取与集成以及基于推理的测试知识验证问题。

Table 1 Methods of software reuse表1 软件测试复用方法

1.3 知识库系统

在知识库系统中,产生式规则、语义网络、框架、描述逻辑等均为使用知识表示的方式,其中描述逻辑由于其较强的表达能力和可判定性成为OWL、RDFS 等知识表示语言的理论基础。描述逻辑表示的知识库可分为TBox 与ABox 两个部分,其中TBox 是有关概念和关系的蕴涵断言集合,通过描述概念和关系的一般属性,定义了特定领域的知识结构并包含一系列公理;ABox 是实例及实例断言的集合,指明了领域中个体的属性与关系[1]。从知识库系统的组成结构来看,软件测试知识库包含5 个层次,分别为本体层、存储层、检索层、推理层、知识共享层[1-2],其中本体层是整个知识库的基础,其在测试文档中识别概念、关系和公理,作为数据模型支持软件测试领域的知识表示,对应TBox;存储层提供语义数据的存储和维护,存储数据实例,可用的工具包括JenaTDB、Sesame 等,对应ABox;检索层可通过逻辑符号组合不同条件以检索知识,是知识库发挥作用、提供更高级服务的基础;推理层可基于已有的事实和推理规则计算逻辑结果,形成新的知识,作为补充或验证知识库的依据;知识共享层使软件测试相关人员能在本体模型的支持下为软件测试文档添加语义标注,将其转化为计算机可理解的三元组语义数据。

基于领域本体的软件测试知识库定义了测试领域中的共享概念[13],促进测试知识集成、存储与共享,使测试人员能够学习测试经验,复用测试技术和测试用例。为支撑软件测试知识复用,软件测试知识库应当至少包含本体层、存储层和检索层,推理层和知识共享层可用于支持扩展新的知识。在本体的支持下,软件测试知识库可以进行系统化、形式化的软件测试工作,与完全依靠经验的传统测试比较,其更有利于测试人员之间合作,更具有透明性和可重复性[14]。

2 软件测试知识库应用

构建软件测试本体和知识库为测试组织与人员之间共享知识奠定了基础,是实现软件测试复用等智能测试应用的前提。将软件领域知识应用于软件测试全生命周期中,可最大限度地利用软件测试机构积累的历史知识。

2.1 基于语义的测试文档管理

与其他软件过程文档类似,测试文档用于支持测试过程的相关利益者对测试项目进行交流和理解,这些文档本身是为人类开发的,计算机难以理解和处理。由于测试文档数据的稀疏性,相关联的信息往往分布在多个文档中,即使使用项目管理工具,访问和检索文档内容依然需要大量人工干预,这便造成了文档分析的低效性。语义网通过本体对网页内容的元数据提供注释,解决网络中的语义检索问题。借鉴该思路,利用本体将文档中的文本映射到概念、关系和实例,向文档中添加注释以提高对其中数据的可理解性和可访问性[15],使文档内容能够被计算机理解和操作,进而提供复杂搜索、文档互操作等功能。

手动进行注释消耗大量时间且容易出错,因此一般使用注释工具对软件测试机构维护的文档模板进行注释。基于软件测试领域本体,为文档管理系统建立多层文档模型[16],分为通用层和特定领域层,其中通用层依赖于软件测试文档标准,如GJB438B、ISO29119、GB/T15532 等,用于表示软件测试文档共有的属性、结构等,为添加注释提供指导;特定领域层基于不同专业领域,对不同应用场景进行编辑,进而表示雷达系统、信息系统、通信系统等不同软件应用领域的专有概念、属性、关系等,作为语义文档的注释标签。语义测试文档的产生和使用分为3 个阶段:①测试人员将被注释的文档模型实例化,产生语义标注的测试文档,存储在语义文档库中;②从语义测试文档中抽取语义内容和版本信息,存储于数据存储库中;③提供一个对外的应用接口,支持测试人员、其他系统用户进行数据追踪和基于本体的搜索。

语义测试文档实际上就是基于测试领域的本体模型开发带有元数据标签的测试文档模板,这些标签将文档定义为一个操作单元进行识别、结构化、信息交互等操作,有效控制和管理软件测试文档的生命周期。

2.2 基于知识的测试用例复用

在测试用例设计和生成过程中,基于领域本体的测试知识库可以有3 种应用方式:①一种基本的测试用例复用[11,17]方式是建立基于本体的测试用例知识库,依据预定义的覆盖选择标准和软件度量模型计算被测目标的概念相似度,从知识库中推荐测试用例。这些相似测试用例数据显示在模板中,测试人员根据需要选择其中一个或多个并修改部分数据,根据选择和修正结果动态更新推荐算法的参数,新的测试用例在执行后也加入测试用例知识库中。②从软件需求本体中提取测试数据形成测试用例[18]。软件需求是软件测试的基础,由于人类交流的信息偏差和对现实世界的认知偏差,复杂软件需求存在一定模糊性。基于本体的需求建模技术通过描述系统在特定条件下的行为活动、行为约束和行为标准,能够定义软件功能需求、软件特性和非功能需求,被广泛用于减少理解需求的复杂性和模糊性。因此,将本体应用于软件测试领域,建立软件需求与软件测试的联系,可以降低软件测试的复杂性和模糊性。测试用例与软件需求的前置条件、后置条件、输出和约束类相关联,通过约束求解可以为每个测试用例生成前置条件和后置条件。前置、后置条件用于求解所需的输入参数和测试数据,软件输出与测试用例执行后的预期结果相关联,软件需求约束指示了执行测试用例所需的条件或动作序列。③通过本体描述软件系统环境模型,特别是系统与外界交互的场景,如车辆行驶场景、网络攻击环境、编译器解析等系统行为。基于软件系统环境的概念、关系以及系统与环境的交互行为提取潜在的测试输入数据字段及其值域范围,通过组合测试方法生成多组对应不同环境条件的测试数据集,再根据本体中的约束消除多余组合。上述方法可以为运行在复杂环境中的软件系统生成测试用例,但不提供预期输出[19-20],需要另外提供测试预言判断测试执行结果成功或失败。

3 挑战与展望

3.1 复杂知识表示

与大型通用知识库DBpedia、Wikidata 等相比,软件测试领域中涉及的知识类型更复杂,不仅需要表示软件对象、测试环境、测试产品等静态知识对象,还需要表示过程性的动态知识,如测试对象的复杂度、逻辑过程和目标质量特性等指标对测试方法产生的影响。静态的知识可以使用框架对其基本概念和关系进行较为全面的描述,而过程性知识适合使用产生式表达。基于描述逻辑的本体能够表达的知识范围相对较广,但开发本体比较困难。软件测试知识库并不能单独在软件测试过程中发挥作用,而是作为测试过程管理工具的一部分存在。通过一个得到公认且表现力足够强的本体描述测试知识的不同细节,可使测试人员在产生、获取和共享测试知识的过程中没有额外负担。目前的测试知识库研究大多关注建立不同形式的本体,并以本体实例的形式存储测试用例、软件需求等相关文档信息,现有的软件测试参考本体还没有达到解决这一需求的水平。缺少有效的知识表达方式对软件测试知识的转化造成了严重阻碍,使软件测试组织获得的知识和经验难以被复用。

三元组形式的知识表示方法基于离散化的符号表达知识,可有效将数据结构化,应用广泛。然而,网络状离散化的符号不能进行语义计算,基于图网络的知识推理算法存在计算复杂度高的问题,对下游应用并不友好。此外,当出现数据长尾分布时,长尾部分罕见实体的推理和计算往往准确率极低。近年来快速发展的深度学习等表示学习技术可以将软件测试实体中的语义信息表示为稠密低维的实数值向量,从而在低纬度空间中计算实体关系中的复杂语义关联,对于软件测试知识库的构建有重要意义。

3.2 开放域中的知识抽取

软件测试知识库的构建需要从结构化数据库、非结构化文本、半结构化表格等中提取实体、关系、属性等信息。软件测试知识的存在形式多种多样,数据异构现象较为突出,数据质量良莠不齐且对人工标注的专业性要求高,缺少高质量的标注数据是构建软件测试知识库的一大难题。在常用知识抽取方法中,基于规则和词典的知识需要高质量的软件测试领域知识词典,且主要针对单一场景和单一数据源。一种解决方案是在开发软件测试文档的过程中引入样板,使用元数据标注的语义文档开发测试文档并将其作为主要数据来源,以提高数据质量;另一种解决方案是通过弱监督学习减少对标记数据的依赖,使用大量未标注数据提升模型性能,主要包括远程监督和Bootstrapping两种方法。远程监督学习的基本假设是如果两个实体在知识库中存在某种关系,那么非结构文本中包含这两个实体的句子也应当表达了这种关系,可通过将知识库与非结构文本对齐的方式自动构建大量训练数据。远程监督训练能有效减少人工标注的工作量,但也会引入大量噪声,导致语义漂移现象。Bootstrapping 方法利用少量实例作为初始种子集合,在种子集合上学习实体关系抽取的模板,再对模板抽取结果打分并扩展种子集合,通过不断迭代抽取大量实例。该方法构建成本低且具备发现新关系的能力,但也存在对初始种子敏感、语义漂移、准确率低等问题。

4 结语

软件测试活动中产生了大量知识,获取、表示、共享并复用这些知识是一种提高测试工作效率、减少测试人员工作量的有效方法。然而以往的软件测试复用研究大多专注于对历史数据的管理和检索方面,对蕴含于原始数据中的测试知识研究不足。此外,这些研究通常基于一个隐含的假设,即能够完整理解和表达被复用组件及其上下文,但由于软件测试中的不确定性,这样的假设往往是失效的,因此传统的软件测试复用具有一定局限性。随着人工智能和开放数据的快速发展,软件测试复用出现了向更高语义抽象层次发展的趋势,为在概念维度处理历史知识表示的模糊性以及开发更智能的检索技术提供了新思路。

猜你喜欢

测试人员测试用例软件测试
基于SmartUnit的安全通信系统单元测试用例自动生成
基于OBE的软件测试课程教学改革探索
EXCEL和VBA实现软件测试记录管理
基于混合遗传算法的回归测试用例集最小化研究
高校分析测试中心测试队伍建设方案初探
关于软件测试技术应用与发展趋势研究
浅析软件测试中的心理学应用
软件测试工程化模型及应用研究
基于依赖结构的测试用例优先级技术
犯罪心理测试人员素质要求分析