?

基于約束的服務化軟件測試系統

2019-06-11 03:39李昌建錢巨程浩周輝
計算技術與自動化 2019年1期
關鍵詞:軟件測試

李昌建 錢巨 程浩 周輝

摘要:面向服務的軟件體系結構近年來不僅在民用領域得到廣泛應用,也越來越多地應用于軍用裝備軟件系統研制。服務化軟件的測試技術得到了越來越多的關注。傳統的服務化軟件測試工具大多關注于測試流程的自動化,在測試用例的自動生成等方面,還遠不夠成熟?,F有測試技術和工具尤其難以表達真實應用中的業務邏輯規則,給生成高質量的測試帶來許多困難。鑒于此,研發了一款針對服務化系統的軟件測試原型工具。該工具運用一階邏輯公式表達業務邏輯約束,基于23 SMT約束求解器生成測試用例、進行故障注入等,使得測試數據的生成更契合待測軟件業務特征,為服務化軟件的測試實踐提供了更有力支持。

關鍵詞:Web服務;軟件測試;測試用例生成;故障注入;SMT

中圖分類號:TP311

文獻標識碼:A

面向服務的軟件體系結構近年來不僅在民用領域得到廣泛應用,也越來越多地應用于軍用裝備軟件系統研制。包括我國在內,許多國家的C4ISR軍用信息系統中均已開始應用Web服務技術[1]。Web服務技術的廣泛應用對服務化軟件系統的可靠性、安全性提出了更高要求。作為保障可靠性與安全性的一種重要手段,服務化軟件的測試技術也得到了越來越多的關注。國外的SoapUI[2]、ParasoftSOAtest[3]、SoapSnoar[4]等工具,已為Web服務系統的測試提供了許多支持。研究者們也廣泛探討了各類Web服務測試技術[5][6]。然而,現有的服務化軟件測試工具大多關注于測試流程的自動化,重在運用工具來完成消息報文的發送和收集等。在測試用例的自動生成等方面,還遠不夠成熟?,F有測試技術和工具尤其難以表達真實應用中的業務邏輯規則,給生成高質量的測試帶來許多困難。比如,在服務單元的測試用例生成方面,大多數工具僅能根據整數、浮點數等接口數據類型,使用隨機、邊界值等方式生成測試數據。對于接口數據存在復雜業務邏輯相關約束條件的情況處理能力較為有限,生成的測試數據不貼近待測應用的業務特性,有效性較差。德國的Heckel等[7]、北京大學的姜瑛等[8]、清華大學的白曉穎等[9]、西北工業大學侯俊等[10]研究了數據存在約束條件情況下的測試用例生成問題。他們用區間限制、OWL-S等機制表達接口數據上存在的約束。其中,盡管OWL-S等機制具有較強的約束表達能力,但這些工作在根據約束生成測試用例時,大多只能處理約束施加在單一輸入因素上的情況,對于形如a

隨著SMT求解[11]等技術的發展,約束系統在表達能力和求解能力等方面得到了長足進步,也涌現了23[12]等一批成熟的約束求解工具,為構建新型的基于約束求解的測試工具提供了契機。據此,本文提出了一個基于約束的服務化軟件測試原型工具,該工具使用一階邏輯作為約束的主要表達方式,利用23 SMT約束求解器來支持復雜約束條件下的測試用例生成。除了將約束求解技術應用于Web服務單元級的測試用例生成,工具還將約束求解技術應用于服務調用序列的生成、基于符號執行的組合服務測試數據生成、面向業務邏輯的故障注入等方面,拓寬了約束系統在服務化軟件測試領域的應用范圍。在測試方法支持的數據類型及類型上的運算方面,借助23工具強大的約束求解能力,工具不僅能夠支持一般整數類型上的線性運算,還能夠對浮點數上的測試數據。生成提供一定程度的支持,甚至支持按位運算等約束系統中可能出現的復雜運算公式。通過對字符串進行整數編碼,以及應用基于正則表達式的字符串生成等技術,拓廣了測試功能能夠支持的Web服務類型范圍。

1 系統結構

Web服務測試原型工具基本界面如圖1所示。該工具支持Web服務描述的靜態檢測、服務單元測試、服務調用序列測試、組合服務測試、服務故障注入測試、Web服務性能測試等核心功能,如圖2所示。其中,工具通過獨立的約束系統管理模塊,來維護待測項目中的各種業務邏約束。這些約束依賴于待測應用的功能特性,而非測試過程中的某一具體活動,可廣泛應用在服務單元的測試用例生成、服務調用序列生成、組合服務測試用例生成、服務故障注入等多個方面。

為保證靈活性,測試工具采用了如圖3所示的物理結構。整個系統由測試用例設計器TestDe-signer、測試任務執行器ServiceExecutor、服務部署容器SvcHost、以及代理轉發網關RedirectProxy四大基本模塊構成。

測試用例設計器TestDesigner負責測試用例的設計、測試結果的收集等任務,提供一個用戶界面,以便于用戶編輯和查閱測試用例及其執行信息。測試任務執行器ServiceExecutor從測試用例設計器接收測試任務,根據任務要求展開實際測試動作,該模塊也可脫離用戶界面,通過腳本驅動。服務部署容器SvcHost用于發布待測服務和安裝、控制虛擬服務。代理轉發網關RedirectProxy用于監控不同服務之間的消息流??稍诖砭W關上設定故障注入或性能控制要求,以控制目標服務的功能和性能表現。

2 約束系統管理

原型工具采用集中管理方式維護待測應用中的業務邏輯約束。圖4展示了工具中的約束管理界面。系統支持23約束求解工具能夠處理的大部分一階邏輯約束公式。為便于結合Web服務的特點來表達約束關系,測試工具定義了自己的約束表達語言,該語言將被翻譯為23約束求解工具接受的約束語言以進行約束求解,所得的約束滿足或不滿足解將被翻譯映射回Web服務上的相關數據,以進行測試。

2.1 約束變量

約束公式建立的基礎是約束變量,系統支持兩種類型的約束變量。

1)值約束變量。其表達形式為

value( svc/operation/message_path),

其中value是變量類型名,用以區分其它類型的約束變量。svc是服務標識,用以區分不同的服務,可通過宏定義方式預先定義出svc名稱的具體含義。operation是Web服務的操作的名稱,mes-sage_path是由操作到基本元素參數的路徑。例如“svc=http: //test.com/axis2/services/Add”表達add服務的服務地址,可通過svc值找到服務?!皏alue( svc/add/a)”表達svc服務中的add操作的a參數的取值。

2)時間約束變量。其形式為

startTime( svc/operation)

其中startTime是約束變量的類型名稱,整個約束變量表達了某一服務某一操作在服務調用過程中的啟動時間。

2.2 約束公式

工具中的約束公式本質上是23求解器支持的一階邏輯公式,可以建立在單個服務操作的不同參數之間。包括輸入參數之間,用以表達輸入數據上的限制;也包括輸入和輸出參數之間,用以描述一個服務操作的輸出和輸入之間可能存在的某種聯系。約束公式還可以建立在不同服務之間,主要用于描述服務調用在時序上應該存在的關系。典型的約束公式示例如下。

1)值約束。形如

value( svc/add/a)< value( svc/add/b),

表達svc服務中add操作的a參數取值應小于b參數取值。

2)時序約束。形如

startTime( svc/add)

表達svc服務add操作的調用應該在multiple操作之前。

約束用AND、OR、NOT關系構成的樹進行組織。樹的葉節點是基本約束,每個約束含有一條約束公式?;炯s束通過AND、OR、NOT關系構成更復雜的約束系統。每個約束節點可以命名,以直觀表達約束的含義。例如

value (svc/add/a)>0 and value (svc/add/a)

表達svc服務中add操作包含兩個基本約束,并通過AND關系組合成一個復雜約束。3 基于約束的服務單元測試用例生成

原型工具支持基于約束來生成有效和無效測試數據。針對每個待測服務操作,可以生成滿足約束的有效測試數據或者不滿足約束的無效測試數據。測試用例的具體生成流程如圖5所示。首先從待測項目的整個約束樹中提取目前所關注的服務操作相關的約束,例如“value( svc/add/a)+10”.

第二步,建立從服務操作輸入數據到各個約束變量之間的關聯,約束變量的求解結果即這些參數將要設定的取值。然后,利用23求解引擎進行約束求解,目前系統支持線性不等式約束、布爾約束、按位運算約束、字符串枚舉類型上的判定等約束類型。下一步,根據求解所獲得的約束變量取值導出服務操作的參數取值設定。最后,根據參數取值構造服務操作測試時所需的完整SOAP數據包,以發起服務調用。

例如,對于Add服務規定add操作規定參數值α小于參數值b,生成滿足約束的測試數據的操作如下。首先提取約束到約束配置界面,給出約束標識svc的值“svc=http://test.com/axis2/services/Add”及約束表達式的具體形式其次,“value( svc/add/a)

測試用例生成中,基于約束生成無效測試數據的過程與生成有效測試數據的過程非常接近。主要差別在于獲得所有約束后,需要對約束取反,從而求解獲得違反約束的不合理取值。

在Web服務中,經常需要使用字符串類型,字符串常以枚舉常量形式出現,以作為狀態標識等。為支持字符串類型上的測試生成,我們用整數對所有出現的字符串常量進行編碼,如此,字符串在某一枚舉集中取值、字符串相等、字符串不等等問題,可以轉化為整數上的判等問題,同樣可采用23工具進行約束求解。獲得相應的解后,我們將整數編碼重新映射回字符串,可以獲得滿足或不滿足約束要求的字符串。一些字符上常存在正則表達式表示的模式限制,比如要求密碼字符串的模式為[0-9][0—9][0—9],表示密碼是三個數字構成的串。對此,原型工具使用Xeger程序庫[13],借助基于正則表達式的字符串生成技術來生成相應的滿足或不滿足約束的串。4 基于約束的服務調用序列測試生成

服務調用序列可用于檢測服務內部是否正確實現了無狀態特性,不會因歷史上的其它調用而影響后續的服務執行,也可檢測數據是否能夠在相關服務操作間有效流轉,對于服務系統整體的質量保證具有重要意義。

在服務調用序列測試中,我們首先需要根據服務操作間輸入輸出參數的匹配情況、多維組合覆蓋要求等,生成用于測試的候選服務操作調用序列。然而,并非上述每一序列對于實際測試均有意義。一個服務化應用的功能特性可能決定在用戶的使用過程中,A服務操作的調用永遠發生在B服務操作之前,這時測試A操作發生于B操作之后的服務調用序列顯然意義不大,需要將此類序列進行排除。另一類情況下,服務實現人員可能認為用戶一定先調用A操作,然后再調用B操作,而實際情況中,用戶可能按相反的順序使用。這時,為測試服務系統的健壯性,反而需要測試B先A后的情況。為支持上述測試,本測試工具支持對服務操作間的合理調用時序進行約束建模,然后根據時序約束的滿足與不滿足性來生成用于測試的服務調用序列。

服務調用序列的生成過程以滿足輸入輸出參數的類型匹配要求為首要出發點,首先根據上述要求生成一批前后服務調用間輸入輸出能夠全部或部分銜接的候選序列。然后,根據約束滿足情況對這批候選序列進行過濾,獲得有效或無效測試序列。在此基礎上,再根據組合要求進行進一步測試用例選擇。

在檢驗一個候選服務調用序列是否滿足業務邏輯限定的時序約束時,首先從待測項目的約束系統中,找出相關服務操作對應的時序約束關系,即一組startTime約束變量上的不等式。例如,如下約束:

startTime( svc/add)

限定了svc服務中的add操作一定發生在其sub操作之前。

然后,將待檢測的候選序列所蘊含的操作間先后關系也轉換為startTime大小關系加入到約束表中。例如,對于一個操作序列,其蘊含的時序約束可以表達為:startTime(a)

最后,取用戶定義的業務邏輯約束和當前候選序列中所蘊含的先后約束關系聯立為不等式組,采用23求解器進行約束求解。如果不等式組有解,表明能夠找到各個服務操作的startTime()變量取值,使得無論是用戶的業務邏輯要求,還是當前序列所要求的順序都能夠得到滿足,當前生成的這個操作序列是合理的;否則表明當前操作序列不合理,序列為無效服務操作調用序列,對應無效測試用例。

例如,對于Calculate服務,其中的蘊含的時序約束表達為:“startTime(add)

5 基于約束的故障注入

本服務化軟件測試原型工具還支持基于約束的故障注入。故障注入過程首選選擇一批測試用例作為注入基礎,然后選擇一批注入點來實施注入。故障注入點以服務操作進行標識。這些服務操作可以是基礎測試用例中直接調用的服務操作,也可以是基礎測試用例所調用的服務操作內部所間接調用的其它服務操作。

本測試系統中,所有的服務間消息傳遞都經過RedirectProxy代理模塊,因此,在該代理中進行監控,可以比較方便地識別各個故障注入點。通過在代理過程中,將原先的正常輸入數據替換為異常數據,可以注入錯誤,檢測整個服務化系統對于異常的容錯情況。

原型系統支持面向消息結構的注入、面向通信的注入、面向業務邏輯的注入三種注入方式。面向消息結構的注入主要注入不匹配預定消息格式的SOAP報文,如增加無效參數節點、刪除有效參數節點、參數節點亂序等;面向通信的注入主要注入網絡傳輸故障,如消息重復、消息丟失、消息亂序的等;而面向業務邏輯的注入主要注入結構合法,但數據內容不滿足業務邏輯約束的異常數據。

對于面向業務邏輯的故障注入,如果某add服務正常情況下相關業務邏輯要求其a參數取值小于b參數,即:

value( svc/add/a)< value( svc/add/b).

那么,在故障注入中,我們會對正常的輸人參數進行篡改,使得α的值大于等于b。如此,可以注入一個格式正常,但數據內容通常不會出現的異常情況。例如,對于以上約束,我們將通過取反,獲得其否定形式:

not value( svc/add/a)< value( svc/add/b)

通過利用SMT求解器求解該約束條件,可以生成一個違反業務邏輯的故障數據{a=98,b=98)。該故障數據可以模擬由于軟硬件錯誤造成程序邏輯異常的情況,將更接近真實場景中可能發生的故障。測試用例生成后,故障注入選項選擇“違反取值約束”選項。

故障注入測試實施后,系統將報告測試執行結果,同時展示生成的異常報文,以便于用戶了解容錯情況。如圖8所示,Add服務故障注入前的數據是{a=98,b=99),故障注入后的數據為{a=869,y=99},測試執行結果數據為{result=968}。

6 結論

測試工具的主要創新點是將約束表達與求解技術廣泛應用在服務化軟件的測試用例生成、故障注入等多個領域,較之已有工具,具有更強的測試分析設計能力,能夠支持用戶進行更高效的測試。在約束的處理方面,使用了前沿的SMT約束求解技術,能夠表達和處理豐富的約束類型,能夠處理不同輸入輸出因素之間的關聯性約束,使得更多的業務邏輯限制能夠得到有效表達和處理,從而可以改進測試數據的生成質量。

對服務的約束處理目前支持的約束有值約束和時序約束可滿足多數場景下的測試需求,對于非線性約束等其他約束值得在未來進一步研究。同時,對于約束中字符串的處理,當前操作使用整數編碼的形式進行處理,未來可以考慮使用23-str進行處理。

參考文獻:

[1] LAU Y T.“Service -oriented architecture and the C4ISR frame-work”[J]. The Journal of Defense Software Engineering,2004(9):11-14

[2]KANKANAMGE C. Web services testing with soapUI[M].Birm-ingham: Packt Publishing Ltd, 2012.

[3]Parasoft SOAtest [EB/OL](2016-09-27) [2018-03-14]. https://www.parasoft. com/product/soatest

[4]SOAPSonar [EB/OL] (2018 -02-13) [2018 -03 -14]. http://www.crosschecknet.com/products/soapsonar.php/

[5]BOZKURT M.HARMAN M.HASSOUN Y.Testing and verifica-tion in service-oriented architecture:a survey[J].Software Test-ing, Verification and Reliability, 2013: 261-313

[6] QIU D, LI B X.JI S H,et al.Regression testing of web service:asystematic mapping study[J].ACM Computing Surveys, 2014, 47(1):21-46.

[7] HECKEL R,LOHMANN M."Towards contract-based testing ofweb services,”[J].Electronic Notes in Theoretical Computer Sci-ence, 2005, 116(19): 145-156.

[8]姜瑛,辛國茂,單錦輝,等.一種Web服務的測試數據自動生成方法[J]計算機學報.2005 (4):568-577.

[9]侯可佳,白曉穎,陸皓,等,基于接口語義契約的Web服務測試數據生成[J].軟件學報,2013.24(9):2020-2041.

[10]HOU J,ZHOU H, MA C, et al.Method for automatically generat-ing test cases for web services[J].Journal of Northwestem Poly-technic al University, 2018, 36(1):149-155.

[11]王翀,呂蔭潤,陳力,等.SMT求解技術的發展及最新應用研究綜述[J].計算機研究與發展,2017,54(07):1405-1425.

[12] MOURA LD,BJRNERN."23: An efficient SMT solver,”[C].in Proceedings of the Intemational conference on Tools and Algo-rithms for the Construction and Analysis of Systems, 2008: 337-340

[13]XEGER[EB/OL]( 2017 -06 -24) [2018 -03 -19]. https: //github.com/bluezio/xeger.

猜你喜歡
軟件測試
軟件測試方向人才培養“1+X”融合研究
大數據背景下軟件測試技術的發展
軟件測試課程教學改革探討
關于 Web 應用系統的軟件測試的研究
核心概念與案例驅動的軟件測試課程教學研究
軍用軟件測試項目管理系統設計與實現
智能手機菜譜軟件的設計
軟件測試發展現狀及前景的探討
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合