關鍵字:JAVA測試
測試模式是一種針對軟件測試領域的某種高頻率出現問題而采取并經過實踐證明行之有效的專門化、高效的解決途徑(方法),它在軟件理論和實踐兩者之間起著 “ 橋梁 ” 的作用。在面向對象語言 JAVA 程序測試的過程中,一個較為棘手的問題就是 JAVA 類的可視性問題。 “ 信息隱蔽 ” 固然是面向對象語言設計的一個突出的優點,但是同時也給測試帶來諸多不便,有關 “ 隱蔽信息 ” 的可測試性成為這類測試的一大突出結癥。為此我們針對 JAVA 類不同的 “ 可視性 ” 要求的場合,采取相應的測試模式來支撐相關 JAVA 類(包)的測試。本文主要總結五個常用的 JAVA 測試模式,以饗讀者。這五個模式同樣適合于其它面向對象類(包)的測試,只不過在具體細節上要考慮與 JAVA 語言信息隱蔽性的差異。比如: JAVA 的可視性以包為界,同一個包內的類對其他類具有相同的存取權限。而 C++ 則以類為界,只有子類和友員函數方可對基類的隱蔽信息進行存取。 我們在下面以圖表的方式給出 五個常用 JAVA 測試模式詳細描述,有關模式的描述類目分別是模式名稱、測試對象、針對問題、約束條件、解決方法、實例、約束解決方式和該測試的設計原理。
模式(一) Main 模式
模式名稱
Main
測試對象
JAVA 類
針對問題
測試人員不知道在何處編寫驅動和初始化被測試類的測試代碼
約束
測試必須容易運行、測試代碼能夠訪問該類所有的特征(所有的屬性和方法)
解決方法
將測試代碼放入類的 public static void main(String[] args) 方法中去
實例
public static void main(String[] args){
SomeClass result;
// perform the test…
System.out.print(“result is..”);
}
約束解決
該測試代碼能夠率先被激活和執行、并能夠訪問被測試類所有的特征
設計原理
JAVA 類可以擁有 public static void main(String[] args) 方法,它是類在 JVM 中被率先執行的方法,控制著整個類的執行邏輯, main 方法能夠訪問所在類的所有屬性和方法
模式(二) toString 模式
模式名稱
toString
測試對象
作為運算結果的類
針對問題
測試人員不知道如何檢驗一個運算對象的中間結果和最終結果
約束
測試結果代表對象內部的一個狀態,而該狀態必須能夠被測試
解決方法
通過使用 toString 方法來對類狀態進行描述,描述結果可以通過打印與預期結果進行比較
實例
class SomeClass {
//…
public String toString(){
// custom representation
}
}
約束解決
類的內部狀態通過字符串來進行表示因而得以解決
設計原理
在基類定義的 toString() 方法能夠提供特定對象的狀態的描述,通過將對象狀態描述進行打印和顯示來判定對象狀態是否與預期相符
模式(三) Equal 模式
模式名稱
Equal
測試對象
JAVA 類
針對問題
作為運算結果的類
約束
測試人員不知道如何檢驗一個運算對象的中間結果和最終結果
解決方法
定義 equals 方法比較實際結果與預期結果進行比較
實例
class SomeClass {
//…
public boolean equals(Object o){
// custom comparison
}
}
約束解決
保持某個狀態的對象需要與預期對象進行比較,通過比較后的布爾值來確定是否與預期結果相符合
設計原理
在基類定義的 public boolean equals(Object) 能夠對比對象間的差異并以布爾值形式返回比較結果
模式(四) Internal Tester Class 模式
模式名稱
Internal Tester Class
測試對象
JAVA 包
針對問題
測試人員不知在何處編寫測試代碼測試包中的類
約束
測試代碼與運行代碼必須分開來,測試代碼能夠訪問到類的所有特性,測試代碼起到的是一個包的客戶端的角色。
解決方法
新建一個類并將該類的包路徑與被測試類的包路徑相同,然后在該類里寫入所有的測試代碼
實例
package theOne;
public class InternalTestClass {
//…
}
約束解決
所有的測試代碼均與運行代碼分離,由于它與運行代碼在同一包路徑下,所以它與普通的客戶端相比具有更多的可視性
設計原理
將測試代碼定義在一個特定的類中。由于測試類與運行類在同一個包路徑下,因此它能訪問測試類的類的所有特性。因此,它遠比客戶端測試具有更大的可視性。
模式(五) Extern Tester Class 模式
模式名稱
Extern Tester Class 模式
測試對象
JAVA 包
針對問題
測試人員不知在何處編寫測試代碼測試包中的類
約束
測試代碼與運行代碼必須分開來,測試代碼能夠訪問到類的可視特征,測試代碼起到的是一個包的客戶端的角色。
解決方法
新建一個類,指定與被測試類不同的包路徑,然后在該類里寫入所有的測試代碼
實例
package anotherOne;
public class ExternalTestClass {
//…
}
約束解決
所有的測試代碼均與運行代碼分離,由于它與運行代碼在不同的包路徑下,所以它與普通的客戶端的可視性相同
設計原理
將測試代碼定義在一個特定的類中。由于測試類與運行類不在同一個包路徑下,因此它不能訪問測試類的所有屬性和方法。但是它與客戶端具有相同的可視性。因此,它可以替代客戶端進行測試。
上面五個模式的作用關系如圖-1所示:

圖-1 JAVA 測試模式圖解
了解上述所述的模式有助于測試人員在具體 JAVA 代碼測試中編寫測試類,同時上述的這些 JAVA 測試模式還可以借助 JUnit 這樣的測試框架來實現。
注:本文根據 Marco Torchiano 的《 Patterns for Java Program Testing 》刪減改編而成
延伸閱讀
文章來源于領測軟件測試網 http://www.kjueaiud.com/