吳曉輝,王致富,張 正
(1.對外經濟貿易大學 金融學院,北京100029;2.中國科學院軟件研究所 軟件工程技術研究中心,北京100190;3.中國科學院研究生院 信息科學與工程學院,北京100190;4.中科軟科技股份有限公司,北京100190)
行業應用軟件是某行業內的核心軟件,是中國軟件產業崛起的好機會,但是由于涉及到管理、工程化、行業知識、個人表達能力等一系列問題[1],決定了行業應用軟件開發的復雜性。如何提高軟件開發的效率、保證軟件產品的正確性,是行業應用軟件開發過程中不可避免的問題。在行業應用軟件的開發過程中,自動化檢查和測試工具,能夠起到很好的輔助作用,它不僅能夠提高軟件系統的正確性,而且能夠通過一定程度的代替人工進行快速檢查,降低軟件系統的開發成本[2]。目前存在大量的自動化檢查工具 (如 FindBugs[3]、PMD[4])和 自 動 化 測 試 工 具 (如LoadRunner[5]、WinRunner[6]),這些工具提供了非常強大的檢查和測試功能,但是對于樣本程序[1]的使用情況檢查等行業應用軟件開發的個性化檢查需求,并不能提供很好的支持。因此本文提出了一種面向行業應用的軟件開發檢查工具,該工具緊密結合行業應用軟件的個性檢查要求,針對檢查的相關功能進行了設計和開發。在現有工具的基礎上,進一步改善代碼質量,提高系統的正確性,也為開發、測試、維護過程提供便利。
目前存在大量的自動化檢查和測試工具,例如在代碼自動化檢查方面,PMD和FindBugs能夠根據配置的規則,檢查出大量的代碼問題;在軟件的自動化測試方面,Load-Runner和WinRunner等工具提供了非常強大的測試支持。雖然這些工具解決了大部分常見的測試和檢查問題,但是對于以下4個方面沒有很好的支持,而以下方面是本檢查工具主要關注的4個方面:
(1)樣本程序的使用情況檢查:在行業應用軟件開發的過程中,樣本程序起著非常重要的作用[7],但是現有的代碼自動化檢查工具,只能對目標代碼進行全局的常規問題檢查,無法針對樣本程序的個性化特點,進行有針對性的個性規則檢查。
(2)數據結構與業務數據正確性檢查:對于行業應用軟件來說,存儲業務數據的數據結構、以及業務數據本身,是一個行業應用軟件系統的基礎,是最重要的管理對象,因此同一應用的不同部署之間的數據結構一致性、業務數據與數據結構及其業務規則的吻合程度等方面,也需要通過工具進行檢查和驗證。
(3)系統接口的可用性和效率的批量檢查:行業應用軟件系統比較復雜,系統之間通過接口進行交互是經常發生的,在大型的行業應用軟件系統中,這種交互更為復雜。但是對于接口是否正常運行,接口是否出現性能瓶頸等問題,大部分系統還是采用 “測試過程發現問題再進行補救”的方式,因此通過工具對接口進行功能正確性和高效性的檢查,對系統接口進行整體的把握,也是非常有必要的。
(4)日志文件的正確性檢查:日志文件是軟件維護的“黑匣子”,在維護過程中承擔著重要的角色,日志文件的存在和日志內容的正確性,對軟件維護過程至關重要。對于日志文件相關內容的檢查,也是非常必要的。
針對4個方面的檢查,在行業應用軟件系統的開發過程中是經常會出現的,但是目前沒有很好的工具來進行支持。
通過分析行業應用軟件的個性化檢查要求,以及現有工具的一些相關功能和不足,本文設計研發了一種面向行業應用的軟件開發檢查工具,該工具包括以下4個檢查功能:
(1)代碼檢查:是指在常規問題檢查的基礎之上,基于行業應用軟件的領域特點,結合樣本程序,對目標代碼進行進一步的個性規則檢查。
(2)數據結構檢查:包括對同一個應用系統的不同部署之間、業務數據與數據結構及其規則之間、歷史數據與新系統的數據結構之間的一致性檢查。
(3)接口檢查:是指在多個系統或同一系統的不同部署之間通過接口進行交互的情況下,針對眾多接口功能和性能的批量檢查。
(4)日志檢查:是針對日志文件、日志相關的配置文件的存在與內容正確性的檢查。
圖1是針對以上4個部分的功能模塊給出的檢查工具的體系結構圖。圖中分別列出了現有的工具的情況,以及本檢查工具提供的檢查功能的模塊。

圖1 工具的體系結構
對此體系結構圖的相關說明如下:
(1)現有的一些檢查工具,對于行業應用的以上4個特性的檢查,都存在一定的工具缺失,因此本檢查工具相關功能的提出、實現和應用,具有一定的現實意義。
(2)本檢查工具主要由CodeChecker、DBStructChecker、DBDataChecker、InterfaceChecker和LogChecker這5個功能模塊組成,每一個模塊都遵循公共的接口約定,便于工具的擴展和修改。
(3)針對代碼規范與功能正確性的檢查方面,我們在現有的代碼自動化檢查工具PMD基礎上進行樣本程序檢查相關的擴展,開發出了基于樣本程序和規則庫的代碼自動化檢查工具CodeChecker,通過PMD、FindBugs和CodeChecker的結合使用,共同提高代碼的規范性和代碼功能的正確性。
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文件及其內容的檢查,包括:打印出的日志信息的完整性;通過日志文件的最后修改時間與當前時間差來確定日志文件的有效性。
通過以上幾個方面的檢查,可以保證日志的配置、存放目錄、日志文件等方面的正確性,從而為系統維護的過程提供參考。
為實現對全國車險業務的有效管控,車險信息共享平臺在保監會和保險行業協會的管理下成功建設,該平臺與各財產保險公司、公安交通管理部門、稅務局等單位實現了實時的數據互聯,有力的保證了車險業務的合規開展和科學實施。
本檢查工具在車險信息共享平臺項目進行了初步的應用,應用效果非常好。
本檢查工具的應用效果主要從以下方面來分析:
(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個功能模塊的通用性,使這些功能能夠更好的應用于其他行業應用軟件系統的檢查過程;其次要繼續發掘行業應用軟件系統的個性檢查需求,研發更多實用的檢查工具,進一步降低軟件開發的成本支出,提高軟件系統的質量。
[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.]