



關鍵詞:蛻變測試;蛻變關系;Oracle問題;蛻變測試應用
中圖分類號:TP399 文獻標志碼:A
0引言(Introduction)
軟件測試旨在檢測程序中的缺陷或錯誤,是軟件開發過程中一項重要但成本高昂的活動。軟件測試工作要求盡可能地實現測試流程的自動化,旨在提升測試速度、降低成本并增強可靠性。為此,需要構建預期輸出以區分被測系統正確和錯誤的行為。然而,針對一些復雜的程序,預測其正確的輸出相當困難,這被稱為軟件測試的Oracle問題[1],是軟件測試面臨的基本挑戰。
為了緩解軟件測試中的Oracle問題,CHEN等[1]提出蛻變測試(Metamorphic Testing, MT)技術,其與傳統測試技術的不同之處在于,它不關注對被測軟件每個單獨輸出的驗證,而是著重檢查其多次執行的輸入和輸出之間的關系,因此可以有效解決預期輸出難以構造的問題。
蛻變測試技術自提出以來,相關文獻不斷涌現,涵蓋了豐富的技術、應用和評估研究。然而,大部分文獻尚未經過系統的回顧,這在一定程度上阻礙了對現有技術的分析和新研究方向的確定。為此,本文調研了自2016年以來與蛻變測試相關的研究工作。從蛻變測試原理和過程、蛻變關系及蛻變測試應用3個方面對其國內外研究現狀進行了梳理和分析,歸納總結了適用于各個領域的6種蛻變關系模式,并對蛻變測試技術的未來發展方向提出了展望。
1 蛻變測試原理(Metamorphic testing principles)
1.1 基本概念和原理
蛻變測試技術是一種基于屬性的驗證方法,它獨辟蹊徑,從大多數其他測試策略未曾涉足的角度來處理軟件測試領域中的問題。蛻變測試并不關注每個單獨輸出的正確性,而是著眼于程序的多次執行;它的核心在于檢查多次執行的輸入和輸出之間的關系是否滿足程序功能的預期屬性,這些屬性也稱為蛻變關系(Metamorphic Relation,MR)。蛻變關系將現有測試用例(原始輸入)轉換為新的測試用例(衍生輸入)。若程序在原始測試用例和衍生測試用例中的行為違反了蛻變關系,則表明該程序存在缺陷。下面對蛻變測試中蛻變關系、原始輸入/衍生輸入給出具體定義。
定義1.2原始輸入/衍生輸入[2]:使用蛻變關系(r,rf )檢測程序P時,起初給定的測試用例,即從現有數據集中選擇的或利用測試用例生成技術產生的測試用例,稱為原始輸入;由原始輸入依據關系r 轉化生成的新測試用例,稱為基于蛻變關系(r,rf )的衍生輸入。
1.2 蛻變測試過程
基于蛻變測試原理可知,應用蛻變測試的過程可以分為以下3個步驟,蛻變測試過程如圖1所示。
(1)識別和定義蛻變關系
一般來說,蛻變關系的識別可以通過參考系統的需求或基于用戶對系統的期望實現。蛻變關系(r,rf )描述了如何從給定的原始輸入中構造衍生輸入。蛻變關系的識別和定義是應用蛻變測試的關鍵步驟,它直接影響最終的測試效果。
(2)測試用例生成
原始輸入x0可以從現有數據集中篩選,也可以利用測試用例生成策略(如隨機測試)生成符合蛻變關系限制條件的原始輸入,然后依據構造的蛻變關系r 將原始輸入自動轉化為衍生輸入r(x0)。
(3)測試用例執行
在待測程序P 上執行原始輸入和衍生輸入,然后檢查原始輸出P(x0)和衍生輸出P(r(x0))之間是否違反了相應的蛻變關系rf 。若違反,則表明程序P 中存在錯誤或偏離用戶期望。
2.2 蛻變關系的使用情況
實驗中使用的蛻變關系的數量是衡量蛻變測試所需工作量的重要指標。本文對現有文獻中蛻變關系的使用情況進行了統計分析,結果如圖2所示。從圖2中可以看出,有50%的研究使用了1~4個蛻變關系,37%的研究使用了5~9個蛻變關系,呈現10個及10個以上蛻變關系的研究只占13%。SEGURA等[4]總結了1998年至2015年發表的蛻變測試相關論文中蛻變關系的使用情況。與之相比發現,近年來的研究中使用1~4個蛻變關系的比例由24%提升至50%,而使用10個及10個以上蛻變關系的比例由37%降至13%,表明相對于蛻變關系的數量,近年來的研究更加注重蛻變關系的有效性。LE等[5]基于蛻變測試技術開發了一種測試編譯器的工具,并在流行的GCC(GNU Compiler Collection)等編譯器中檢測到100多個錯誤。盡管在此之前,TAO等[6]也曾利用蛻變測試對編譯器進行驗證,但只在GCC等編譯器中檢測到了一個錯誤。檢測到的錯誤數量的巨大差異也強調了蛻變關系的選擇對蛻變測試故障檢測有效性的顯著影響。
蛻變關系通常是基于被測試系統的必要屬性定義的。由于這些屬性通常數量巨大,因此幾乎不可能獲得代表所有這些屬性的完整蛻變關系集。然而,LIU等[7]的實證研究表明,僅使用少數幾個蛻變關系就能在故障檢測方面非常接近預言機制。他們測試了6種不同的程序后發現,蛻變測試平均只需3~6個不同的蛻變關系即可揭示至少90%的故障。這表明適度數量的蛻變關系(少于10個)通常足以應用于蛻變測試并獲得預期結果。此外,與為應用程序提出具體的蛻變關系相比,近期的研究更傾向于設計蛻變關系模式。一個蛻變關系模式可以推導出許多具體的蛻變關系,這也是影響蛻變關系數量統計結果的重要因素。
2.3 蛻變關系模式
應用蛻變測試的一個挑戰是識別有效的蛻變關系。在早期的蛻變測試研究中,蛻變關系通常是針對研究問題單獨識別的。這些蛻變關系通常只考慮了一種特定類型的被測軟件,因此缺乏通用性,無法涵蓋其他應用類型的功能和特性。為了能夠系統地識別蛻變關系,ZHOU 等[8]提出了“蛻變關系模式(Metamorphic Relation Pattern,MRP)”的概念,作為表征一組(可能無限多)蛻變關系的抽象。
使用蛻變關系模式對于識別蛻變關系具有巨大的幫助。這是因為“模式”能夠引導測試人員搜索具有某種結構的蛻變關系,使得蛻變關系的識別比從頭開始時容易。ZHOU 等[8]觀察到,對稱性是現實世界固有的、普遍的、深刻的屬性。計算機系統通常通過模擬、建?;驅W習現實世界的方法解決問題,因此對稱性也是許多計算機系統普遍需要的屬性。于是他們進一步提出“對稱性”蛻變關系模式的概念,它被定義為“theexistence of different viewpoints from which the system appears thesame”,即存在不同的角度去測試系統,并且此時系統行為應該是相似的。“對稱性”蛻變關系模式具有通用性,適用于各個領域。需要注意的是,在“對稱性”蛻變關系模式的定義中,“the system appears the same”并不意味著軟件系統的原始輸出和衍生輸出必須具有相同或等價的關系。他們使用“對稱性”蛻變關系模式,在商業網站、導航軟件、人臉識別、視頻分析軟件等多個不同的應用領域進行了深入的研究,結果表明,該模式可以有效地幫助用戶檢測到先前未知的故障。
蛻變關系模式可以形成層次結構,較高級別的蛻變關系模式更抽象,而較低級別的蛻變關系模式則更具體。之后,WU等[9]提出了“噪聲”蛻變關系模式作為“對稱性”蛻變關系模式的子模式,它被定義為“the requirement that a reliable systemshould be able to perform its functions when a low level ofinterference (noise) is present”,即當輸入數據或環境中存在低水平的干擾(噪聲)時,不應該對可靠系統的輸出產生強烈的影響。本文基于收集的文獻,對其中使用的蛻變關系進行了分類、統計和分析,總結出“添加”“移除”“修改”“排列”“分區”“連接”6種蛻變關系模式。相較于“噪聲”蛻變關系模式,這6種蛻變關系模式的抽象程度更低,但它們同樣適用于各個領域,可結合被測軟件的特征實例化為具體形式的蛻變關系。以下是對這6種蛻變關系模式的定義,并舉例說明如何將它們實例化。
(1)“添加”蛻變關系模式
該模式通過在原始測試用例中添加一個或多個數據,構建衍生測試用例。例如,在對機器學習無監督聚類程序的研究中,該模式可以實例化為“添加一個或多個重復的點,不應該對聚類結果產生影響”。
(2)“移除”蛻變關系模式該模式通過在原始測試用例中移除一個或多個數據,構建衍生測試用例。例如,在測試機器翻譯系統時,該模式可以實例化為“刪除原始句子中的關鍵詞或短語,得到的翻譯應與原本的不同”。
(3)“修改”蛻變關系模式該模式通過在原始測試用例中修改部分數據,構建衍生測試用例。例如,自動駕駛領域通常利用圖像變換技術生成模擬真實駕駛場景的合成圖像,因此該模式可以實例化為“在原始圖像上添加雨霧效果,汽車駕駛行為不應該有明顯變化”。
(4)“排列”蛻變關系模式該模式通過改變原始測試用例中數據的順序,構建衍生測試用例。例如,在測試導航軟件時,該模式可以實例化為“交換起點和終點,導航系統輸出的路徑代價(時間、距離等)應該不變”。
(5)“分區”蛻變關系模式前4種模式都是對一個原始測試用例施加某種操作來構建衍生測試用例。與之不同,“分區”蛻變關系模式是對一個原始測試用例按照某種分區策略進行劃分,從而構建多個衍生測試用例。同樣以導航軟件為例,假設a1 到an 的最優路線需要經過a2、a3、…、an-1,以途經地劃分原始測試用例,則該模式可以實例化為“a1 到an 的路徑代價應該等于a1 到a2、a2到a3、…、an-1到an的路徑代價之和”。
(6)“連接”蛻變關系模式
與“分區”蛻變關系模式相反,該模式是把多個原始測試用例結合在一起構建一個衍生測試用例。以自然語言推理模型為例,它旨在判斷能否從一個給定的前提p 中推導出假設h。假設前提p1 可以推導出h(記為p1→h),前提p2 也可以推導出h(記為p2→h),則該模式可以實例化為“將兩個前提p1 和p2 結合起來構成新的前提p,則p 能推導出h,即令p1∧p2=p,則p→h”。
對于上述6種模式,本文并沒有指定被測系統的輸出應該如何變化。這是因為蛻變關系模式具有通用性,衍生輸出與原始輸出之間可能存在等價、相反、包含等多種關系,所以需要結合被測試對象的特征說明這些關系。
3 蛻變測試應用(Metamorphic testing application)
3.1 功能測試
蛻變測試技術提出至今,其主要的一個應用仍舊是解決Oracle問題,進而對軟件功能進行驗證和確認。表1匯總了使用蛻變測試進行功能驗證的應用領域。
(1)機器學習
近年來,隨著人工智能技術的發展,機器學習變得越來越流行。然而,Oracle問題的存在使得這類軟件的可靠性難以保證。因此,應用蛻變測試評估機器學習系統的趨勢也越來越明顯。為了提高機器翻譯系統的可靠性和準確性,鐘文康等[10]利用蛻變測試技術,分別研究了單詞粒度、短語粒度、句子粒度對機器翻譯的影響,達到了不借助參考譯文也能評估翻譯質量的目的。ZHANG等[11]利用句法剪枝技術構建等價蛻變關系,在谷歌翻譯和微軟翻譯上發現了超過5000個譯文錯誤。自動駕駛和無人機系統的安全性一直備受關注。ZHANG等[12]研究了一種名為DeepRoad的系統化的測試工具,它基于生成對抗網絡的技術合成能夠準確反映真實世界的駕駛場景,并利用蛻變關系檢測自動駕駛系統的錯誤行為。WU等[13]為無人機系統設計了3種蛻變關系,并基于網格搜索算法驗證其路徑規劃的正確性。為了更加深入地了解問答系統對于自然語言的理解能力,CHEN等[14]根據多種語言學特性為問答系統設計蛻變關系。實驗結果表明,該方法不僅可以揭示傳統驗證所掩蓋的問題,還為更具體地理解問答系統的語言能力提供了幫助。盡管像“亞馬遜”和“谷歌”等大公司已將基于深度學習的目標檢測器商業化,但是它仍然會產生不正確的結果。為此,WANG等[15]專門為目標檢測系統設計了名為MetaOD的自動化測試框架。他們通過在背景圖像中插入額外的對象實例來合成自然外觀的圖像,然后在排除對插入對象的預測結果后,檢查原始圖像和合成圖像目標識別結果的等價性。MetaOD在TensorFlow API提供的4種商業目標檢測服務和四種預訓練模型上進行了評估,結果發現了數以萬計的檢測失敗。為了衡量情感分析系統的公平性,ASYROFI等[16]通過識別并替換敏感信息,有效地揭示了情感分析系統中存在的偏見問題。
(2)Web服務和應用軟件
蛻變測試技術也廣泛用于驗證Web服務和應用軟件的正確性。SEGURA等[17]提出了一種檢測RESTful風格Web應用故障的蛻變測試方法,并有效地揭示了學術平臺、社交媒體平臺中的錯誤。OpenStreetMap是由許多互不相關的用戶合作創建的免費世界地圖,由于其開放性,很容易包含錯誤信息。為此,ALMENDROS-JIMéNEZ等[18]基于蛻變測試思想開發了一個自動檢測OpenStreetMap中錯誤信息的框架。為了評估該框架的實用性,他們將其用于分析不同大洲4個城市的地圖,并成功發現了大量的錯誤信息。為了評估內容審核軟件對有毒信息(例如仇恨言論、惡意廣告等)的檢測能力,WANG等[19]設計了3個擾動級別(字符、單詞和句子)的11種蛻變關系。實驗結果表明,該方法在測試“谷歌”“百度”和“華為”提供的商業審核軟件時,對錯誤的識別率分別高達83.9%、51%和82.5%。為了緩解測試量子計算平臺的Oracle 問題,PALTENGHI等[20]利用量子特有的屬性設計蛻變關系,并在流行的Qiskit平臺上發現了13個錯誤,其中9個錯誤已經得到確認。
(3)編譯器
為了對DL(Deep Learning)編譯器的正確性建立更深層次的理解,XIAO 等[21]為DL 編譯器設計了一個名為MTDLComp的蛻變測試框架。該框架不僅發現了DL編譯器中的4個錯誤,還為改進DL編譯器提供了指導。
(4)其他
TOLKSDORF等[22]首次將蛻變測試運用到調試器上,其方法的核心思想是對被調試的代碼和調試操作進行轉換,確保原始輸入和轉換后輸入的行為只能在特定的方式上有所不同。例如,添加一個斷點不應該改變被調試的程序的控制流。他們將這種方法應用于JavaScript調試器中發現了8個以前未知的錯誤,并且都得到了開發人員的確認。ZHANG等[23]介紹了測試網絡掃描儀的7種蛻變關系,表明蛻變測試具有評估和比較掃描儀的潛力。
3.2 性能測試
如“3.1”節所述,蛻變測試技術自提出以來,其大多數應用都集中在對功能故障的檢測上。然而,蛻變測試在檢測性能錯誤方面的適用性仍然是一個值得深入探索的話題。SEGURA等[24]首次提出可以使用蛻變測試揭示性能故障,并提出了“性能蛻變測試”的概念。其中,蛻變關系是根據對程序的輸入進行某些更改時被測程序的性能(如執行時間)如何變化來定義的。為了驗證該想法的可行性,他們分別在圖片加載、定位程序等一些常見應用上進行了實驗,結果證實了蛻變測試在自動檢測性能錯誤方面的潛力。JOHNSTON等[25]通過比較被測軟件的連續運行情況,提出蛻變關系可用于改進性能測試。為此,他們探究了蛻變關系在頁面加載時間方面的應用。通過觀察加載時間的直方圖,發現并修復Adobe平臺啟動標簽管理器時的一個錯誤。RIGGER等[26]通過比較數據庫管理系統在兩個語義等效查詢上運行的時間差異,揭示潛在的性能錯誤。該方法最終在CockroachDB和PostgreSQL中發現了39個潛在的性能錯誤,其中6個性能錯誤已經得到了開發人員的確認。
3.3 其他方面
除了功能測試和性能測試,研究人員還探索了蛻變測試在其他方面的應用。例如,ZHOU 等[8]指出蛻變關系也可基于用戶的期望進行定義,而非僅局限于基于開發人員的算法。這種方法更能反映用戶的真實需求,從而使蛻變測試成為一種面向用戶的方法,幫助他們更好地理解目標軟件,并利用其滿足自身的特定需求。XU等[27]報告了機器學習中蛻變關系的一種新用途,即使用蛻變關系增強機器學習算法本身,而不是僅僅用于測試。他們利用圖像分離和遮擋的特性,生成蛻變關系調整機器學習系統的輸入和輸出,從而構建更加精確的二元分類模型。YAN等[28]觀察到有時違反蛻變關系所反映的問題可能不在于被測軟件,而在于測試用例本身(特定的輸入可能無效或質量差)。這一觀察表明,蛻變關系可用于驗證或者評估數據的質量,而不是驗證軟件的正確性。為了評估這一觀點的有效性,YAN等[28]使用了機器翻譯數據集進行試驗,結果表明,該方法可以有效地識別數據集中翻譯不正確的語句。
4 未來研究方向(Future research direction)
關于蛻變測試的研究雖然歷史較短,但得到了學術界持續的關注,并取得了大量的研究成果。除了上文梳理的研究角度,蛻變測試技術未來的研究方向還包括如下內容。
(1)蛻變關系系統的識別。盡管已經為各種應用領域確定了許多蛻變關系,但是大多數都是以臨時和任意的方式識別的。雖然ZHOU等[8]提出了以蛻變關系模式幫助識別蛻變關系,但是相關研究仍處于初級階段。研究不同蛻變關系模式之間的關系并為其構建家譜將是未來的一個重要研究方向。
(2)蛻變關系的優先級。在某些情況下,使用所有可用的蛻變關系可能成本過高,因此必須選擇它們的子集。了解如何優先考慮最有效的蛻變關系非常重要。為此,研究人員提出使用代碼覆蓋率或測試用例相似性的方法[29-30],并取得了較好的結果。
(3)蛻變測試工具。就目前而言,如果從業者想要應用蛻變測試,由于沒有公開可用和維護的工具,因此他們通常需要自己開發相關工具。這成為蛻變測試在實證研究和實踐中廣泛應用的一個重要障礙。
5 結論(Conclusion)
蛻變測試技術作為一種有效的測試技術正日趨成熟。本文對近年來與蛻變測試相關的研究工作進行了調研和總結,特別關注蛻變關系的研究現狀和蛻變測試在不同領域的應用。此外,文章還展望了蛻變測試技術未來的研究方向,旨在為蛻變測試的研究構建一個比較完整的全景圖,并為相關研究人員提供參考和借鑒。
作者簡介:
朱小艷(1997-),女,碩士生。研究領域:軟件測試。
江明月(1985-),女,博士,副教授。研究領域:軟件工程,軟件調試與修復。