1. 程式人生 > >軟體測試用例自動生成技術(一)

軟體測試用例自動生成技術(一)

軟體測試這一環節在軟體開發週期中不可或缺。然而軟體測試卻花費軟體開發超過一半的成本。因此利用軟體測試用例自動生成技術來降低軟體開發成本並提高軟體開發效率就變得至關重要。目前軟體測試用例自動生成技術可大體分為五類:
1. 符號執行及程式結構覆蓋測試(symbolic execution and program structural coverage testing)
2. 基於模型的測試用例生成技術(model-based test case generation)
3. 混合型測試(combinatorial testing)
4. 自適應型隨機測試–隨機測試的一個變種(adaptive random testing as a variant of random testing)
5. 基於搜尋的測試(search-based testing)
本博文分多部落格逐次介紹這些技術。

1. 符號執行(Symbolic Execution)

符號執行是一種程式分析技術。其可以通過分析程式來得到特定程式碼域執行的輸入。使用符號執行分析一個程式時,該程式會使用符號值作為輸入,而非一般執行程式時使用的具體值。在達到目的碼時,分析器可以得到相應的路徑約束(PC:Path Constraint),然後通過約束求解器來得到觸發目的碼的具體值。
From: https://zh.wikipedia.org/wiki/%E7%AC%A6%E5%8F%B7%E6%89%A7%E8%A1%8C

1.1 測試案例

Test Case

上圖(a)為一段交換x,y值的程式碼,僅當初始值x>y時交換。上圖(b)為該段程式的執行樹(Execution Tree,執行樹進行符號執行時程式的所有執行路徑,其中結點表示程式狀態,邊表示狀態轉移,結點右上角編號為程式行編號)。
在執行語句1前PC設值為真因為無論x,y為何值語句1的判斷條件總會執行。執行樹表示了程式所有可能的執行路徑,比如當X

Y 時,路徑1,8執行;當X>Y 時執行1,2,3,4,5。
儘管符號執行在中世紀便已提出,但這項技術得到關注才是近年的事。原因有二:
1. 面對現實中龐大的程式符號執行需要複雜的條件約束
2. 相比於其它自動測試技術,符號執行需要巨大的運算量

1.2 基本問題

若要符號執行運用在現實中龐大的程式中,其必須有兩個特點:高效性及自動化。但其有三個基本問題需要解決:
1. 路徑爆炸(Path Explosion): 符號執行很難解決現實中的大型軟體因為現實中的軟體路徑紛亂繁雜,而且每條路徑都有可能面臨龐大的計算量。因此,在有限的時間內,只有一部分路徑可被符號執行。
2. 路徑發散(Path Divergence): 現實中程式經常是多語言混合程式設計或其本身是二進位制檔案。為這類程式生成精確的條件約束要麼需要實現一個大型架構,要麼就需要使用者自己為關鍵部分建模。正因如此,從生成測試資料的那段路徑開始就有可能產生多條分支。由於路徑發散的問題,符號執行要麼不能找到程式的關鍵路徑,要麼就需要使用者自己建模從而減少自動化。
3. 複雜約束(Complex Constraints): 為條件約束進行劃分問題如此難以抉擇。因此生成的路徑約束很有可能異常複雜。

Reference:
An Orchestrated Survey on Automated Software Test Case Generation