引言
測試用例設計是軟件測試中的核心問題。在實踐的過程中,一般采用業務流程覆蓋、數據流覆蓋、語句覆蓋等作為測試充分性準則進行測試用例的設計。而變異測試則提供了基于缺陷的對測試充分性進行度量的角度,針對測試用例集的充分性進行評估和改進。
定義
根據《中國軟件測試標準規范》(以下簡稱規范)的定義,變異測試(在規范中稱為程序變異,以下二者互用)是一種差錯驅動測試,是為了查出被測軟件在做過其他測試后還剩余一些的小差錯。本方法一般用變異測試工具動態進行,屬于動態測試。下面就變異測試的原理來闡明其定義。
原理
首先,具體來說,測試人員首先根據被測程序特征設計變異算子(mutation operator),變異算子一般在符合語法前提下僅對被測程序作微小改動。然后對被測程序應用變異算子可生成大量變異體(mutant),在識別出等價變異體(equivalent mutant)后,若已有測試用例不能殺除所有非等價變異體,則需要額外設計新的測試用例,并添加到測試用例集中,以提高測試充分性。流程如下圖:
除了可用于測試用例集的充分性評估,變異測試也可以通過采用變異缺陷來模擬被測軟件的真實缺陷,從而對研究人員提出的測試方法的有效性進行輔助評估。根據Andrews等的《Is mutation an appropriate tool for testing experiments?》的研究表明變異算子生成的變異缺陷與真實缺陷在有效性評估中效果相似。這就是為什么說變異測試是基于缺陷的、差錯驅動的測試。
在這個過程中,有兩個前提假設:
假設1 (熟練程序員假設)即假設熟練程序員因編程經驗較為豐富,編寫出的有缺陷代碼與正確代碼非常接近,僅需作小幅度代碼修改就可以完成缺陷的移除。基于該假設,變異測試僅需通過對被測程序作小幅度代碼修改就可以模擬熟練程序員的實際編程行為。
假設2(耦合效應假設)若測試用例可以檢測出簡單缺陷,則該測試用例也易于檢測到更為復雜的缺陷。這里簡單缺陷的含義是僅在原有程序上執行單一語法修改形成的缺陷,而復雜缺陷的含義是在原有程序上依次執行多次單一語法修改形成的缺陷。
從這兩個假設,我們不難看出,如果程序中存在著明顯的代碼錯誤,變異測試則不一定有效。所以在《規范》的定義中指出“是為了查出被測軟件在做過其他測試后還剩余一些的小差錯”。而一些小的差錯,無論經過多少產品、開發、測試、架構評審,往往是測試用例無法覆蓋到的。這正是變異測試的用武之地。
應用
變異測試的基本測試過程,可以用下圖表示:
目前,可以應用在java上的工具有:MuJava、MuClipse(均是學術研究的原型工具,尚未發現可用于企業生產開發的工具)。但在這段時間的使用中由于缺少extendedOJ.jar未能成功運行。而參考官方文檔說明,其使用也十分不友好。變異測試從理論到實際應用,還有一段路。(當然,也可能無路可走。)
研究框架
拋開企業的生產開發,變異測試的研究方面如下圖所示:
小結
變異測試作為一種面向軟件缺陷的測試技術,目前得到了學術研究人員的關注,也取得了大量研究成果。作為一名測試人員,期待其未來的生產應用。
關于變異測試更詳細的介紹可以參考:
[1]陳 翔,顧 慶;變異測試:原理、優化和應用;計算機科學與探索,2012-06
[2]ncsu: MuClipse: Mutation Testing for Eclipse ,www.csc.ncsu.edu