张 欣
(北京控制工程研究所,北京 100190)
第三方独立测试是保证星上软件质量的重要方法,而动态测试是第三方独立测试过程中最重要的环节之一。软件的动态测试是指通过人工或使用工具对运行的被测软件进行检查、分析程序的执行状态和外部表现的活动[1]。动态测试过程包括测试需求分析、测试设计、测试环境开发、测试用例执行以及测试结果分析。简单概括,动态测试过程就是根据测试需求对测试数据进行分析并得到测试结论的过程。
目前,型号软件测试任务成倍增长,单一软件配置项复杂度不断提高,不同型号软件功能与对外接口千差万别,在此情况下,如何在保证测试质量的前提下,提高测试效率,按进度要求完成任务节点,是第三方独立测试所面临的重要挑战。而根据测试需求和设计,快速地搭建测试环境,使测试人员能够简单、有效地实施动态测试,并帮助他们高效地分析测试数据恰恰是关键所在。
传统的测试环境开发做法是针对被测软件运行环境和测试数据的差异性,定制不同软件专用的测试环境,包括I/O接口驱动、通信协议模拟、输入数据生成、输出数据解析处理等。这样的测试环境不仅通用性、可移植性差,调试难度大,而且功能扩展困难;即使功能只有微小差别的软件,如果换了开发人员,也很难做到只需对现有的环境进行局部修改就能快速适应测试需求,极大地延缓了测试项目的进度。
另外,测试人员对测试环境提出了许多新的需求,包括测试数据的实时显示、自动比对、可筛选、在线与离线分析、测试过程的回放以及关键数据或状态的监控等。这些都要求我们开发一种可配置的软件自动化动态测试系统。这里,可配置的概念是指针对不同软件,提取测试环境的可重用部分,将其固定下来,形成通用的功能,利用配置的方法,将差异部分描述出来,提供给通用的处理,实现差异部分的自动识别和处理,从而实现一个通用的软件动态测试系统。
本文提出了一个符合上述需求的自动化动态测试原型系统——CSTS(Configurable Software Testing System),并详细描述了CSTS的系统框架和关键技术。
如图1所示,CSTS系统主要由目标机或目标机模拟器、测试脚本驱动器、输入数据流生成器、输出数据流解析器以及数据综合分析与应用5个模块构成。
图1 CSTS系统结构图
目标机或目标机模拟器模块主要实现被测软件的运行环境,可以是真正的硬件目标机,主要应用于硬平台测试;也可以是目标机的软件模拟器,主要应用于软平台测试。目标机的软件模拟器包括两个部分,处理器芯片与内存模拟器以及I/O接口模拟器。
针对处理器芯片与内存模拟器,CSTS系统将特定的处理器芯片功能提取、封装成模块,并对外提供一致的软件接口和操作界面。针对I/O接口模拟器,CSTS系统模拟了多种常用接口芯片的功能,并定义了处理器与各I/O接口之间连接关系的描述语言。这样只需根据被测软件选取处理器芯片和I/O接口模拟器,并描述它们之间的连接关系,就可以迅速地搭建起被测软件的运行环境。
动态测试的运行过程由测试脚本驱动和控制。传统的做法是根据不同的被测软件定制专门的脚本令和脚本解析程序,这样做的缺点是由于脚本的语法和词法千差万别,使得脚本解析程序仅仅适应当前被测软件,不具备通用性、可移植性和可扩展性。
CSTS系统借鉴了文献[2]中提到的多脚本语言的测试数据分离方法,首先定义了脚本令的标准语法,使得解析程序的语法解析部分可以实现通用化。然后采用描述的方法定义脚本令的词法,解析程序结合描述文件可以得到它的词法含义。这样针对不同软件的测试脚本驱动部分,仅需要生成词法描述文件,不需要对脚本解析程序做任何修改,就能大幅度地提高测试环境的通用性、可移植性和可扩展性,缩减开发的工作量。
输入数据流生成与输出数据流解析两个模块实现测试数据的生成与解析功能。
这里测试数据的概念涵盖了被测软件输入输出数据和各种中间结果数据,包括被测软件的注入数据、其它软件发送给被测软件的数据、被测软件的遥测数据、被测软件通过各硬件端口发送给其他软件的数据、测试过程中测试环境产生的数据以及被测软件的内部变量值等。
目前,针对不同被测软件,要开发其专用的测试数据生成、解析程序。由于被测软件的测试数据格式定义不一致,数据源不统一,数据量不断加大,这种专门开发的方法耗费了大量的人力资源,增加了测试环境的调试难度,延缓了测试项目的进度。那么是否可以采用增加配置的方法,由测试人员定义测试数据,然后采取通用的方法生成或解析测试数据,从而达到针对不同软件采用通用方法生成或解析测试数据的目的呢?
输入数据流生成器可实现测试数据输入流的自动生成。CSTS系统针对测试数据流的输入,开发了通用的数据流生成组件,并定义了专门的输入数据流描述文件,测试人员在设计测试用例时,配置输入数据流描述文件;运行测试用例时,将文件通过脚本驱动提交给数据流生成组件,实现测试数据流的输入。
输出数据流解析器可实现测试数据输出流的自动解析。CSTS系统针对测试数据流的输出,开发了通用的数据流解析组件,并定义了专门的输出数据流描述文件,测试人员在完成测试需求分析后,根据被测软件输出数据的格式,配置数据流描述文件;测试运行时,CSTS调用数据流解析组件解析数据。
CSTS系统在测试数据的生成和解析中引入了通用组件结合配置文件的方式,极大地缩减了测试环境开发人员的工作量,大大提高了测试效率。
测试人员在获得解析了的测试数据之后,还需要综合地分析和应用测试数据,得出测试结论。 CSTS系统的数据流解析组件可以实现海量测试数据的筛选,关键数据或状态的监控和实时报告;测试数据显示组件可以实现测试数据的实时显示、报告以及测试过程的回放;获得输入和输出数据流及其描述之后,实现测试数据的在线、离线分析与自动比对并不困难。这样CSTS系统就为测试人员分析测试数据,得出测试结论提供了强大的支持。
限于篇幅,这里仅针对测试数据的生成、解析、分析以及应用模块的总体框架和关键技术做详细论述。
测试数据的生成、解析、分析以及应用模块的总体框架如图2所示。
图2 测试数据的生成、解析、分析与应用的总体结构图
a.配置器:测试人员应用配置器生成数据流描述文件,包括输入数据流描述文件和输出数据流描述文件。
b.数据流描述文件:对已确定类型的外部数据按照被测软件要求以二进制字节流格式进行形式化描述。
c.数据流生成器:通过脚本驱动,在确定的时间、确定的条件下,根据数据流描述文件将外部数据转换成二进制字节流。
d.输入数据流:按照星上软件数据流格式生成的二进制字节流。
e.输出数据流:将被测软件输出的数据以及各种中间结果数据集合的二进制字节流。
f.数据流解析器:根据数据流描述文件,按照测试人员定义的特定筛选和存储格式,实时解析和存储数据流源码,监视数据的取值范围和状态变化,触发事件报警。解析后的测试数据一边通过网络实时发送给数据流显示器提供实时显示功能,一边存储为数据表文件。
g.数据表文件:解析后的测试结果数据输出到数据表文件。
h.数据流交换器:定义了解析器与显示器之间的通信接口与协议。解析器采用通信服务的方式将解析结果实时发送给显示器并显示。
i.数据流显示器:以多种视图的方式显示解析后的测试数据,并显示报警事件。
j.数据库:存储整个测试过程产生的测试数据。
k.数据流回放:从数据库或数据表文件中筛选数据,提供给数据流显示器,完成测试过程的回放功能。
l.数据流视图:将同一份测试数据以不同的视图显示,这里提供了4种视图,即源码视图、数据表视图、图形视图、报警事件视图。
m.源码视图:按照字节显示测试数据的源码。
n.数据表视图:将测试数据显示成一张二维表,每收到一帧数据显示一行。
o.X-T图:以折线图、散点图、项平面图等图形显示测试数据。
p.报告视图:显示重要的数据和状态变化事件。
CSTS系统采用面向对象的方法定义了一套数据流描述规则,定义了5种主要的类,包括DataSet(数据集)类,Data(数据)类,BitDefine(码位)类,Value(数据值)类和Enum(枚举)类,类之间的关系如图3所示。
图3 数据流描述各类之间的关系图
DataSet类,代表一个二进制字节流,承载多个具体的数据。DataSet包含3个属性,分别为数据流的标识、名称和长度。DataSet关联一个或多个Data类。
Data类,代表一个具体的数据。Data包含7个属性,其中属性offset和length 主要描述数据在字节流中所处的范围。Data关联一个BitDeFine类。
BitDeFine类,定义一个具体数据在bit流上所处的范围。BitDeFine关联一个Value类。
Value类,定义具体数据的类型以及取值范围。属性type,表示数据的类型,可能的取值包括布尔型、整型、浮点型、枚举型以及被测软件采用的特殊数据类型,例如3字节浮点数、偏移二进制码、二进制补码等。
这里将枚举类型抽象成单独的类——Enum类,关联到DataSet下,以供其他的数据复用。
为了实现测试数据的实时显示、可筛选以及监控重要事件或状态等功能,这些类还定义了多个属性以及特定的方法。
有了抽象的模型定义,还需要具体的文件格式来承载这些描述规则,这种文件格式要求生成器或解析器方便快速地获取描述规则。CSTS系统采用XML(eXtensible Markup Language)技术定义数据流描述文件的格式。
XML技术目前被广泛应用在描述数据组织格式和内容的领域。国际标准化组织W3C针对XML制定了标准的程序接口——DOM(Document Object Model)。DOM是一个对象的集合,通过操纵这些对象,程序员可以操纵XML数据,对XML文档进行读取、遍历、修改、添加以及删除操作。Microsoft、IBM等大公司都提供了基于DOM的编程接口,供程序员操纵XML文档[3]。
数据流描述规则的各个类对应的是XML文档的元素,它们的属性定义为XML文档的元素属性。这样通过DOM接口就可以任意访问描述规则。CSTS系统还提供了编辑XML文档的配置器,使得测试人员不需要了解XML文档的具体结构和文法规则,就能够使用描述规则快速地配置数据流描述文件。
CSTS系统的数据流解析与显示功能,是建立在数据流的描述基础之上的。首先解析器注册数据流描述文件,提取描述规则,建立相应的内部数据结构。其次,在收到一帧字节流后,按照描述规则解析一帧数据。然后,应用数据流交换器将解析的数据一边保存成数据表文件,一边发送给数据流显示器,并保存到数据库内。最后,数据流显示器将经过分析和处理的测试数据通过采用多种视图的方式显示给测试人员。
从数据流的解析到显示的主要问题是怎样实现数据的交换。CSTS系统定义了解析器与显示器之间通信的接口与协议,通过数据流交换组件实现数据的交换。
数据流交换组件采用网络接口作为解析器与显示器之间的通信接口。采用目前各操作系统均支持的网络套接字技术实现网络通信接口。解析器和显示器构成客户端与服务器结构,解析器为客户端,显示器为服务器,结构如图4所示。
图4 解析器与显示器的接口结构
数据流交换组件的通信协议定义了4种基本的通信服务,包括目录传输服务、数据传输服务、文件传输服务以及报告传输服务。
目录传输服务实现一个数据集所有数据名和数据类型的传输。解析器在注册XML文件时调用该服务。显示器在收到目录传输服务报文之后,初始化各视图(数据表视图、图形视图等),为数据显示做准备。目录传输服务是一种初始化服务。
数据传输服务实现某个数据集一帧数据的传输。解析器解析一帧数据,将该帧数据的源码字节流和解析后的数据发送给显示器。显示器在收到数据传输服务报文之后,采用各种视图显示该帧数据。
文件传输服务实现解析器生成的数据表文件的传输。解析器利用文件传输服务将数据表文件传输给显示器,供显示器的回放功能使用。
报告传输服务实现报警事件的传输。解析器监视到报警事件,利用该服务将报警事件传输给显示器显示。
有了通信服务,还要采用一定的编码规则,定义通信服务的报文格式。
ASN.1编码标准是目前国际上比较通用的报文编码标准,广泛应用于工业过程控制领域的报文传输。CSTS系统以ASN.1编码标准为基础,定义了通信服务报文的编码规则[4,5]。
ASN.1标准采用可以嵌套的TLC结构定义报文。其中T(type)代表报文的类型,C(content)代表报文的内容,L(long)代表C的长度。C可以嵌套包含子TLC结构。
T由1个字节构成,当高4位取值为a,则表明该TLC结构中C的内容嵌套包含其它的TLC结构;如果T的高4位取值为8,表明TLC结构中C的内容没有嵌套。
T的低4位为结构标识,如果当前TLC结构描述通信服务,则T的低4位为通信服务标识号。表1给出了4种通信服务的标识号。
表1 通信服务的标识号
如果用当前的TLC结构传输数据值,则T的低4位为数据类型标识号。表2给出了所用数据类型的标识号。
表2 数据类型的标识号
L所占的字节数根据C的内容长度变化,如果C的长度在[0,127]内,那么L占1个字节,格式为XX;如果C的长度在[128,255]内,那么L占2个字节,格式为81,XX;如果C的长度在[256,65535]内,那么L占3个字节,格式为82,XX,XX;以此类推。
根据CSTS系统设计的基本思想,实现了它的绝大部分功能,并将其应用到实际的软件测试中,取得了比较好的效果。
首先,CSTS大大缩短了测试环境的开发与调试时间,提高了测试效率。
其次,将配置的方法引入测试环境,大幅度地增加了测试环境的通用性、可移植性和可扩展性。
第三,测试数据的实时显示,可筛选功能的实现,使得测试结果数据更加直观,便于测试人员及时发现被测软件的问题。
第四,测试数据的在线或离线分析、测试过程的回放以及关键数据或状态的监控等功能的实现,可以发现以往手工测试很难发现的软件错误,提高测试水平。
另外,CSTS还改变了测试人员的某些工作方式。在测试初期,测试人员通过编写数据流描述文件,使其能够快速、深刻地理解被测软件;在测试执行过程中,测试人员可以编辑自动化测试脚本,利用休息时间,一次执行多个测试用例,然后利用系统的回放功能,慢慢地分析测试结果。
这种可配置的软件动态测试系统也适用于包括卫星在内的航天器搭载软件的测试工作,是确保其搭载软件质量的重要方法之一。
当然CSTS离成熟的自动化测试系统的目标还比较远,需要通过更多的实际测试项目的检验,使其功能不断完善,而且测试人员对这种测试方法的熟练应用还需要一个过程。