TheServerSide.com 討論板通常是相當活躍的,所以這個月我們駐步于此以了解在性能世界中發生了什么事情。討論板的名字就是 TheServerSide,所以在這里討論的性能集中于 J2EE 系統是很正常的。當然,這是一個相當廣泛的題目,因為它包含了 Java 平臺中的幾乎所有內容——連 J2ME 系統常常也是 J2EE 系統的客戶機,所以有時您甚至可以遇到關于優化 J2ME 系統的問題。
壓力測試和負載測試
在性能列表中最常問的問題是:“是否有一種工具可以幫助我對 J2EE 應用程序進行壓力測試?” 在回答這個問題之前,讓我們問一問自己:壓力測試是什么,為什么這些開發人員需要它?(我相信你們中相當一部分人曾經遇到一定要在昨天完成測試這種讓您感到壓力的情況,但是我們在這里說的不是這個)。壓力測試是為了發現在什么條件下您的應用程序的性能會變得不可接受。這通過改變應用程序的輸入以對應用程序施加越來越大的負載并測量在這些不同的輸入時性能的改變來實現的。這種操作也稱為負載測試,但是負載測試通常描述一種特定類型的壓力測試——增加用戶數量以對應用程序進行壓力測試。
對應用程序進行壓力測試最簡單的方法是手工改變輸入(客戶機數量、需求大小、請求的頻率、請求的混合程度,等等)并描繪性能的變化。對于一些應用程序,您需要做的就是這些。但是如果有許多輸入,或者需要在大的范圍內改變輸入,那么就可能需要一個自動化的工具。另外,在手工測試中,如果想在進行一些改變后重新測試應用程序,可能很難精確地重復一組測試。如果是讓多個用戶測試您的應用程序,那么幾乎不可能一致性地運行手工測試,除非您有很多失業的朋友,否則擴大測試應用程序的用戶數量是非常困難的。
沒有一刀切的方案
不幸的是,沒有一種通用的壓力測試工具,因為每一個應用程序所接受的輸入以及對它們進行處理的方式都是不同的。但是對于許多 J2EE 應用程序來說,從客戶機到達服務器的通信使用的是 HTTP 協議。幸運的是,有許多負載測試工具可以以一種可控制和重復的方式模擬 HTTP 上的用戶活動。它們包括免費工具如 Apache JMeter、The Grinder 以及 PushToText,和相當昂貴的工具如 Mercury Astraload。一般來說一分錢一分貨——工具越貴,它能做的事情就越多。為了了解它們的差別,我們首先來看最基本的負載測試工具能做些什么。
如果您想構建自己的負載測試工具,那么您會首先編寫一個對每一個模擬客戶機運行一個線程的程序。每一個線程需要與服務器通信,可能使用 java.net.URL 類。這種方法使您得到基本的 HTTP 客戶機模擬,它可以執行 GET 和 PUT。每個線程需要做的就是發送 HTTP 請求、收集回復、等待一些時間(模擬“考慮時間”),再重復。這一組行動可以相當容易地抽象到一個單獨的配置文件中。很快,您就得到一個基本的負載測試工具。您可能需要增加一些配置選項以確定運行多少個線程(模擬的客戶機)以及它們是同時開始還是慢慢增加負載。當然,您需要對與服務器的交互計時,因為這是您要測試的核心內容。
如果這么簡單……
那么,對于處理擴展的交互(即一個請求取決于上一個請求的結果)如何呢?對于處理 cookies 如何呢?cookies 對于許多面向會話的 J2EE 系統是必不可少的。改變數據輸入呢?如果 J2EE 應用程序客戶機需要處理一些 JavaScript 以進入下一次通信呢?在收集了響應時間數據后,如何對它進行分析?其他類型的監視,如 CPU 時間、網絡使用、堆大小、分頁活動或者數據庫活動呢?
像這樣和其他的功能,如用于記錄瀏覽器會話并將它們加入到測試腳本中的工具,是高端負載測試工具與基本工具的差別所在。如何為自己選擇正確的工具呢?當然,這取決于您的需要、您的計劃和您的預算。最重要的是,您需要使用可以正確地模擬您的應用程序要求的客戶瀏覽器功能的工具。具備了基本功能后,可以考慮工具的生產率。一般來說,包含的分析工具越多,可以記錄的性能數據類型越多,您可以達到的生產率就越高——您愿意付的錢也就越多。頂級的負載測試程序可以模擬多個瀏覽器,與大多數應用服務器集成,收集多個服務器主機的性能數據(包括操作系統、JVM 和數據庫統計數字),生成可以在以后用高級的分析工具分析的數據集。另一方面,低端負載測試程序是免費的。在那些預算有限的日子里,“免費”的意義是不言自明的。
圖 1 展示了免費的負載測試程序 Apache JMeter,它顯示了一個自動記錄的腳本。
圖 1. JMeter 顯示一個自動記錄的腳本
豐富的功能
我們已經看過了壓力測試工具的基本功能,還適合增加什么附加功能呢?不同的負載測試工具的區別在什么地方呢?當然,您最主要的要求是這個工具必須可以模擬您的應用程序客戶機。如果您的應用程序使用一些不常見的瀏覽器功能組合或者其他非標準客戶機技術,那么就排除了相當一部分候選者。除此之外,還有其他功能使負載測試的生產率更高。對于決定適合于自己項目的負載測試工具,下面的列表是一個有用的出發點:
模擬您的客戶機
首要要求一定是負載測試程序能夠處理您的應用程序所使用的功能和協議。
運行多個模擬的客戶機
這是負載測試程序最基本的功能,它有助于確定哪些是負載測試程序以及哪些不是(一些框架試圖偽裝成負載測試程序)。
腳本化執行并能編輯腳本
如果不能編寫客戶機與服務器之間交互的腳本,那么就不能處理除最簡單的客戶機之外的任務東西。編輯腳本的能力是最基本的——小的改變不應該要求您重新生成腳本。
支持會話
負載測試程序如果不支持會話或者 cookies,那么就不算是真正的負載測試程序,并且不能對大多數 J2EE 應用程序進行負載測試。
可配置的用戶數量
測試程序應該可以讓您指定每個腳本由多少個模擬用戶運行,包括讓您隨時間改變模擬用戶的數量,因為許多負載測試應該從小的用戶數量開始,并慢慢增加到更多的用戶數量。
報告成功、錯誤和失敗
每一個腳本都必須定義一個方法來識別成功的交互以及失敗和錯誤模式(錯誤完全不會有頁面返回,而失敗可能在頁面上得到錯誤的數據)。
頁面顯示
如果負載測試程序可以讓您檢查一些發送給模擬用戶的頁面,這會很有用,這樣您就可以確保測試工作是正確進行的。
導出結果
您常常希望可以用不同的工具來分析測試結果,這些工具包括電子表格和可以處理數據的自定義腳本。雖然許多負載測試工具包括大量的分析功能,但是導出數據的能力使您在以任意的方式分析和編目數據方面具有更大的靈活性。
考慮時間
真實世界的用戶不會在收到一頁后立即請求另一頁——一般在查看一頁和下一頁之間會有延遲。 考慮時間 這個標準術語表示在腳本中加入延遲以更真實地模擬用戶行為。大多數負載測試程序支持根據統計分布隨機生成考慮時間。
客戶機從列表中選擇數據
用戶一般不會使用同樣的一組數據,每位用戶通常與服務器進行不同的交互。模擬用戶應該也這樣做,如果在交互的關鍵點,腳本可以從一組數據中選擇數據,則可以更容易地讓您的模擬用戶表現出使用不同數據的行為。
從手工執行的會話記錄腳本
相對于編寫腳本,用瀏覽器手工運行會話并記錄這個會話然后再編輯會容易得多。
JavaScript
一些應用程序大量使用 JavaScript 并且需要模擬客戶機支持它。不過,使用客戶端 JavaScript 可能會增加對測試系統上系統資源的需求。
分析工具
測量性能只是成功的一半。另一半是分析性能數據。誰能比編寫測試工具的人能更好地開發這種分析工具呢?是的,至少理論是這樣。無論如何,您的工具箱提供的分析工具越多,您就能做得越好。
測量服務器端統計數字
基本負載測試程序測量客戶機/服務器交互中基于客戶機的響應時間。如果同時收集其他統計數字,如 CPU 使用情況和頁面錯誤率就更好了。您得到的統計數字越多,您用負載測試系統可以做的就越多。如果有這種數據,那么就可以做一些有用的工作,如查看服務器負載上下文中的客戶機響應時間和吞吐量統計。
結束語
用任何一種工具可以完成的工作常常受到人的技能、知識和想像力的局限。在描述用負載測試工具查看什么內容的時候,我們也展示了使用這種工具的各種可能性,F在,您可以運用您的想像力去開拓更多的可能性。
參考資料
閱讀 Jack Shirazi 和 Kirk Pepperdine 所寫的的全部“關注性能 系列”。
Java Performance Tuning 站點包含上千個性能調優提示和技巧。
“ review of stress testing tools”這篇文章比較了幾個免費工具和商業工具。
從 PushToTest 的首席執行官 Frank Cohen 所寫的 performance testing SOAP-based applications 一文( developerWorks,2001 年 11 月)學習相關技巧。
教程“IBM Web performance tools”( developerWorks,2002 年 12 月)提供了一些很好的實用建議。
學習如何 stress test your software without stressing out your testers (developerWorks,2001 年 2 月)。
Web 服務是分布式計算的核心,它們之間的交互通常是難于測試的。在“ Stress testing Web services”這篇文章(developerWorks, 2003 年 8 月)中,Chris Wilkinson 表明了壓力測試是發現代碼缺陷的高效方法,但是其前題條件是這些是有效設計的壓力系統。
“ Proofing Web applications for performance and scalability” ( developerWorks,2001 年 6 月)是一個為負載測試開發腳本框架的案例分析。
Apache JMeter 是一個免費的負載/回歸測試工具。
The Grinder 是一個免費的工具,它可以用一個圖形控制臺應用程序來協調測試腳本在多臺計算機上的活動。
有關 Web 站點測試和站點管理工具的信息請參閱 Software Q/A Test Resource Center。
在 developerWorks Java 技術專區 可以找到關于 Java 編程各個方面的數百篇文章。
文章來源于領測軟件測試網 http://www.kjueaiud.com/