如何使用JUnit高效完成功能測試 軟件測試
功能測試或集成測試是關系到整體系統功能的測試,而不只是牽涉到小段代碼(單元)。這需要將已經單獨測試好的模塊組裝起來,以保證其連接時也能像預期一樣正常工作。JUnit是進行Java程序測試最常用的測試框架。
大多數Java開發人員都善于解決邏輯結構測試問題,比如如何建立測試預設環境、利用斷言?添加測試方法、用setup方法進行初始化等。然而,如果Java開發人員能更深入地了解如何設計功能測試集來有效地檢驗代碼是否正常運行,他們將獲得更多的益處。
這篇文章介紹了可以建立有效 JUnit功能測試集的策略。包括:
確定測試用例覆蓋所有程序行為。
確定代碼入口點:測試程序整體功能的主要代碼段。
匹配入口點與相應的測試用例。
根據初始化 /運行/檢查流程創建測試用例。
設計并利用運行時事件表進行測試。
我將結合Saxon(一個可以處理XPath、XQuery和XSLT 的XML工具)的源代碼來具體闡述這些策略。Saxon由約50000行Java代碼組成,它是開源的,代碼風格優良,注釋文檔詳盡。
確定用例
功能測試有兩個相輔的目標:覆蓋率與粒度。為確保完整性,功能測試必須覆蓋程序提供的所有功能,且必須在各組件水平上分別進行測試。一個測試可以建立在另一個測試的基礎上,但任何測試都不能用來驗證兩項功能。
建立一個全面的功能測試集,第一步是列出程序可以實現的所有行為。這可以通過使用特定的用例模擬外部因素(程序使用者或其它軟組件)執行系統內部的功能來實現。
一個典型的企業Java程序應該包含各種用戶所需的詳細文檔,包括用例說明、非功能性要求、測試用例說明、用戶界面設計文檔、模型、用戶個人信息以及其它各種人工生成的信息。一般來說簡單的應用程序只有一個簡單的說明文檔。
借助這些文檔,你可以快速確定需要測試的用例。每個測試用例都描述了應用程序可以執行的一項功能。用規模相近的測試方案確定唯一的功能是一個好習慣,而較大的方案可以根據其檢驗的功能拆分為較小的方案。
有許多種建立用例模型的方法,其中最簡單的便是輸入/輸出匹配法。在Saxon的query類中,最簡單的用例是傳送一個查詢文件、一個查詢請求和一個輸出文件路徑。輸出文件若不存在,將根據要求創建,并在文件中顯示查詢結果。
更復雜的用例可能需要輸入更多的信息或輸出更多的結果。然而,用例并不關心功能是如何在內部實現的。對它們來說,軟件就像是一個 “黑盒子”,只要運行正常,即使真正實現軟件功能的是盒子里的侏儒也無所謂。這是很重要的一點,因為輸入/輸出匹配用例很容易直接轉換為測試用例,使得復雜的說明與簡單的測試吻合,確定該運行的功能正常運行,而不該運行的功能如預期一樣失效。
如果類相對比較簡單,或者已有列舉類所有功能的說明文檔,為指定入口點描述用例將很容易。如果不是這樣,或許就需要研究類可能有的所有行為(確定類的目的與用法)。如果你想知道所有調用代碼的地方,也可以從代碼中提取用例。
最可能的情況是,根據開發人員提供的類的一些基本說明文檔,可以完全確定這些類應有和不應有的行為;诖,設計一套準確的用例集。
轉換測試用例
每個測試用例都由兩部分組成:輸入和預期輸出。輸入部分包括所有創建變量或為變量賦值的測試用例語句。預期輸出部分則表明應該得到的輸出結果,它應該顯示斷言成立或“沒有異!(不存在斷言語句時)這樣的信息。
基本的輸入/輸出模式是理解測試用例模型最簡單易用的辦法。它采用一般函數(傳遞參數,獲取返回值)和大多數用戶行為(按某個鍵實現某項功能)慣用的模式。然后,可以用該模式進行:
初始化:建立測試預設環境。代碼初始化可以在測試開始時進行或通過調用setUp()方法實現。
運行:調用被測試的代碼,記錄所有值得注意的輸出和數據。
檢查:使用斷言語句確保代碼正常運行。
文章來源于領測軟件測試網 http://www.anti-gravitydesign.com/