摘要:針對Web應用軟件的特征,提出了一種基于目標的性能測試方法,其關注的主要內容包括與Web應用相關的負載測試和壓力測試兩個方面。不但對這兩個方面的測試方法進行了全面的分析和探討,還強調了測試過程管理的重要作用,最后給出了這種方法在Web應用性能測試實踐中的一個具體應用。
關鍵詞: 性能測試; 負載測試; 壓力測試; 軟件測試
中圖法分類號:TP301文獻標識碼:A
文章編號:1001-3695(2007)01-0275-03
目前,隨著電子商務和電子政務等Web應用的興起,基于B/S結構的軟件日益強勁發展,正在成為未來軟件模式的趨勢。然而,當一個Web應用被開發并展現在用戶、供應商或合作伙伴的面前時,尤其是即將被部署到實際運行環境之前,用戶往往會疑問:這套Web應用能否承受大量并發用戶的同時訪問?系統對用戶的請求響應情況如何?在長時間的使用下系統是否運行穩定?系統的整體性能狀況如何?如果存在性能瓶頸,那么是什么約束了系統的性能?而這些正是Web性能測試解決的問題,如何有效進行Web性能測試,目前并沒有一個系統和完整的回答。此外,由于緊湊的開發計劃和復雜的系統架構,Web應用的測試經常是被忽視的,即使進行了測試,其關注點也主要放在功能測試上。但是,近年來Web性能測試越來越引起重視,成為Web系統必不可少的重要測試內容。
本文的研究就是基于這種需求,從已進行過的Web性能測試實踐中總結一套基于目標的Web性能測試方法,該方法已在大量的軟件測試項目實踐中被證明是有效的和可操作的。其具體測試實施方面包括負載測試和壓力測試。
1基于目標的Web性能測試方法
1.1基本概念
一般來說,性能測試包括負載測試和壓力測試兩個方面,它們是同一過程的兩個階段。本文將這三個概念區別如下:
定義1性能測試。為了獲取軟件處理事務的速度及確定系統性能的瓶頸而進行的測試:①為了檢驗性能是否符合需求;②為了得到某些性能數據供人們參考[1,2]。
定義2負載測試。性能測試的一個階段,是為了確定在各種級別負載系統的性能而進行的測試。目標是測試當負載逐漸增加時,系統組成部分的相應輸出項,如事務處理成功率、事務處理速度、響應時間、CPU 負載、內存使用等來決定系統的性能[1,2]。
定義3壓力測試。性能測試的一個階段,是為了確定一個系統的瓶頸或者所能承受的極限性能點而進行的測試,從而獲得系統能提供的最大服務級別的測試[5]。
一般來說先進行系統的負載測試,然后確認出各種極限參數后,在此基礎上進行壓力測試。
1.2Web性能測試的目標
Web性能測試的目標是什么?它不僅是用測試工具去運行一些測試腳本來證明產品是否可以達到性能指標,更關鍵是要發現產品性能上的缺陷,并解決定位問題,這才是軟件性能測試的真正目的。其目標可分為以下兩種級別:(1)性能測試總體目標。找出Web應用系統可能存在的性能瓶頸或者軟件缺陷,確認其是否可以達到用戶的使用需求。收集測試結果并分析產生缺陷原因,提交總結報告,讓軟件開發方對Web應用進行性能改進。
(2)性能測試具體目標。此目標又可以分為:
①確定Web應用系統的總體性能參數,包括所支持的最大并發用戶數、事務處理成功率、請求相應的往返延遲等,如表1所示;②確定在各個級別的負載及壓力測試下服務器輸出的具體性能參數,如表2所示。
這些測試目標驅動了整個測試過程的進行,因而在Web性能測試中起著至為關鍵的核心作用,因此在軟件性能測試之前一定要有一份《軟件性能測試需求規格說明書》,用于定義詳細的測試目標,并在表1、表2的空格中輸入預期的性能指標,這是檢查軟件性能是否符合要求的基本依據。
表1Web性能測試總體指標
表2Web性能測試基本輸出參數
1.3基于目標的Web性能測試
1.3.1負載測試方法
負載測試是性能測試中的第一階段,也是任何Web 應用開發周期中的一個重要步驟。在構造一個為大量用戶服務的Web應用,搞清楚最終軟件產品所能夠承受多大的負載是非常重要的。此外,負載測試還能夠暴露出最終會導致服務器崩潰的內存漏洞以及硬件資源的占用情況,通過對測試結果的分析從而決定是否要添置硬件資源和是否要對軟件進行整體架構上的變更[3,6]。
負載測試的基本策略就是通過負載測試工具進行腳本的自動錄制和回放。因為在實際的測試過程中,要按照實際投入運行的情況,組織成千上萬的用戶來進行負載測試,無論從哪個方面來看,都是不現實的。一旦發現了問題,不僅需要重復地進行這種耗費巨大的測試,而且問題不容易重現,不能方便地找出性能的瓶頸所在[2]。而使用軟件進行自動測試工具就不會存在這種情況。
我們提出一種基于目標的測試方法,其核心思想就是使負載測試的所有執行活動均圍繞測試一開始時制定的目標有針對性地進行測試,以減少冗余的測試和無價值的測試。這種方法的基本步驟如下:
(1)確定負載測試目標。在1.2節中已經提到過性能測試目標的確定,在此需要強調的是:一個Web應用的業務邏輯可能有成百上千種。對每一種業務邏輯進行測試是不現實的也是沒有必要的。因此在制定性能測試的目標時一定要選取Web應用的核心業務操作,并給出其預期需要達到的指標。事實上,無論Web應用怎么千變萬化,其基本的業務邏輯無外乎如表3所給出的種類。
表3Web應用的基本業務邏輯
(2)使用負載測試工具錄制測試腳本,并編寫測試用例。
①對于絕大部分Web應用來說,負載測試的快速、有效進行還是要求諸于負載測試工具,手工腳本在有些Web應用中是有用的,如郵件系統的性能測試,但是同樣需要自動腳本的輔助。
②目前常用的負載測試工具有:LoadRunner,Pureload,Webload,QAload等;
③測試用例的編寫可以1.2節中定義出的測試目標為基本劃分,每個測試目標編寫一份測試用例。腳本可以作為測試用例的一部分附在每份用例后面,這樣使得測試更具條理性、針對性和有序性。
(3)執行測試用例,同時使用工具記錄在腳本執行過程中Web應用服務器輸出的各項參數:
①通過在一臺或幾臺機器上運行測試腳本,給Web應用服務器加載各個級別的負載,模擬成百上千的虛擬用戶同時向Web服務器發送業務請求。同時記錄表1、表2中所列出的各項性能參數。
②一定要使用如Sniffer等網絡監測工具來記錄Web服務器輸出的各項性能參數,很難想象使用秒表記錄輸出參數會具備任何實際參考價值。
③負載的加載應該遵循預熱、加壓、維持、下降這樣一個循序漸進而又逐步下降的階段性過程,盡量模擬用戶的實際使用情況,使得測出的系統輸出參數更能真實反映Web應用的實際性能。
(4)在測試的執行過程中,若發生系統的異常,即系統崩潰、內存溢出、事務請求無響應和大量鏈接失效等,則創建軟件問題報告,進行軟件性能缺陷跟蹤。
(5)總結測試結果并分析Web應用的性能。
對性能測試輸出參數進行統計分析和數據挖掘,將發現的問題和錯誤進行分類。從定性和定量兩個方面獲取對Web應用性能的深刻認識,如數據分布是否合適、負載是否平衡、是否因為數據庫連接池設置的限制導致Web應用的最大并發用戶數上不去、缺陷的產生是否與編程人員的水平和習慣有關、測試過程中是否存在CPU、內存等資源未被釋放造成性能越來越低等,以確定系統的穩定性和優化性能。
1.3.2壓力測試方法
壓力測試是性能測試的第二階段。目標是通過確定一個系統的瓶頸或不能接收的性能點,來獲得系統能提供的最大服務級別。了解Web應用的這些極限狀態是很有價值的,如Web應用系統所支持的最大并發用戶,在最大并發用戶訪問的情況下系統能夠穩定運行的時間等。此外,在Web應用系統中,壓力測試是一個必經階段,只有經過壓力測試,達到理想效果,才能經受得起未來正式運行中大量業務、數據處理的考驗,如果達不到業務需求的處理能力,必須對系統改進、完善[5]。
壓力測試可以被看作是一種極限情況下的負載測試,因此壓力測試的進行可以基本上遵循1.3.1節中闡述的方法。但是壓力測試又有自己的特性,因而它的測試方法與負載測試稍稍不同。壓力測試與負載測試不同之處在于兩點。
(1)關注的重點不同:
①負載測試關注的是在各個級別的用戶請求下系統的運行情況及輸出參數,其目的是為了模擬用戶的實際使用情況,通過系統輸出的參數來觀察和分析Web應用的實際性能。它強調的是確認系統滿足了用戶正常使用的需求。
②壓力測試則是一種破壞性測試,給Web應用加載遠遠超過用戶實際使用情況的負載。觀察系統在此情況下的反應。它強調的是系統在遠遠超過用戶正常使用需求下,系統是否會出現崩潰、內存溢出。
(2)負載測試通常只是加載單一類型的壓力(如用戶數、頁面請求等),而壓力測試則是綜合的、全面的。其來源基本上可以分為
:①時間的壓力,如向Web應用持續發送請求一個月;
②容量的壓力,如并發用戶的數目、每個用戶發出請求的數目;
③時間與容量相結合使用造成的綜合壓力,如1 000個并發用戶在一秒鐘內同時投遞大量的業務請求。
壓力測試與負載測試的這些不同,使得它的測試方法除了1.3.1節所述外還應注意以下兩點:
(1)預先估算壓力測試強度為
①在確定測試目標之前應先估算Web應用核心業務的壓力范圍,并以此為根據確定測試用例。
②對最大并發用戶的壓力規模估算應該采用發展的眼光,如某Web郵件系統有3 000用戶(根據經驗數值其最大并發用戶在30人左右)。目前企業正在擴大規模,兩年后可能有用戶20 000(根據經驗數值其最大并發用戶在200人左右),那么在進行壓力測試時應該給其加載其最大并發用戶數應該是200個而不是30個。
③核心業務的壓力強度的估算一般采用80-20原則,如每個工作日中80%的業務在20%的時間內完成,亦即每天80%的業務在1.6小時內完成。
④壓力測試的總體強度計算方法為Stress=MaxUser×TotalRequest×80%/(TotalTime×20%)。
(2)進行多用例、多場景的綜合測試為
①在幾臺測試機上分別運行幾個測試腳本,每個腳本模擬若干個并發用戶向Web服務器請求一種核心業務操作。
②循環執行測試腳本,每過一段時間記錄Web服務器的性能輸出參數,并最后記錄發出的事務請求總數和成功完成的交易總數。
③測試時間長則1~2星期,甚至一個月,短則至少也要持續運行腳本48小時。
1.4測試的實施及測試過程管理
高效而有序的軟件測試過程管理是軟件測試項目實施成功的重要保障,Web性能測試同樣也不例外。那么如何有效地實施Web性能測試并對測試過程進行跟蹤和有效控制呢?首先取決于人,人是最有價值和最重要的資源,沒有一個積極的、團隊合作的、高效的測試小組,測試工作就不可能圓滿實現[6]。其次依賴于項目管理人員對整個測試流程的有效組織和控制,這就需要項目管理人員需要廣泛的技術經驗、高度的責任感、極大的耐心和洞察力等。最后需要一個功能齊全、簡單易用的測試過程管理工具。
Web性能測試的一般流程如圖1所示。一個成功的Web性能測試項目管理人員應該很好地完成以下職責:
(1)監督整個測試流程如期完成,檢查項目成員測試任務按時完成;
(2)與Web應用開發方及委托測試單位進行協調和溝通;
(3)撰寫測試相關文檔。
此外,測試過程管理工具的有效使用也對整個項目的成功至關重要,很難想象使用紙張或Excel,Word文檔來管理整個性能測試過程能夠有效保證此性能測試的質量。就測試管理工具而言,目前有北京航空航天軟件工程研究所的QESuite和Mercury Interactive公司的 TestDirector等。
圖1Web性能測試的基本流程
2Web性能測試方法的具體應用
下面以某電子郵件系統的性能測試為例來簡要說明基于目標的Web性能測試方法的具體應用。
(1)確定性能測試目標:
①總體目標。驗證和確認此郵件系統的性能(收發郵件成功率、平均往返延遲、最大并發用戶等)能夠滿足當前3 000用戶規模的使用需求,并判斷其能否滿足未來20 000用戶規模的使用需求。對測試結果進行收集并總結,分析系統的性能瓶頸并給出原因。
②具體性能測試目標如表4和表5所示。
表4某郵件系統性能測試總體指標
圖2某郵件系統測試環境配置圖
(2)測試方法:
①使用開源的性能測試工具Postal,并輔以手工編寫的Perl測試腳本;
②在內網和外網各自搭建郵件服務器,其測試環境配置如圖2所示;
③壓力測試使用三臺測試機,每臺測試機模擬50個并發用戶,每個用戶發送40封100KB的郵件。每20分鐘循環執行一次測試腳本,持續此測試場景48小時。
(3)性能測試結果:
①系統所支持的最大并發用戶為25個,主郵件服務器CPU最大占用率100%,平均占用率74.6%,內存占用率平均51%;實際郵件發送總數為219 610封;實際收到郵件217 564封,收發郵件成功率為99.07%;在測試的48小時內系統運行穩定;
②性能測試結論;
③此郵件系統的系統性能能夠較好的滿足當前規模用戶(3 000個)的使用要求;
④若要支持規模未來20 000的用戶使用要求,尚需進行軟件系統的改進和硬件資源的添置。
3結束語
Web應用的多樣性決定了Web性能測試方法的多樣性,但無論其表現,所有的測試活動都一定有其目的性,也只有讓性能測試圍繞其目標展開才能使投入的測試資源產生最大的效益。本文圍繞所提出的基于目標的性能測試而展開,同時強調了測試管理的作用,并給出了一個郵件系統測試的實例。本文提出的性能測試方法已經在許多項目實踐中得到了良好的應用,但Web性能測試模型的總結和深入研究還有待進一步進行,這也是我們下一步的主要工作計劃。
參考文獻:
[1]Alberto Avritzer, Elaine J Weyuker.The Role of Modeling in the Performance Testing of Ecommerce Applications[J]. IEEE Transactions on Software Engineering, 20-04,30(12):10721083.
[2]Subraya B M, Subrahmanya S V. Object Driven Performance Testing of Web Applications[C]. Quality Software. Proceedings of the 1st AsiaPacific Conference, 2000.1726.
[3]中國軟件評測中心測試中心,性能:軟件測試的重中之重[J].中國計算機用戶,2003,31:4243.
[4]林銳.軟件測試—掌握有效測試軟件的方法與技術[EB/OL].www.8848software.com/scmchina/doc/softtest.ppt,200211.
[5]葉新銘, 馮曉利. 軟件壓力測試流程[J]. 內蒙古大學學報(自然科學版), 2002,33(1):107108.
[6]高國柱,李紅. 銀行計算機綜合業務系統性能測試與分析[J].系統設計技術,2002,(7):6364.
作者簡介:
赫建營(1980),男,博士研究生,主要研究方向為軟件測試技術、軟件工程和知識管理;晏海華(1964),男,副教授,主要研究方向為軟件工程、軟件測試技術和面向對象技術;劉超(1958),男,教授,主要研究方向為軟件工程、軟件測試技術和面向對象技術; 金茂忠(1941),男,教授,博導,主要研究方向為軟件工程和編譯技術。
注:本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文