程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 使用Eclipse Callisto分析應用程序

使用Eclipse Callisto分析應用程序

編輯:關於JAVA

Eclipse(Eclipse 3.2)的最新版本帶有Callisto,一套豐富的針對Eclipse 3.2的可選插件。Callisto包括一個功能強大的分析工具,此工具稱為Eclipse測試與性能工具平台,簡稱TPTP。TPTP提供了一套功能全面的開源性能-測試和分析工具,包括集成的應用程序監控、測試、跟蹤和分析功能,以及靜態代碼分析工具。對於在各類Java應用程序中找出和識別性能問題,分析工具的價值是不可估計的。在本文中,我們將探討如何使用TPTP來保證獲得高質量和高性能的代碼(甚至是在單元和集成測試中)。

安裝TPTP

安裝TPTP最容易的方式是使用Remote Update站點(參見圖1)。打開Remote Update窗口(Help -> Software Updates -> Find and Install),然後選擇Callisto Discovery Site。Eclipse將建議安裝Callisto插件集。TPTP工具列在“Testing and Performance”下面。最容易也是最耗時的選擇,就是安裝所有建議的插件。即使不安裝整個Callisto工具集,您仍然需要安裝一些其他TPTP需要的組件,例如"Charting and Reporting"、"Enabling Features"和"Data Tool Performance"。

圖1.從遠程站點安裝TPTP

分析Java應用程序

測試與性能工具平台基本上是一套分析工具。分析應用程序通常涉及到觀察應用程序在壓力之下的處理方式。這樣做的一種常見方式是對已部署的應用程序運行一組負載測試,然後使用分析工具來記錄應用程序的行為。接著,可以對結果進行研究來調查任何性能問題。這些事情通常是在項目結束時進行的,因為此時應用程序幾乎已經准備好進入生產階段了。

TPTP非常適合這類任務。一個典型的用例是使用像JMeter這樣的工具來運行負載測試,然後使用TPTP歸納工具記錄和分析性能統計數據。

然而,這並非使用TPTP分析應用程序的唯一方式。通常,越早進行測試,後面遇到的問題就越少。借助TPTP,您可以在很多上下文中分析代碼,包括JUnit測試用例、Java 應用程序和web應用程序。而且它很好地集成到了Eclipse IDE中。所以,沒有理由不在早期開始初步性能測試和分析工作。

TPTP讓您可以測試應用程序行為的幾個方面,包括內存使用(創建了多少對象,這些對象的大小如何)、執行統計數據(應用程序在哪些地方所花的時間較多)和測試覆蓋(測試期間執行代碼的確切數量)。每個方面均可提供有關應用程序性能的獨立信息。

不管怎麼說,內存洩漏可能而且的確存在於Java中。創建(並保存)不必要的對象會增加對內存的需求,並加重垃圾收集器的工作負擔,這都會損害應用程序的性能。而且,如果運行應用程序的服務器的持續正常運行時間很長,累積下來的內存洩漏可能最終導致應用程序崩潰或服務器停止運行。這些都是留心應用程序內存洩漏情況的充分理由。

根據80-20經驗法則,80%的性能問題出現在20%的代碼中。或者,換句話說,只要把精力集中在應用程序中執行最經常的部分上,就可以花費相對較少的氣力使性能有實質性的提高。在這種情況下,執行統計數據就可以派上用場了。

除此以外,TPTP還提供一些基本的測試覆蓋數據。盡管這些統計數據不如Cobertura或Clover這樣的專用工具提供的完整,您仍然可以通過它們快速了解性能測試正在有效地測試哪些方法。

在本文中,我討論的測試種類同樣是沒有經過優化的。優化涉及到使用像緩沖這樣的技術對應用程序性能進行微調。這是一項對技術要求很高的操作,最好留到項目的最後完成。

這裡所討論的這種初步性能測試和分析僅僅包括,確保應用程序從一開始就正確執行,以及沒有編碼錯誤或糟糕的編碼實踐會在後面的階段中對性能產生不利的影響。事實上,修復內存洩漏和避免不必要的對象創建並不是優化——這只不過是調試,而且同樣應該盡可能早地完成。

讓我們通過使用一些單元測試來分析一個類的方式開始。可以分析常規的單元或集成測試,或者編寫針對性更強的面向性能的測試。通常,您應該嘗試分析與生產代碼最接近的代碼。許多人使用模擬對象來代替DAO對象進行單元測試,使用這項功能強大的技術可以加速開發生命周期。如果使用這類方法,一定要使用這些測試來運行分析工具,它可以揭示有關內存使用和測試覆蓋的有用信息。然而,性能測試的價值是有限的,因為對於與數據庫相關的應用程序來說,其性能往往是由數據庫的性能所決定的,所以在這個上下文中,應該進行所有重要的性能測試。簡而言之,不要忘了分析基於實際數據庫而運行的集成測試。

出於本文的需要,我們將對以下類進行測試,這個類代表了一個到庫目錄的簡單接口。

interface Catalog {
 List findBooksByAuthor(String name);
 List findAllBooks();
}

基本的單元測試如下:

public class CatalogTest extends TestCase {
 ...
 public Catalog getCatalog() {
  ...
 }
 public void testFindBooksByAuthor() {
  List books = getCatalog().findBooksByAuthor("Lewis");
 }
 public void testLoadFindBooksByAuthor() {
  for(int i = 0; i < 10; i++) {
   List books= getCatalog().findBooksByAuthor("Lewis");
  }
 }
 public void testFindAll() {
  List books = getCatalog().findAllBooks();
 }
}

您需要做的第一件事情就是建立一個分析。在Eclipse主菜單中選擇"Run -> Profile",這將打開一個向導,您可以在其中配置不同種類的測試分析,如圖2所示。

圖2. 創建一個TPTP分析

在這個例子中,我們感興趣的是JUnit測試分析。雙擊這一項;向導應該為每個單元測試類創建新的項。TPTP相當靈活,您可以在此屏幕中配置各個選項。例如,在Test選項卡上,可以單獨分析單元測試類,也可以按照項目或軟件包對它們進行分組。在Arguments選項卡上,可以指定運行時參數,而在Environment選項卡上可以定義環境變量。在Destination選項卡中,可以指定一個外部文件,用於保存分析數據以供以後使用。但是,最有用的是Monitor選項卡(參見圖3),可以在上面指定要記錄和研究的性能相關數據:

Basic Memory Analysis(基本內存分析):這個選項用於記錄內存使用的統計數據,包括對象實例的數量和已經使用的全部內存。

Execution Time Analysis(執行時間分析):這個選項用於記錄性能數據——即應用程序分別在每個方法上所花的時間長短。

Method Code Coverage(方法代碼覆蓋):這個選項用於通知在測試期間執行了哪些類和方法。

圖3: 在Monitor選項卡上定義要記錄數據的類型。

您可以直接從這個窗口運行分析工具,也可以使用位於要分析的測試類上的上下文菜單,方法是選擇Profile As菜單項(參見圖4)。

圖4:可以使用上下文菜單運行TPTP分析工具。

運行分析工具可能要花上一段時間,這取決於測試用例的大小。完成之後,Eclipse將顯示一個Profiling Monitor視圖,可以在其中顯示每種類型分析的結果的詳細信息(參見圖5)。

圖5: 分析結果

Memory Statistics視圖顯示了應用程序創建的對象的數量。結果可以按照軟件包來組織(以樹視圖的形式),或者顯示為類或實例的一個列表。這些數據可以讓您了解每種類型創建了多少個對象;應該對創建的對象(特別是高級對象,例如域對象)不正常的高數量持懷疑態度。

用於檢測內存洩漏的另一個有用工具是Object References視圖。為了獲得這些數據,您需要激活引用收集。啟動分析之後,點擊monitoring項,然後在上下文菜單中選擇Collect Object References(參見圖6)。接下來,通過上下文菜單(Open with -> Object References)打開Object References視圖。您將獲得一個類的列表,它帶有對每個類的引用的次數。這可以為可能的內存洩漏提供一些線索。

圖6: 激活引用收集

如圖7所示,從Execution Statistics視圖可以清楚地了解到應用程序執行到了哪裡。"organization by"軟件包可以幫助您找出執行時間最長的類和方法。點擊一個方法將打開Method Invocation Details視圖,它將顯示有關方法被調用次數、調用地點以及它本身調用了哪些其他方法的更詳細信息。盡管與一些可以向下發掘到源代碼本身的商業工具相比,這個視圖與源代碼視圖的集成度沒有那麼高,但是它還是可以給出一些重要線索,幫助您找出執行錯誤的方法。

圖7: Execution Statistics視圖

Coverage Statistics視圖(參見圖8)提供的信息是關於,您剛剛運行的測試用例使用了(因此至少在某種程度上測試了)哪些方法。覆蓋統計數據是一項優秀的功能,盡管它們提供的信息的詳細程度還無法與像Cobertura、Clover和jcoverage這樣的專業覆蓋工具相提並論(它們可以提供行精度的覆蓋數據,以及行和分支覆蓋的統計數據)。盡管如此,它也有自身的優點,那就是可以提供實時的覆蓋結果,而目前,只有商業的代碼覆蓋工具,例如Clover和jcoverage,才能提供行級別的覆蓋報告和完整的IDE集成。

圖8: Coverage Statistics視圖

靜態分析工具

在TPTP工具箱中,另一件有趣的工具就是靜態分析工具。Java靜態分析工具,例如PMD,允許通過基於一組代碼預定義規則和最佳實踐檢查來檢查代碼,從而自動驗證代碼質量。現在,TPTP也包含一個靜態分析工具。除了提供它自己的一組靜態分析規則之外,這個工具還可以提供一個一致的接口,其他工具廠商可以在這個接口中集成他們自己的規則。

要對代碼進行靜態分析,需要創建分析配置。在Java視圖或Analysis圖標中,使用上下文菜單打開Analysis窗口,它現在應該出現在工具欄上(參見圖9)。分析配置決定了要分析的代碼(Scope)和應該遵循的規則(Rules)。有71條規則可供選擇,例如"Avoid casting primitive types to lower precision"和"Always provide a break at the end of every case statement"。您還可以使用預定義的規則,例如"Java Quick Code Review"(在這裡,71條規則中只有19條適用)。

圖9:建立靜態分析規則

要分析代碼,使用工具欄中的Analysis圖標。分析不是實時完成的,就像一些其他的類似工具一樣,例如Checkstyle。然而,給出的結果很清晰(參見圖10):錯誤在源代碼視圖中標出,並且按照錯誤類型,以樹視圖的形式在Analysis Results視圖中列出。"Quick Fix"是一項優雅的特性,它出現在錯誤類型的上下文菜單中,而且如果可能,它可以自動為您糾正問題。

圖10: 靜態代碼分析結果

結束語

Eclipse測試與性能工具平台是Eclipse IDE工具箱中極具價值的部分。它支持的性能測試的范圍很寬,這有助於從第一個單元測試開始,就確保獲得高質量和高性能的代碼。

TPTP無疑還比不上一些可用的商業工具,例如OptimizeIt和JProbe,後者的報告和分析功能要更加完善,而且表示通常更加精練。然而,商業的分析工具往往非常昂貴,而且很難在最嚴峻的環境中來驗證它們的使用情況。盡管TPTP還相對較為不成熟,它仍然可算作一款功能強大的產品,毋庸置疑,它可以提供對於許多項目來說不可或缺的有價值的分析數據。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved