第一章 簡介: jtest是parasoft公司推出的一款針對java語言的自動化白盒測試工具,它通過自動實現java的單元測試和代碼標準校驗,來提高代碼的可靠性。Jtest先分析每個java類,然后自動生成junit測試用例并執行用例,從而實現代碼的最大覆蓋,并將代碼運行時未處理的異常暴露出來;另外,它還可以檢查以DbC(Design by Contract)規范開發的代碼的正確性。用戶還可以通過擴展測試用例的自動生成器來添加更多的junit用例。Jtest還能按照現有的超過350個編碼標準來檢查并自動糾正大多數常見的編碼規則上的偏差,用戶可自定義這些標準,通過簡單的幾個點擊,就能預防類似于未處理異常、函數錯誤、內存泄漏、性能問題、安全隱患這樣的代碼問題。 另外,jtest 采用parasoft公司的AEP方法論來實現團隊開發中對代碼錯誤標準化管理,這個方法論,也是parasoft提出的基于團隊開發模式下提高軟件質量和可靠性的一套解決方案,目前還處在探索階段,詳情可參閱 http://www.parasoft.com/jsp/aep/aep.jsp 。 優勢: 1)使預防代碼錯誤成為可能,從而大大節約成本,提高軟件質量和開發效率 2)使單元測試——包括白盒、黑盒以及回歸測試成為可能 3)使代碼規范檢查和自動糾正成為可能 4)鼓勵開發團隊橫向協作來預防代碼錯誤 特征: 1)通過簡單的點擊,自動實現代碼基本錯誤的預防,這包括單元測試和代碼規范的檢查 2)生成并執行junit單元測試用例,對代碼進行即時檢查 3)提供了進行黑盒測試、模型測試和系統測試的快速途徑 4)確認并阻止代碼中不可捕獲的異常、函數錯誤、內存泄漏、性能問題、安全弱點的問題 5)監視測試的覆蓋范圍 6)自動執行回歸測試 7)支持DbC編碼規范 8)檢驗超過350個來自java專家的開發規范 9)自動糾正違反超過160個編碼規范的錯誤 10)允許用戶通過圖形方式或自動創建方式來自定義編碼規范 11)支持大型團隊開發中測試設置和測試文件的共享 12)實現和IBM Websphere Studio /Eclipse IDE 的安全集成 第二章 本章說明了如何安裝jtest full版本,full版本包括jtest和eclipse,jtest被集成在eclipse框架內部。 1.在windows安裝步驟: 1)雙擊jtest自解壓文件jtest5_win32.exe 2)按提示步驟進行,選擇【complete jtest installation】,一直到結束安裝 2.在unix安裝步驟: 1)將安裝文件jtest.linux.tar.gz或gzip –dc jtest.solaris.tar.gz 拷貝到即將安裝jtest的目錄 2)解壓檔案文件: linux:gzip –dc jtest.linux.tar.gz | tar xvf – solaris: gzip –dc jtest.solaris.tar.gz | tar xvf – 解壓后,出現一個叫做jtest的目錄,包含了jtest安裝后的全部文件。 運行jtest時,執行 ./jtest 命令即可。 注冊:獲得正版jtest安裝程序后,只有正確注冊才可以使用,方法也很簡單,這里不詳述。 第三章 本章是jtest的快速指南部分,讀者可迅速掌握jtest的基本功能及使用方法;包含的主題如下: 1)第一課:創建一個實例項目 2)第二課:檢查代碼規范 3)第三課:自動修復代碼規范錯誤 4)第四課:訪問代碼規范的描述信息 5)第五課:忽略/取消忽略報告的錯誤 6)第六課:運行jtest builtin 配置 7)第七課:以fly方式檢查特定的編碼標準或一組標準 8)第八課:清除錯誤信息 9)第九課:創建、執行、擴展junit測試用例 10)第十課:通過實例配置來修改代碼的檢查規范 11)第十一課:創建并運行一個簡單的用戶自定義jtest配置 12)第十二課:執行回歸測試 13)第十三課:檢測內存泄漏 一、 創建一個實例項目 jtest 默認情況下,可以創建一個java實例項目,本章里,我們也利用該項目演示。用戶在使用自己的代碼時,就不必創建這樣的項目來使用jtest,直接利用在eclipse里創建的java項目即可。 目的: 演示如何創建jtest實例項目 步驟: 1)選擇 file>new>jtest example project 2)默認項目名稱是jtest example ,點擊finish即可 項目創建完成,并顯示在jtest 視窗里。Package explore顯示在工作臺左側,此時只列出一個jtest example項目。如何在java視窗里查看項目呢? 1) 點擊工作臺左上方快捷條里的java perspective 按鈕;如果java perspective 按鈕不在,點擊快捷條里的open perspective按鈕,選擇other,然后選擇java,打開即可。 2) 或者在快捷條里點擊java perspective 按鈕進入jtest視窗,如下: ——>jtest 視窗 ——>java視窗 ——>open 視窗 二、檢查代碼規范 通過檢查代碼規范,用戶可以避免一些將來可能導致軟件功能、性能或安全方面的問題。 目的: 演示如何檢查代碼規范,并瀏覽報告的代碼規范錯誤。 步驟: 這里我們檢查simple這個類(在jtest example項目里的example.eval包里)是否符合默認的java編碼規范。 1)選擇simple.java源文件 2)在工具欄里點擊play按鈕,即 默認情況下,點擊這個按鈕,jtest會將檢查代碼規范和單元測試一并執行;后續課程里,我們會說明如何執行特定的測試,這里我們集中講述代碼規范分析和分析結果。 3)測試運行結束后,在jtest運行面板里選擇standards標簽,這里包括如下關于編碼規范的內容: · 代碼規范檢查耗費的時間 · 被檢查的文件個數 · 運行失敗的次數 · 發現的錯誤個數 · 忽略掉的錯誤個數 · 違反編碼的規范個數 4)關閉運行窗口。 5)在jtest工作臺右下方,檢查errors found視窗。如果該視窗不在,選擇window>show view>other,選擇jtest>errors found,即可。 6)在errors found視窗,打開example.java分支,前六個報告的錯誤是代碼規范錯誤,每個代碼規范錯誤都包含在引起錯誤的代碼行數和簡單的錯誤描述信息。 7) 雙擊[Line: 54] Text label ’case10’ may be typo for ’case 10’節點,simple.java這個文件的編輯器自動打開,并且違反代碼規范的那一行會高亮顯示,鼠標也自動定位在錯誤附近。 三、自動修復代碼規范錯誤 jtest 能自動修復大多數它捕獲的代碼規范錯誤,它利用集成的eclipse quick fix 特性來實現此功能??梢宰詣有迯偷拇a規范錯誤,在jtest configurations面板的standards標簽里,都被標記成黃色球形圖標。 目的: 演示如何利用jtest quick fix 特性來自動修復編碼規范錯誤。 步驟: 1)在errors found 視窗里,擴展simple.java節點,雙擊[Line: 54] Text label ’case10’ may be typo for ’case 10’這個錯誤,編輯器自動打開,錯誤行高亮顯示,并且編輯器的左側有個黃色球形圖標標記這個錯誤,這個圖標的出現表示能夠利用quick fix 選項來自動糾正代碼規范錯誤。 2)在這個黃色球形圖標上點擊一下,彈出兩個選項窗口,一個是針對這個編碼錯誤的quick fix,另一個提供了被違反的編碼規范的描述信息。 3)雙擊fix選項,就會自動糾正編碼規范錯誤,jtest也會重新定位編輯器里的代碼。針對這個例子,case10會替換case 10,以后再測試的話,就不會再報錯了;而且,jtest也自動刪除了在errors found視窗里關于這個錯誤的信息。 4)保存代碼。 四、訪問代碼規范的描述信息 jtest 能自動檢查超過350個編碼規范和任何數量的用戶自定義規范。每條規范都有一個對應的描述信息,用來幫助用戶理解自己的代碼為何偏離了正確的規范。 目的: 演示如何深入了解報告的編碼規范錯誤信息 步驟: 1) 在errors found視窗,擴展simple.java 分支 2) 右鍵單擊[Line: 53] case 0 is missing either "break", "return", or /*falls through */這個錯誤,選擇view rule description,jtest就會顯示在builtin help窗口里顯示關于這個規范的描述信息 3)瀏覽之后,點擊back按鈕即可 所有的編碼規范的描述信息都可以在jtest的幫助里獲得。 五、忽略/取消忽略報告的錯誤 用戶在編碼時,有些違反編碼規范的錯誤可以忽略不計,那么可以通過此功能來實現,以后再測試時,不會再提示錯誤信息。如果想針對一些特定編碼規范全部忽略,我們推薦最好修改jtest configurations,以便jtest測試時不對其檢查。 目的: 演示如何忽略/取消忽略報告的錯誤。 步驟: 針對simple.java類,想要忽略Utility class does not have a "private" default constructor: ’Simple’ 這個錯誤: 1)在errors found視窗里,擴展simple.java分支 2)右鍵點擊Utility class does not have a "private" default constructor: ’Simple’ 這個錯誤,選擇suppress error選項 3) 在彈出對話框里輸入個短語或句子表示為何要忽略這個錯誤。針對此例,輸入exploring suppressions;關閉對話框,相應的編碼規范錯誤從errors found里清除。將來再測試時,該錯誤信息會報告在suppressed messages視窗里。 Suppressed messages如果不在,也可通過相同的方法從jtest>show view>suppressed messages打開,這個視窗有如下信息: · message:忽略掉的 jtest 錯誤 · reason:錯誤被忽略掉的原因 · resource:忽略錯誤的源文件 · user:執行忽略錯誤的操作者 · date:執行忽略錯誤的日期 如果想取消忽略這個錯誤: 在suppressed messages視窗里,右鍵點擊CODSTA.UCDC: Utility class does not have a "private" default constructor: ’Simple’ 這個錯誤,選擇remove suppression即可 六、運行jtest builtin 配置 jtest configuration是一個定義了用戶想要測試的內容設置的集合。每次jtest運行測試,都會用指定的jtest configuration(如果沒有選擇特定的jtest configuration,會執行默認的jtest configuration);一般jtest configuration會確定以下一些設置參數: 執行的測試類型(編碼規范檢查、測試用例生成、測試用例執行等) 需要檢查的編碼的規范 自動生成測試用例時需要的參數 每個測試執行的范圍(覆蓋多少行等) jtest包含一系列由jtest開發者預定義的builtin配置,其中有一個java coding conventions(java編碼風格)是基于sun公司的java編碼風格,以此來檢查指定的編碼規范,詳情參閱http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html。 目的: 演示如何運行jtest里特定的jtest configurations。 步驟: 這里我們檢查simple.java類是否符合sun公司的java編碼風格 1) 選擇simple.java源文件 2) 打開play下拉菜單,選擇jtest using>builtin>coding standards>code conventions for the java programming language by sun,運行完成后,打開一個對話框 3) 關閉對話框 4) 在errors found視窗里查看該文件違反sun編碼風格的地方 七、以fly方式檢查特定的編碼標準或一組標準 如果用戶想快速檢查代碼是否符合單一代碼規范,或一組規范,可以采用fly方式來檢查代碼,而不必采用jtest builtin configuration或創建自定義的jtest配置。 目的: 演示如何執行fly方式下的編碼規范檢查。 步驟: 1)選擇simple.java源文件 2)打開play下拉菜單,選擇jtest using>builtin>coding standards rules>formatting>check all rules in this category(也可選擇其他的選項) 3)查看errors found視窗里是否出現錯誤信息 八、清除錯誤信息 如果用戶想要清除掉tasks視窗或errors found視窗里的錯誤信息,需要學習本課程。這些清除掉的信息只是臨時刪除,下次運行出錯,依然會顯示出來。 目的: 演示如何清除掉tasks視窗或errors found視窗里的錯誤信息。 步驟: 利用shift或ctrl鍵選擇錯誤信息,右鍵點擊錯誤信息,可選擇delete error或delete all/clear all。 九、創建、執行、擴展junit測試用例 jtest 能自動生成并執行junit測試用例,來發現代碼運行的未處理異常,用戶也可以擴展這些用例來增強測試覆蓋范圍,檢查代碼單元級功能、子模塊、模塊以及系統級功能。 目的: 演示如何自動生成并運行junit測試用例,如何查看和驗證測試結果,以及如何修復發現的錯誤。 步驟: 1)選擇simple.java源文件 2)點擊play按鈕 3)查看運行后的對話框(這里run標簽表示運行了13個用例,error標簽發現了一個錯誤,failures標簽里沒有運行失敗的用例) 4)關閉該運行窗口 5)注意這里jtest把生成的junit測試用例文件simpletest.java加到了一個新項目jtest example.jtest的examples.eval包里 6) 在error found視窗里,右鍵點擊[Line: 107] java .lang. NullPointer Exception這個錯誤,選擇quick fix選項 7)按用戶意愿自動修復后,保存代碼 8) 可通過選擇play下拉菜單的Jtest Using> Builtin> Generate and Run Unit Tests,重新運行測試 9) 通過打開simple.java文件,可以在編輯器里修改測試代碼,以增強測試;輔助test class outline視窗,可更好的查看測試代碼的結果。如果test class outline視窗不在,可通過Jtest Perspective>Jtest> Show View> Test Class Outline打開 10)擴展test class outline分支,能看到每個用例的輸入inputs和結果outcomes,如果知道了每個方法的正確結果,那么可以: · 對每個正確的結果outcome,可右鍵點擊outcome節點,選擇verify,jtest會將//unverified注釋從這個用例文件里除掉,在以后測試里,jtest就會檢查取該值的輸出結果,如果出錯則報告錯誤。 · 對于不正確的outcome,點擊outcome節點,會在編輯器里修正,jtest在以后測試里同樣檢查正確的值,如果出錯則報錯。 · 對于用戶不想讓jtest在以后的測試里檢查的outcome,可右鍵點擊outcome節點,選擇ignore,則將其注釋掉,以后測試里將其忽略. 十、通過實例配置來修改代碼的檢查規范 前述的實例配置默認是全局配置,即點擊play時jtest執行的測試;用戶可以修改該配置。 目的: 演示如何自定義jtest實例配置增強測試規則 步驟: 1)從菜單中選擇jtest-jtest configuration或點擊play下拉菜單選擇該項,所有可以配置項顯示在左側面板,user defined分支可以修改,builtin項可以查看和拷貝,但不能修改。 2)選擇example configuration項,注意此項有個紅色G的標志,表示該項被設置成全局配置。 3)打開standards標簽,這里是用戶可以激活和關閉的代碼標準規范 4)點擊internationalization復選框,將會提示jtest配置檢查并阻止國際化錯誤 以后jtest執行測試時,就會檢查國際性錯誤;如果想取消該檢查標準,按照同樣的步驟取消復選框即可。 十一、創建并運行一個簡單的用戶自定義jtest配置 jtest預設置的jtest configurations是基于開發者使用的最普遍的測試場景,如果想自定義測試,可以修改builtin配置或者創建用戶定義的jtest配置,我們推薦每次執行不同的測試項目時都設置不同的測試場景。 目的: 演示如何創建一個簡單的jtest對類編碼的檢查規范 步驟: 1)打開jtest-jtest configuration面板 2)選擇user defined項 3)點擊new,表示要創建一個新的jtest測試場景,jtest添加一個新目錄叫做example configuration(1) 4)輸入該場景的名字,例如輸入metrics,這里我們讓jtest只檢查類規范 5)打開standards標簽 6)點擊disable all visible rules按鈕,先關閉所有標準;如果看不到這個按鈕,擴大整個面板就可以看到了。 7)點擊class metrics復選框激活全部的類編碼標準;擴展class metrics節點可查看具體規范 8)打開generation標簽,清除enable unit test generation復選框;這是為了讓這個自定義的測試場景只集中在代碼規范上,如果要生成測試用例,運行已經存在的jtest配置即可。 9)打開execution標簽清除enable unit test execution復選框,目的和上一個相同 10) 點擊close,提示是否保存時,選擇yes 11) 運行該測試場景時,點擊要測試的項目,從play下拉菜單里選擇user defined-metrics即可 十二、執行回歸測試 當jtest第一次運行一個單元測試時,它會創建一個關于當前測試類的功能快照,并以junit格式的測試用例記錄了類的行為。實質上,它自動創建了一個回歸測試,當一個測試類修改了,可以重新運行測試用例來檢查是否出現錯誤。 目的: 演示jtest如何執行回歸測試 步驟: 1)打開simple.java源文件的編輯器 2)將add()方法里的“+”改成“-”,下一行應該變成return 11-12 3)保存源文件 4)選擇simple.java源文件 點擊play按鈕運行回歸測試;jtest將報告錯誤junit.framework.AssertionFailedError: expected:<14> but was:<0>。這個錯誤提示我們add()方法的功能自從上次測試后改變了;如果該錯誤不是故意的,例如排版會敲錯,我們將要糾正該錯誤恢復到從前的正確情況;如果是故意這樣修改,那就要糾正期望的outcome。 十三、檢測內存泄漏 jtest能夠在執行單元測試時檢測內存泄漏。如果測試結束,內存仍然在使用中,jtest將會報告內存泄漏。 目的: 演示jtest如何在測試執行中檢測內存泄漏 步驟: 1)打開example configuration 2)打開execution標簽 3)打開options子標簽 4)激活detect memory leaks選項 5)apply并close 6)選擇library.java源文件:打開jtest example項目-example.leaks-library.java 7) 從play下拉菜單里選擇Jtest Using> User-Defined> Example Configuration 8) 測試結束,報告內存泄漏錯誤細節 9) 雙擊[Line 37] Memory Leak: 3.8 megabytes per call,在源文件里打開代碼,找到引起內存泄漏的代碼行——每次addbook()方法被同樣的參數調用,第37行代碼分配的內存沒有被釋放 10) 取消文件末尾的hashcode()和equals()方法的注釋,以此來消除內存泄漏錯誤即可。 第四章 本章是一些概念,英文書中列舉的一些重要概念在前面都有所介紹,另外一些對實際jtest用戶用處不大,以后我會寫一個如何學習jtest的文檔,在那里再仔細闡述。這里有一個概念,前面沒有提到,這里簡單說一下。 Rulewizard:是用戶自定義jtest代碼檢查標準的模型,和jtest4.5或早期版本的功能、使用都相同。(關于Jtest4.5版本的使用介紹,本人也有個文檔)Jtest能利用Rulewizard自動增加任何有效的代碼檢查標準,以此,項目團隊檢查特殊項目的代碼需求。 使用Rulewizard,代碼規范能通過圖形方式(類似流程圖)或自動方式(提供代碼實例來演示實際的代碼規范偏差)來創建。 Rulewizard在jtest architect edition(架構版本)才可以用。這句話是原文說的,但在我們安裝的full版里也可以打開,也許是full版里也包括Rulewizard了吧。其界面如下: 如何打開Rulewizard呢? 1)打開Jtest> Jtest Configurations 2)打開任何jtest configuration的standards標簽 3)右鍵點擊rules樹的區域,選擇add user-defined rule;Rulewizard界面就打開了,關于它的詳細使用(修改、創建。激活等)參考幫助里的view in the Rulewizard UI。不過本人覺得沒什么必要,人家parasoft提供的都夠多、夠全了,我們何必再加這些規范呢?除非真的有特殊需要吧;相反,等你用jtest,就會發現我們開發的代碼很多地方都會被jtest認為有錯,到時候你可別煩啊,^-^! 第五章 本章介紹jtest一些任務,主要功能任務都已經在第三章闡述過了;這里只說明一些其他輔助任務。 一、定時執行測試任務: jtest允許定時執行測試,和其他的自動化工具一樣,可以安排夜晚執行測試,第二天來查看測試結果。另外,jtest還可以按照計劃時間來創建大批量的測試用例,以不影響白日的工作。 如何定時測試呢? 1) 選擇jtest-preferences 2) 選擇jtest-scheduled testing 3) 激活enable scheduled testing選項 4) 在 execution time里輸入希望的開始時間:第一個文本框輸入小時(0到23),第二個文本框輸入分鐘(0到59),例如希望在pm 10:30開始,那么就在第一個框里輸入22,在第二個里輸入30即可 5) 點擊configuration to run的edit按鈕,選擇要執行的jtest configuration 6) 下一個edit是選擇此執行要覆蓋的測試集,即某項目或部分項目文件 7) 點擊apply 注意:如果jtest主程序沒有打開,到了定時時間,測試不會自動運行 二、評估發現的錯誤: 和第三章介紹的error found一樣,這里添加一個參考圖示,供讀者進一步了解: 三、查看測試覆蓋信息: jtest能報告所有junit測試用例的覆蓋率,因此用戶可以評估當前代碼被測試的范圍,并決定是否需要增加額外的測試用例。一般來說,jtest能自動創建覆蓋了被測試代碼75%的測試用例,有時覆蓋率也會達到100%,有時也會低于 75%。 測試覆蓋率的跟蹤一般被默認為是激活的。如果想要手工激活: 1)打開Jtest> Jtest Configurations 2)選擇想要修改的測試配置,打開execution標簽,再選擇option子標簽,保證report code coverage選項是激活的 測試執行后,想要查看覆蓋率信息,有以下兩個個方法: 1)打開一個測試文件的編輯器,在編輯區域左側的一個蘭色/綠色條表示測試覆蓋的行,紫色條表示沒有覆蓋到的行,沒有顏色的行表示不可執行的部分 2)打開coverage view面板,顯示了每個類和每個方法的覆蓋率統計圖(覆蓋百分比、全部可執行的行、覆蓋的行),如圖: 總結:關于jtest的基本使用,我想上述的內容就夠了。白盒測試工具不像winrunner、robot等黑盒工具有那么多的預設置或腳本代碼編寫工作,它的設置簡單明了;包括有一些我沒有介紹的設置,例如修改測試范圍scope、連接teamserver等(本人覺得這些內容也不重要,對使用jtest精髓毫無價值),讀者只要裝了jtest,按照我介紹的主要功能描述,點擊幾次自然就融會貫通了。 |