軟體測試中的變異測試——變異得分和分析示例
變異測試
變異測試是另一種軟體測試形式,它透過更改或變異原始碼中的語句來確定測試用例是否能夠檢測原始碼中的錯誤。它用於確保測試用例的質量,特別是其魯棒性,即它必須使變異後的原始碼失效。
變異測試不僅用於確定現有軟體測試的質量,還用於設計新的軟體測試。在變異測試中,程式會以細微的方式進行修改。它強調幫助測試人員開發有效的測試並檢測程式測試資料中的瓶頸。
1971年,Richard Lipton 首次提出變異測試。最初由於其高成本,變異測試並未得到廣泛應用。然而,如今它已廣泛應用於 Java 和 XML 等多種語言。它是一種白盒測試,可以應用於設計模型、規範、資料庫、測試甚至 XML。變異測試是一種典型的結構化測試技術,它利用程式碼的結構來指導測試。可以將其視為以細微的方式重寫原始碼以避免冗餘的過程。
測試人員需要注意的一點是,要使原始碼的更改極其細微,以免影響程式的主要目的。它也被稱為基於錯誤的測試策略,因為它涉及一個有缺陷的程式,主要用於單元測試。
變異測試的型別
值變異 - 在這種測試中,修改值以查詢程式中的錯誤。一個較小的值被修改為較大的值,反之亦然。通常,在值變異測試中會更改常量。
決策變異 - 在這種測試中,修改邏輯/算術運算子以發現程式中的錯誤。
語句變異 - 在這種測試中,刪除語句或將其替換為另一個語句。
變異測試的過程
透過引入許多稱為變體的版本,在原始碼中建立錯誤。一個變體只能有一個錯誤。目的是使這些變體版本失效,從而顯示測試用例的有效性。
然後,將測試用例應用於實際程式和變異程式。測試用例必須適當,並進行調整以查詢程式中的錯誤。
比較從實際程式獲得的結果與變異程式的結果。
如果實際程式和變異程式產生不同的輸出,則測試用例會破壞變體。因此,測試用例足以找到兩個程式(實際程式和變異程式)之間的差異。
建立變異程式
變異是在程式語句中進行的單個語法修改。每個這樣的變異程式都必須與實際程式恰好只有一個變異不同。例如:
| 實際程式 | 變異程式 |
|---|---|
| if (x > y) | if (x < y) |
| print “Hello readers.” | print “Hello readers.” |
| else | else |
| print “How you doing?” | print “How you doing?” |
對變異程式進行的更改
有很多技術可以生成變異程式,例如:
| 運算元替換運算子 | 表示式修改運算子 | 語句修改運算子 |
|---|---|---|
| 運算元被替換為另一個運算元或常數值。 | 在程式語句中替換運算子或插入新的運算子。 | 更改程式語句以建立變異程式。 |
| 例如,如果 (a > b) 替換 a 和 b 值,如果 (5 > b) 將 a 替換為 5 | 例如,如果 (a == b) 將 == 替換為 >= 並將變異程式設為 if (a >= b),並在語句中新增 ++ if (x == ++y) | 例如,刪除 if-else 語句中的 else 語句。刪除整個 if-else 語句以確定程式的行為。示例變異運算子
|
自動化變異測試
變異測試非常耗時,而且手動執行起來也很複雜。因此,建議使用自動化工具和技術來加快測試過程。這些工具還可以減少測試過程的支出。一些用於變異測試的自動化工具包括:
Stryker - 這個開源工具有助於對 .NET Core 和 .NET Framework 專案進行變異測試。它可以透過臨時在原始碼中引入錯誤來測試測試用例。它可以控制超過 30 種受支援的變異。Stryker 透過使用程式碼分析和並行測試執行器程序來加快測試速度。此工具支援 JavaScript、TypeScript、C# 和 Scala。Stryker 使用智慧且功能強大的報告來發現倖存的變異體並提高測試效率。
PIT 測試 - PIT(流程整合測試)工具有助於為流程整合場景設定自動化測試。此工具背後的理念是:從 SAP 流程整合或 SAP 流程編排系統的執行時檢索處理的訊息。這些訊息儲存在 PIT 系統的資料庫中,稍後可以在不同的系統(稱為目標系統)上執行。執行這些訊息後,從目標系統收集結果。然後,將結果與來自源的參考訊息進行比較。此工具是變異測試領域的最新技術,為 JAVA 和 JVM 提供標準的測試覆蓋率。此工具快速、強大且易於與現代測試和構建工具整合。PIT 測試易於使用,積極開發和支援。它以易於閱讀和理解的格式生成報告,整合行覆蓋率和變異覆蓋率資訊。
變異測試的概念
變體 - 它是原始碼的變異或修改版本,其中包含細微的更改。當測試資料透過變體執行時,它會產生與原始原始碼不同的結果。它們也稱為變異程式。
倖存變體 - 這些是在測試資料透過原始碼的原始版本和變異版本執行後仍然存在的變體。必須銷燬倖存的變體,它們也稱為活動變體。
被殺死的變體 - 這些變體在變異測試完成後被銷燬。這些是透過原始和變異原始碼的不同結果獲得的。
等效變體 - 這些變體與活動變體密切相關,即即使在測試資料透過它們執行後它們仍然存在。它們與其他變體不同,因為它們與原始原始碼具有相同的含義,而不管它們可能不同的上下文如何。
變異得分 - 變異得分是用銷燬的變體數量除以變體的總數,然後乘以 100 得到的百分比:
變異得分 = (銷燬的變體數 / 變體的總數) * 100
如果變異得分為 100%,則測試用例被認為是變異充分的。研究和實驗表明,變異技術是衡量測試用例充分性或適當性的有效方法。然而,變異測試的主要缺點是建立變體和針對該變異程式執行測試用例所涉及的高成本。
變異測試的優點
獲得高源程式覆蓋率的強大方法。
能夠全面測試變異程式。
良好的錯誤檢測水平。
檢測原始碼中的冗餘和歧義,能夠檢測程式中的所有錯誤。
提供最可靠和穩定的系統。
變異測試的缺點
由於必須生成大量變異程式,因此極其昂貴且耗時。
由於其高度複雜性,變異測試必須使用自動化工具。
每個變異都與原始程式具有相同數量的測試用例;因此,必須使用實際測試套件測試大量變異程式。
它涉及原始碼更改,因此不能應用於黑盒測試。
變異測試示例
考慮一個允許使用者註冊的醫院網站。它收集各種資訊,例如出生日期或年齡等。如果患者年齡大於15歲,則會為他們分配一位醫生作為他們的主治醫生。為此,它啟用了“醫生”功能,該功能查詢可用的醫生。可能還有一些其他功能。10歲以下的患者可能會被分配給兒科醫生,等等。但我們只考慮年齡大於15歲的情況。程式碼可能如下所示:
讀取年齡。
如果 (年齡>15)
醫生 = 醫生()
結束 if。
請注意,程式碼特定於任何語言,因此無法執行。它只是一個虛擬碼。
我們的目標是檢查4個值(14、15、0和5)的資料集是否足以發現此程式碼中的所有問題和冗餘。
那麼,變異測試是如何實現的呢?首先,建立變體——程式的變體。變體只是一個程式,寫成一個偏差。它帶有自播種問題,例如,算術運算子替換、邏輯連線符替換、語句刪除等。這些替換被稱為變異運算元。
結論
執行詳盡測試的最佳方法是透過變異測試——測試任何程式最全面的方法。此技術檢查程式的有效性和準確性,以檢測系統中的故障或錯誤。
資料結構
網路
關係型資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP