APP下载

面向行业应用的软件开发检查工具

2012-11-30吴晓辉王致富

计算机工程与设计 2012年4期
关键词:正确性数据结构日志

吴晓辉,王致富,张 正

(1.对外经济贸易大学 金融学院,北京100029;2.中国科学院软件研究所 软件工程技术研究中心,北京100190;3.中国科学院研究生院 信息科学与工程学院,北京100190;4.中科软科技股份有限公司,北京100190)

0 引 言

行业应用软件是某行业内的核心软件,是中国软件产业崛起的好机会,但是由于涉及到管理、工程化、行业知识、个人表达能力等一系列问题[1],决定了行业应用软件开发的复杂性。如何提高软件开发的效率、保证软件产品的正确性,是行业应用软件开发过程中不可避免的问题。在行业应用软件的开发过程中,自动化检查和测试工具,能够起到很好的辅助作用,它不仅能够提高软件系统的正确性,而且能够通过一定程度的代替人工进行快速检查,降低软件系统的开发成本[2]。目前存在大量的自动化检查工具 (如 FindBugs[3]、PMD[4])和 自 动 化 测 试 工 具 (如LoadRunner[5]、WinRunner[6]),这些工具提供了非常强大的检查和测试功能,但是对于样本程序[1]的使用情况检查等行业应用软件开发的个性化检查需求,并不能提供很好的支持。因此本文提出了一种面向行业应用的软件开发检查工具,该工具紧密结合行业应用软件的个性检查要求,针对检查的相关功能进行了设计和开发。在现有工具的基础上,进一步改善代码质量,提高系统的正确性,也为开发、测试、维护过程提供便利。

1 现有工具分析

目前存在大量的自动化检查和测试工具,例如在代码自动化检查方面,PMD和FindBugs能够根据配置的规则,检查出大量的代码问题;在软件的自动化测试方面,Load-Runner和WinRunner等工具提供了非常强大的测试支持。虽然这些工具解决了大部分常见的测试和检查问题,但是对于以下4个方面没有很好的支持,而以下方面是本检查工具主要关注的4个方面:

(1)样本程序的使用情况检查:在行业应用软件开发的过程中,样本程序起着非常重要的作用[7],但是现有的代码自动化检查工具,只能对目标代码进行全局的常规问题检查,无法针对样本程序的个性化特点,进行有针对性的个性规则检查。

(2)数据结构与业务数据正确性检查:对于行业应用软件来说,存储业务数据的数据结构、以及业务数据本身,是一个行业应用软件系统的基础,是最重要的管理对象,因此同一应用的不同部署之间的数据结构一致性、业务数据与数据结构及其业务规则的吻合程度等方面,也需要通过工具进行检查和验证。

(3)系统接口的可用性和效率的批量检查:行业应用软件系统比较复杂,系统之间通过接口进行交互是经常发生的,在大型的行业应用软件系统中,这种交互更为复杂。但是对于接口是否正常运行,接口是否出现性能瓶颈等问题,大部分系统还是采用 “测试过程发现问题再进行补救”的方式,因此通过工具对接口进行功能正确性和高效性的检查,对系统接口进行整体的把握,也是非常有必要的。

(4)日志文件的正确性检查:日志文件是软件维护的“黑匣子”,在维护过程中承担着重要的角色,日志文件的存在和日志内容的正确性,对软件维护过程至关重要。对于日志文件相关内容的检查,也是非常必要的。

针对4个方面的检查,在行业应用软件系统的开发过程中是经常会出现的,但是目前没有很好的工具来进行支持。

2 检查工具的体系结构

通过分析行业应用软件的个性化检查要求,以及现有工具的一些相关功能和不足,本文设计研发了一种面向行业应用的软件开发检查工具,该工具包括以下4个检查功能:

(1)代码检查:是指在常规问题检查的基础之上,基于行业应用软件的领域特点,结合样本程序,对目标代码进行进一步的个性规则检查。

(2)数据结构检查:包括对同一个应用系统的不同部署之间、业务数据与数据结构及其规则之间、历史数据与新系统的数据结构之间的一致性检查。

(3)接口检查:是指在多个系统或同一系统的不同部署之间通过接口进行交互的情况下,针对众多接口功能和性能的批量检查。

(4)日志检查:是针对日志文件、日志相关的配置文件的存在与内容正确性的检查。

2.1 体系结构图

图1是针对以上4个部分的功能模块给出的检查工具的体系结构图。图中分别列出了现有的工具的情况,以及本检查工具提供的检查功能的模块。

图1 工具的体系结构

对此体系结构图的相关说明如下:

(1)现有的一些检查工具,对于行业应用的以上4个特性的检查,都存在一定的工具缺失,因此本检查工具相关功能的提出、实现和应用,具有一定的现实意义。

(2)本检查工具主要由CodeChecker、DBStructChecker、DBDataChecker、InterfaceChecker和LogChecker这5个功能模块组成,每一个模块都遵循公共的接口约定,便于工具的扩展和修改。

(3)针对代码规范与功能正确性的检查方面,我们在现有的代码自动化检查工具PMD基础上进行样本程序检查相关的扩展,开发出了基于样本程序和规则库的代码自动化检查工具CodeChecker,通过PMD、FindBugs和CodeChecker的结合使用,共同提高代码的规范性和代码功能的正确性。

2.2 体系结构中的重点功能

2.2.1 针对特定领域的编程规范和代码质量的检查

PMD和FindBugs等第三方代码自动化检查工具,能够对目标代码整体进行常规问题的检查,但是在基于样本程序的行业应用软件系统中,随着样本程序的普遍使用,样本程序在使用过程中出现的代码问题越来越多,这些问题也需要通过代码自动化检查工具来进行检查。

对于开发人员来说,样本程序的主要使用方式为“抄”,在抄的过程中,结合个性化的功能需求进行个性化的修改以符合新的功能要求,这就是样本程序的 “相似性复用”。但是在样本程序的相似性复用过程中,有可能会因为开发人员对领域知识的不熟悉、对样本程序的使用规则的不了解、以及编程水平的参差不齐等原因,引起样本程序的使用错误。因此针对样本程序的使用,存在以下两个方面的内容需要进行检查:

(1)样本程序特征点的完整性

特征点是能够标识样本程序的结构特征的关键功能步骤代码,比如流程控制语句、特殊的公共组件调用代码、特殊的业务功能调用代码、样本程序结构标识注释等。

一般的,特征点是样本程序的结构特征的标识方式,反映了样本程序的执行流程的组件调用过程,在样本程序的相似性复用过程中,特征点在衍生程序中也必须存在,才能保证衍生程序功能的正确性。特征点的完整性检查,是现有的第三方工具无法做到的。

(2)样本程序的常见问题

除了样本程序特征点的缺失引起错误之外,其他在样本程序复用过程中引起的代码问题,我们就把它称为样本程序的常见问题。常见问题是在样本程序的局部代码范围内才会产生的问题,例如在某一段样本程序内,某一个变量必须声明为类变量[8]。

由于现有的第三方工具主要针对目标程序进行整体的规则检查,无法支持针对样本程序的局部规则检查,因此本工具给出了针对样本程序相关内容的检查工具Code-Checker。该功能首先结合样本程序库和样本程序的识别辅助,从目标程序中识别出衍生程序;接着利用基础检查规则,检查目标代码中的常规问题;最后,利用样本程序相关的个性化检查规则,检查目标程序中的衍生程序的正确性。该功能的检查流程如图2所示。

图2 代码检查流程

由图2可以看出,整个检查过程主要分为衍生程序的识别与基于知识库的代码检查两部分内容。该检查流程主要由以下部分组成:

(1)目标程序,即需要进行代码检查的源程序,其代码中包含了依据样本程序进行 “相似性复用”生成的衍生程序,需要对衍生程序进行识别。

(2)衍生程序识别辅助,用于辅助在目标程序中识别出衍生程序的识别过程,由骨架注释、词根表、样本程序库、特征点匹配引导等内容组成。其中,骨架注释是一种特殊的用于标识样本程序结构特征的代码注释,用于辅助衍生程序的简单快速识别;词根表是行业应用软件中用以表述领域术语的词码表[9],用于在功能单元名称相似性判断是提供判断依据;样本程序库是知识库的组成部分,为识别过程提供目标和依据;特征点匹配引导是规则引擎流程引导中关于特征点的修改前后映射关系的部分,在以特征点为识别依据的识别方法中需要用到。

(3)衍生程序识别工具,它扫描待检查的目标程序,并借助于衍生程序识别辅助的信息,通过一定的衍生程序识别策略,识别出目标程序中存在的所有衍生程序。

(4)衍生程序集是衍生程序识别工具的识别结果,每一个衍生程序中包含了对应的样本程序的相关信息,衍生程序集是样本程序个性代码问题检查的目标和前提。

(5)知识库,是所有可检查问题的程序和规则集合,由样本程序和检查规则组成,检查规则可以分为基础检查规则、特征点检查规则与常见问题检查规则。

(6)规则检查执行引擎,负责检查规则的解析执行与代码问题的检查汇总。它是以目标程序、衍生程序、知识库等内容作为输入,以代码中存在的问题作为输出。

(7)规则引擎流程引导。规则检查执行引擎是所有文件的公共执行流程,如果将此流程看成是一种脚本,那么规则引擎流程引导则是这一脚本的执行流程的控制条件集合。它主要用于引导规则检查执行引擎的执行过程,让工具的使用者能够个性化的定制每一个目标程序的检查流程,特征点匹配引导是规则引擎流程引导的重要内容之一。

2.2.2 针对数据结构与业务数据记录的检查

针对数据结构与业务数据记录,存在以下两个方面的问题或要求:

(1)一般的,同一行业应用软件系统通常会在不同地域、不同级别的公司或部门进行部署,例如:在总公司、多个分公司进行部署,而每一个部署可能拥有单独的数据库进行业务数据存储,由于隶属于同一软件系统,这些数据库结构必须保持高度的一致性,否则将会影响系统的正常交互,并增加维护的难度。

(2)业务数据迁移是系统进行升级和维护时经常要进行的操作。在数据迁移时,先从原系统的历史数据库中将历史业务数据取出,通过一定的转换规则,将业务数据对应到新系统的数据结构,最终转入新系统的数据库中。一般这个过程都是通过存储过程,或者数据迁移的程序来完成的。在这个过程中,如果转入的数据不符合新数据结构的规则,那么整个迁移的过程可能就会受到严重阻碍。为了减少迁移过程中遇到的阻碍,有必要对原系统中的业务数据进行数据迁移的预检查和预处理。

因此,针对数据结构与业务数据记录的检查,主要分为以下3个方面:

(1)对于同一个应用系统的不同部署之间,数据库的结构必须保持一致;

(2)业务数据与数据结构、数据结构对应的规则之间必须保持一致;

(3)原系统的历史数据必须与新系统的数据结构、数据结构的规则保持一致。

目前尚没有相关的工具能够做到这些方面的检查,因此本工具给出了这些检查的相关功能及其工具DBStruct-Checker和DBDataChecker。

DBStructChecker用于检查数据结构之间的一致性,DBDataChecker用于检查业务数据与数据结构及其规则之间的一致性。

DBStructChecker首先建立一个基准数据库,通过对基准数据库中的数据结构特征的获取,来检查目标数据库中数据结构特征的一致性,比如:通过对数据表、数据表字段、索引、主外键关联[10]等内容的一致性检查,即可对比出待检查的数据库结构与标准库结构之间的差异。DBStructChecker的主要处理流程如图3所示。

图3 数据结构检查流程

数据表名称、数据表字段、索引、主外键关联等信息,都能够从数据库的系统表中进行获取,例如sysindexs表存储的索引信息、syscolumns表存储数据表的列字段、sysforeignkeys表存储数据表的外部关键字[11]。

DBDataChecker是对业务数据的检查模块,功能包括对数据库中的现有数据的检查以及对数据迁移之前的历史数据的检查和预处理。其中,对现有数据的检查主要是用来找出系统库中的不符合业务规则的数据;对历史数据的检查和预处理,主要是为了顺利的完成数据迁移的过程。

业务数据的合法性检查,需要针对数据表结构制定业务数据检查规则。通过制定一个数据表的所有字段的取值检查规则矩阵,并针对业务数据进行规则检查,来实现业务数据的合法性检查。其具体的处理流程如图4所示。

在执行历史数据检查之前,必须配置历史数据表与目标数据表之间的字段映射关系,需要注意的是,一个历史数据表的多个字段,在新数据库中有可能对应不同的数据表,图4给出的是一种相对简单的情况。

业务数据的存储方式可以多种多样,数据库、包含字段分隔符的文本文件、Excel文件等,都可以作为业务数据的存储方式。

图4 业务数据检查流程

通过数据结构检查功能DBStructChecker和业务数据检查功能DBDataChecker,针对数据结构和业务数据进行检查,可以更好的保证数据结构的一致性,以及业务数据与数据库表结构之间的一致性。

2.2.3 针对接口的功能、性能的批量检查与报表

通常,一个企业的业务支撑需要若干个应用系统,少则几个,多则几十个。这些系统提供了复杂的接口功能,并且每一个系统可能存在众多的系统部署,此时需要测试的功能接口的数量将会以较快的速度增长。而每一个接口的可用性和高效性,是测试人员在进行与接口相关的功能测试之前,必须要验证的一些信息。目前这些信息的获取,主要通过人工方式来进行,工作量比较大,容易出错,工作的重复性较高,并且不能保证测试结果的实时性。因此需要有相应的工具,来支持接口的可用性、效率等信息的快速、自动收集。

针对这一需求,本工具给出了针对接口的功能和性能的批量测试工具InterfaceChecker,该工具通过读取目标接口的配置信息,获取对应的请求报文,通过程序自动向目标接口发送模拟报文,接收目标接口返回的结果,并记录整个测试处理的时间。最后通过对测试结果和处理时间的报表,直观的给出当前各个接口的可用性和效率的情况。

在工具执行接口检测之前,需要对工具进行如下内容的配置:

(1)目标主机的信息,包括主机名称、主机地址、用户名、密码等;

(2)待测试的接口信息,包括接口名称、接口描述等;

(3)测试用的模拟报文,针对每一个接口都需要请求报文,一般报文以XML[12]文件的方式编写。

针对接口的功能和性能的检查流程如图5所示。

图5 接口批量检查流程

针对该流程图的相关说明如下:

(1)在执行接口的批量测试时,需要针对每一个服务器,对每一个接口,都构造对应的访问链接地址,并且针对该地址发送接口对应的请求报文。

(2)接口与报文之间是一一对应的,每一个待测试的接口都需要一个请求的报文,并在测试结束后对返回的报文进行解析,以便获知接口的可用性。

(3)对于性能方面,在每一个接口的测试过程中,计算报文发送与结果接收之间的时间差,即可获取接口的访问时间。

2.2.4 针对系统日志的正确性检查

系统的日志是系统运行过程的轨迹记录,是系统维护的重要参考。因此日志文件及其内容的正确性,对于系统维护至关重要。针对日志文件是否存在、存放位置是否正确、日志的级别设置、日志信息的格式、日志文件的存储形式、日志信息的内容完整性等方面的检查,能够提高日志文件及其内容的正确性,为维护过程提供保证。

针对以上要求,本工具给出了日志的正确性检查工具LogChecker,该工具主要检查行业应用软件开发过程中使用的日志记录工具的相关配置,以及生成的日志结果文件内容的正确性。

以J2EE[13]的Web应用为例,最常用的日志记录工具是第三方工具log4j[14],而且一般配置log4j的方式都是编写log4j.properties文件,并将文件放置在源代码的根目录下。针对log4j的日志文件检查可以分为以下方面:

(1)针对log4j的配置文件log4j.properties的检查,包括:配置文件log4j.properties在源代码根目录下是否存在;配置文件中的日志项配置是否正确性,比如日志级别必须为INFO,日志输出的目的地必须为DailyRollingFileAppender(每天产生一个日志文件)等;日志的输出方式必须为PatternLayout,且必须正确的设置输出的格式。

(2)针对日志文件存放路径的检查,包括:是否在log4j.properties文件中设置了日志的存放路径;是否在JVM[15]参数中正确无误的配置了日志的存放路径。

(3)针对日志log文件及其内容的检查,包括:打印出的日志信息的完整性;通过日志文件的最后修改时间与当前时间差来确定日志文件的有效性。

通过以上几个方面的检查,可以保证日志的配置、存放目录、日志文件等方面的正确性,从而为系统维护的过程提供参考。

3 应用效果分析

3.1 应用背景

为实现对全国车险业务的有效管控,车险信息共享平台在保监会和保险行业协会的管理下成功建设,该平台与各财产保险公司、公安交通管理部门、税务局等单位实现了实时的数据互联,有力的保证了车险业务的合规开展和科学实施。

本检查工具在车险信息共享平台项目进行了初步的应用,应用效果非常好。

3.2 应用效果分析

本检查工具的应用效果主要从以下方面来分析:

(1)提高了代码的规范性和代码质量

在PMD、FindBugs等第三方工具与样本程序检查工具CodeChecker的共同作用下,不仅找出了代码中存在的一些常规的问题,而且针对于系统开发过程中用到的样本程序的检查,进一步检查出了样本程序使用过程的代码问题,抽取一个比较典型的样本程序进行代码自动化检查,一共检查出83个代码问题,其中50个基础问题,20个特征点的问题,以及13个常见问题,可以看出,CodeChecker检查的样本程序个性问题的数量比例为

样本程序检查问题占比

= (特征点问题数+常见问题数)/总问题数

= (20+13)/83=39.76%

由此可见,CodeChecker在常规问题检查的基础上,进一步检查了样本程序相似性复用产生的个性代码问题,此结论在整体的检查结果中也得到了比较好的验证。Code-Checker功能的运行截图如图6所示。

(2)数据结构检查工具DBStructChecker保证了数据结构之间的一致性,而业务数据检查工具DBDataChecker找出了现有系统数据库中的不合法数据,并为数据迁移的数据提供了预处理的方式,减少了数据迁移执行过程的错误几率。

DBStructChecker的部分运行结果如图7所示。DBData-Checker的部分运行结果如图8所示。

(3)接口检查工具InterfaceChecker对接口的功能和性能进行批量的测试,并最后生成报表供项目管理者和测试人员进行参考。不仅减少了重复性的人工操作,而且提高了测试的正确性和实时性。

目前车险信息共享平台系统中共有24个接口需要测试,而且现有37个应用部署的接口需要测试,因此一共有888个接口需要测试,如果通过人工的方式进行测试,假设平均每一个接口的报文整理 (假设接口测试对应报文已经确定)、测试执行、结果整理、耗时统计、填写报表等工作需要1分钟来进行,则一共需要888分钟 (合14小时)才能测试完所有的接口。

现在利用工具对接口进行测试并最终生成报表,耗时小于5分钟,效率提升非常明显。

(4)日志检查工具LogChecker通过检查日志文件、日志配置文件、JVM参数中对日志文件存放路径的配置等方面,保证了日志内容配置的正确性和有效性,保证了维护工作中日志内容的正确和可靠。

4 结束语

在行业应用软件开发的过程中,现有的通用测试和检查工具提供了非常好的辅助,但是有时候也必须针对现有系统的个性化检查要求,自主开发相应的工具来支持这些个性化的检查要求。

本文结合目前行业应用软件系统开发过程中通用工具的不足,给出了一种面向行业应用的软件开发检查工具,该工具通过针对特定领域的编程规范和代码质量的检查,提高了系统的代码规范性和正确性;通过针对数据结构与业务数据记录的检查,保证了数据结构和业务数据的一致性;通过针对接口的功能和性能的批量检查,提高了接口测试的效率和实时性;通过针对系统日志的正确性检查,保证了日志文件的正确性,为维护提供重要依据。通过以上功能的共同作用,提高系统的代码规范性和功能正确性,也为开发、测试、维护过程提供了便利。

在下一步工作过程中,要逐步提高4个功能模块的通用性,使这些功能能够更好的应用于其他行业应用软件系统的检查过程;其次要继续发掘行业应用软件系统的个性检查需求,研发更多实用的检查工具,进一步降低软件开发的成本支出,提高软件系统的质量。

[1]ZUO Chun.Industry software developing method based-on imitation [J].Computer World,2006,27 (45):1-3 (in Chinese).[左春.行业软件开发要靠 “抄” [J].计算机世界,2006,27 (45):1-3.]

[2]JIN Hu.Study on automatic software testing techniques and methods[D].Chengdou:Sichuan University,2006 (in Chinese).[金虎.自动化软件测试技术研究 [D].成都:四川大学,2006.]

[3]FindBugs [EB/OL].http://findbugs.sourceforge.net/,2011.[4]PMD [EB/OL].http://pmd.sourceforge.net/,2011.

[5]YU Yong.Software performance test and practice in LoadRunner[M].Beijing:Posts and Telecom Press,2010 (in Chinese).[于涌.精通软件性能测试与LoadRunner实战 [M].北京:人民邮电出版社,2010.]

[6]WinRunner [EB/OL].http://en.wikipedia.org/wiki/HP _WinRunner,2011.

[7]YUAN Weimin,ZUO Chun.Domain development platform based on typical program [J].Computer Engineering,2010,31 (18):3979-3982 (in Chinese).[袁伟民,左春.基于样本程序的领域开发平台研究与实践 [J].计算机工程与设计,2010,31 (18):3979-3982.]

[8]Bruce Eckel.Thinking in Java [M].4th ed.Beijing:China Machine Press,2007 (in Chinese).[Bruce Eckel.Java编程思想 [M].4版.北京:机械工业出版社,2007.]

[9]ZUO Chun.Etyma sheet and data structure in industry software[J].Computer World,2007,28 (44):1-3 (in Chinese).[左春.行业应用软件中的词根表与库结构 [J].计算机世界,2007,28 (44):1-3.]

[10]Abraham S,Henry F K,Sudarshan S.Database system concept[M].YANG Dongqing,MA Xiuli,TANG Shiwei,transl.5th ed.Beijing:China Machine Press,2006 (in Chinese).[Abraham S,Henry F K,Sudarshan S.数据库系统概念 [M].杨冬青,马秀莉,唐世渭,译.5版.北京:机械工业出版社,2006.]

[11]ZHAO Jie.Administrator's guide to SQL server 2005 [M].Beijing:Electronic Industry Press,2008 (in Chinese). [赵杰.SQL Server 2005管理员大全 [M].北京:电子工业出版社,2008.]

[12]Extensible markup language(XML)[EB/OL].http://www.w3.org/XML/,2011.

[13]YU Haodong.J2EE application framework design and project development[M].Beijing:Tsinghua University Press,2008(in Chinese).[余浩东.J2EE应用框架设计与项目开发[M].北京:清华大学出版社,2008.]

[14]Log4J[EB/OL].http://logging.apache.org/log4j/1.2/,2011.

[15]ZHOU Zhiming.Understanding Java virtue machine:JVM senior feature and best practice[M].Beijing:China Machine Press,2011(in Chinese).[周志明.深入理解Java虚拟机:JVM高级特性与最佳实践 [M].北京:机械工业出版社,2011.]

猜你喜欢

正确性数据结构日志
一名老党员的工作日志
扶贫日志
一种基于系统稳定性和正确性的定位导航方法研究
游学日志
浅谈如何提高水质检测结果准确性
“翻转课堂”教学模式的探讨——以《数据结构》课程教学为例
高职高专数据结构教学改革探讨
双口RAM读写正确性自动测试的有限状态机控制器设计方法
TRIZ理论在“数据结构”多媒体教学中的应用
《数据结构》教学方法创新探讨