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