摘要:对基于TTCN-3的测试系统进行逆向分析,可以帮助测试人员从更高层次上把握测试系统的设计,同时可以检验测试设计和测试实现之间的一致性,这些工作对于测试系统的评估、维护以及扩展都有重大的意义和重要的价值。本文首先简要介绍了逆向工程和基于TTCN-3测试系统的逆向工程的特点,设计了逆向模型发现的系统框架,并详细介绍了静态分析器的设计和实现。
关键词:TTCN-3;逆向工程;测试系统;静态分析;元模型
TTCN-3是由ETSI制定和推动的测试规范和测试实现标准。它是一种描述能力丰富的基于黑盒的测试描述规范,能够应用于多种形式的分布式系统的测试规约描述。随着TTCN-3测试技术的不断发展,它已经被越来越多地应用到各种测试领域,基于TTCN-3的测试系统开发已经具备了和软件开发相似的特征。但随着测试系统规模的增长以及测试人员的变更,对于庞大的测试系统的管理和维护,已经变得越来越困难。因此对基于TTCN-3的测试系统进行逆向工程,可以帮助测试人员从更高层次把握测试系统的设计,同时可以检验测试设计和测试实现之间的一致性,对于测试系统的维护、扩展以及评估都有重大的意义和重要的价值。
本文设计了逆向模型发现的系统框架,基于Eclipse平台使用插件机制很好的实现了框架的扩展和复用。然后,通过扩展TRex工程中的TTCN-3静态分析器,设计相应的接口实现静态基本信息、静态测试配置、测试数据、调用关系等的提取。同时使用Testing Technologies公司的TTworkbench工具运行测试用例,获得测试轨迹,实现动态测试配置的提取。本工具正是从静态和动态两个方面向测试人员和维护人员展示了测试系统的基本信息和抽象设计,用于辅助测试系统的维护和更新。
1、逆向工程介绍
逆向工程是软件工程领域的一个重要分支,随着软件复杂性的提高和遗留系统的增多,逆向工程越来越受到人们的重视,从而有了广阔的发展空间。Chikofsky和Cross将逆向工程定义为一个分析目标系统的过程,它一般包括如下两个部分:
(1)识别系统的构件并分析构件之间的依赖关系;
(2)建立系统另外的或在更高抽象级别上的表达形式。按照上述定义的逆向工程本质上也是一个知识恢复、知识发现工程,对于软件这种无形的人工产物来说,逆向工程的主要目的首先是重现考察对象所体现的原有设计知识,其次是能发现一些在设计中没有明显表示出的、存在于设计人员头脑中的设计知识。
由逆向工程的定义可见,软件逆向工程的任务包括分析系统、抽象系统和展现系统,从而实现协助用户理解系统的目的。分析系统是指分析系统的结构及运行过程,但不管目标系统面向何种应用领域,分析系统不外乎是分析系统的静态信息和动态信息;目标系统面对不同的应用领域,要实现抽象目标系统的任务,需要领域知识和专家的经验;展现系统最好的方式是使系统可视化。由于系统的抽象过程离不开领域知识和专家经验,所以很难有统一的方法,因此一般只讨论分析系统的过程,即静态信息和动态信息的获取。
本文将传统的逆向方法应用到TTCN-3测试系统之上,分别从静态和动态两个方面获取信息,然后制定领域相关的算法,提取描述测试系统的抽象模型并进行展示。通过逆向工程,有利于测试人员和维护人员理解和维护测试系统。
2、基于TTCN-3测试系统的逆向工程
随着软件测试作用的日益突出,测试作为软件过程中的重要一环越来越受到人们的重视。传统的软件测试主要集中在手工测试阶段,更多的只是重复劳动。随着自动化测试技术的日益成熟,使得软件测试进入了飞速发展的阶段,但测试描述还没有一个统一的规范,目前广泛使用的有XML、TCL等。如何使测试变得更高效、规范和可重用,成为人们热烈讨论的话题。随着2001年ETSI组织的TTCN-3测试规范的提出,这个问题逐渐找到了解决的方法。TTCN-3测试规范中的核心语言类似于传统的程序设计语言,可以在更广泛的应用领域描述测试,为测试集的编写提供更大的方便性和灵活性。由于TTCN-3是在测试驱动之下产生的,所以其语法和传统的编程语言相类似,并带有专用的测试扩展特性。因此,TTCN-3比传统的程序设计语言更关注于对测试判断的处理、对SUT(System Under Test,被测系统)的激励和期望接收到的反馈信息的模板匹配机制、对计时器的处理、测试执行控制机制、动态测试配置、同步/异步通信功能、测试进程的分布方式和信息编码的能力等。
由于TTCN-3语言所特有的动态配置、同步异步通信机制等强大功能,使得测试人员在从测试设计到测试实现阶段很难保证彼此之间的一致性;其次,面对庞大的测试系统的管理和维护,也需要有工具辅助。这些问题必将随着TTCN-3测试语言的日益成熟而受到人们更多的关注。对基于TTCN-3的测试系统进行逆向分析,可以帮助测试人员和维护人员从更高层次上把握测试系统的设计,同时可以检验测试设计和测试实现之间的一致性,这些工作对于测试系统的维护、扩展以及评估都有重大的意义。
基于TTCN-3测试系统的逆向工程,本质上是一个测试设计和测试模型的发现过程。逆向工程的一个核心问题就是为目标系统进行建模,因此必须解决如何为TTCN-3测试系统建立元模型,进而在元模型基础上生成测试系统模型。然后在测试系统模型上施加领域相关的算法,实现测试设计和测试模型的抽象和提取。
3、模型发现系统框架设计
一般来说,逆向工程包括如下两个部分:一是识别构件并分析构件之间的依赖关系;二是建立系统的另外的或在更高抽象级别上的表达形式。逆向工程本质上是一个知识恢复、知识发现的过程。因此本文将逆向工程分为三个步骤:
(1)数据的提取:此时的数据是未经处理,通过静态或动态分析获得源文件的元数据,这是逆向分析和模型发现的基础;
(2)知识的组织:将提取到的元数据进行分类和存储,此时主要使用已经定义的通用模型或规格等将元数据进行重组,实现知识的构建;
(3)信息的展现:在已获得知识的基础上,施加某种领域相关的算法实现系统更高层次信息的组织和提取。
基于对逆向工程和模型发现技术的总结,本文为基于TTCN-3测试语言的逆向工程设计了模型发现的系统框架,如图1所示。该框架建立在Eclipse平台之上,使用了Eclipse平台所提供的插件扩展机制,使得该框架易于维护和扩展。同时该框架还重用了Eclipse平台所提供的大量基础设施,利于系统的集成和开发。框架主要分为三个部分:静态分析部分输入为TTCN-3测试集,输出为抽象语法树和符号表,同时还包括动态轨迹的提取,即获取了测试集的元数据;建模部分输入为U2TP和TTCN-3规范,在这个过程中设计了TTCN-3测试系统元模型,实现了U2TP到TTCN-3映射规则,输出为TTCN-3测试系统模型,即实现了数据的重组和信息的形成;展现部分输入为TTCN-3测试系统模型,通过施加领域相关的算法实现测试设计和测试模型的发现,输出为TTCN-3测试系统的各种视图,即进行了模型的展现。
图1 逆向模型发现框架
4、TTCN-3测试系统元模型设计
TTCN-3虽然提供了诸如TFT和GFT这种表格和图形化的描述形式,但只是描述测试用例的一种格式而已,无法展现一个测试系统的整体结构和逻辑。为了解决维护、改进和复用大量遗留测试系统代码的问题,需要为TTCN-3测试系统提供一个抽象层次更高的描述方法。因此,本文针对模型发现目标,借用U2TP中的具体概念,实现了U2TP和TTCN-3之间的映射关系,设计了TTCN-3测试系统元模型。
图2 TTCN-3测试系统元模型
参照U2TP对测试系统的描述和上面所制定的映射规则,本文将TTCN-3测试集抽象为四个部分:TestArchitecture、TestBehavior、TestData、Time,并定义了如图2所示的测试系统元模型。在设计过程中,本文考虑了逆向工程的特殊需求,对TTCN-3的元模型进行了相应的裁剪,方便测试系统模型的表示和展现。同时为了便于TTCN-3测试系统中基本信息的组织和存储,测试系统元模型中还定义了用于测试信息记录的相关数据结构。从图中可以看到,整个测试系统的根节点是TestSystem,每个测试系统会有自己的名字system,一般都是抽象测试集的名字。一个TestSystem中会包括四个逻辑部分,TestArchitecture、TestBehavior、TestData和Time。
此外,测试系统元模型还包括了TTCN-3测试语言中所特有的的测试特性,主要是一些枚举值的定义。主要包括通信的原子操作AtomAction、测试判定结果Verdict、测试通信类型CommunicateType、测试构件类型ComponentType、测试通信方向类型DirectType、测试函数类型BehaviorType等。
5、TTCN-3静态分析器的设计与实现
5.1 三种静态分析器的比较
为了便于定制需要的逆向分析工具,本文主要调研了开源的TTCN-3静态分析器。目前,主要有三种开源的面向TTCN-3的静态分析器可用,下面是对这三种静态分析器的对比分析:
ttthreeparser:由德国Testing Technologies公司早期开发的分析器,目前只支持TTCN-3v1.1.2版本,这是TTCN-3最早的一个版本,目前的测试脚本都是基于TTCN-3v3.1.1,在语法上进行了较大的调整,所以对本文的研究价值不大;
ttcn3parser:由Debian开源组织提供的基于Python的静态分析器,支持TTCN-3v3.1.1,但由于没有提供合适的接口和文档,因此需要重新改写里面的大部分文法,工作量太大;
TRex:由Motorola和德国的Gottingen大学合作开发,用于TTCN-3测试集的评估和重构,其中包括对TTCN-3v3.1.1的静态分析,并且定义了明确的接口和数据结构。
通过对上面工具的调研,本课题选用了TRex作为静态分析的工具,并在开源工具TRex静态分析器的基础上实现相应的接口、定义相应的数据结构,通过静态的逆向分析获取TTCN-3测试系统的基本信息和模型定义。TRex对TTCN-3的现有标准支持较好,同时还是一个开放源代码的研究性工程。另外,TRex以Eclipse插件的形式出现,这对于系统的扩展和集成非常有利。
5.2 TRex介绍
TRex是基于Eclipse插件机制实现的TTCN-3度量和重构工具,由Motorola公司和德国的哥廷根大学合作开发了这套系统。正向的TTCN-3工具一般都专注于核心编译器与测试执行器的开发,TRex属于逆向工程支持工具,其目标是分析和优化测试系统代码。Motorola公司发现,TTCN-3的编辑和执行固然需要工具支持,同样TTCN-3测试系统的维护和评估也需要有工具辅助。TRex的出现,使得TTCN-3测试代码的自动化度量和重构变为现实,同时也为评估测试系统设计的好坏提供了有力的依据。然而TRex无法帮助测试人员从更高层次上把握测试系统的设计,无法检验测试设计和测试实现之间的一致性。随着TTCN-3的发展,必将有更多的遗产测试系统需要被维护和升级,测试人员如何在最短时间内理解和掌握已有的测试系统,以及如何检验测试设计和测试实现之间的一致性,必将作为一个重大的问题受到人们的关注。本文的研究工作很好的满足了TTCN-3发展中的这种要求,同时结合TRex工具,必将为TTCN-3测试系统的管理和维护提供强有力的支持。
TRex主要用于TTCN-3测试系统的度量和重构,它主要分为三个模块,如图3:
● 将TTCN-3测试集作为输入,通过静态分析获得抽象语法树和符号表,即测试集的元数据;
● 将测试集的元数据作为输入,通过计算获取测试集的度量值,为测试集的好坏提供数据上的依据;
● 将测试集的元数据和度量值作为输入,通过变换语法树完成测试代码的重构。
通过静态分析、度量和重构,为测试集的维护提供了依据,同时输出质量更高的TTCN-3测试集。
图3 TRex体系结构
5.3 对TRex的扩展
编译器首先把程序员写的源程序转换成一种方便处理的数据结构,那么这个转换过程就是词法分析和语法分析。通过TRex分析TTCN-3源代码,可以获得抽象语法树和符号表。抽象语法树使用Tree作为数据结构,因为Tree有很强的递归性,将Tree中的任何结点Node提取出来后,Node依旧是一棵完整的Tree。这一点符合现在编译原理分析的形式语言,比如在函数里面使用函数、循环中使用循环、条件中使用条件等等,那么就可以很直观地表示在Tree这种数据结构上。
针对本论文研究所要解决的问题,主要考察了de.ugoe.cs.swe.trex.core中的de.ugoe.cs.swe.trex.core.analyzer.rfparser包,它里面包含了TTCN-3的静态分析器,
TRex按照ANTLR的文法定义了TTCN-3语言的BNF范式,然后使用ANTLR提供的工具包生成了TTCN-3的静态分析器。通过静态分析器对TTCN-3源文件的分析,可以获取TTCN-3的抽象语法树,然后使用符号表对基本信息进行再组织。
TRex中重要的数据结构包括Symbol、LocationAST、Scope和SymbolTable,如图4所示:
图4 TRex的符号表
TTCN-3中定义了丰富的元素类型,可以方便用户定义测试配置、测试行为和测试数据等。TRex为每个TTCN-3元素都定义了一种Symbol,如图5所示。
图5 TRex中的符号
在逆向分析过程中,本文主要分析了ModuleSymbol、TypeSymbol、SignatureSymbol、EnumSymbol、PortInstanceSymbol、SubtypeSymbol、TemplateSymbol、TestcaseSymbol、FunctionSymbol、AltstepSymbol等关键数据结构。
TRex主要用于TTCN-3测试集的度量和重构,TTCN-3脚本的编辑功能和静态分析功能是整个工具的核心。在此,本文还分析了TRex的编辑器、编辑器之上的事件响应策略模式、静态分析器的工厂模式以及TTCN-3静态分析器的入口程序。本文通过对静态分析器核心代码的研读,在TTCN3Analyzer中加入了自己定义的数据结构和接口,用于访问静态分析获得的各种信息,实现模型的逆向发现。
6、总结
本文设计实现了逆向模型发现的系统框架,并详细介绍了静态分析器的设计实现。测试模型的抽象和提取在技术报告《基于TTCN-3测试系统的静态测试配置模型和数据模型的发现》和《基于TTCN-3测试系统的调用模型和动态测试配置模型的发现》中详细介绍,而实验在技术报告《基于TTCN-3测试系统的逆向工程的实验及数据分析》中详细介绍。对基于TTCN-3的测试系统进行逆向工程,可以帮助测试人员从更高层次把握测试系统的设计,同时可以检验测试设计和测试实现之间的一致性,对于测试系统的维护、扩展以及评估都有重大的意义和重要的价值。