摘要:對基于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的測試系統進行逆向工程,可以幫助測試人員從更高層次把握測試系統的設計,同時可以檢驗測試設計和測試實現之間的一致性,對于測試系統的維護、擴展以及評估都有重大的意義和重要的價值。