韋亞軍,張文文
(南京國圖信息產(chǎn)業(yè)有限公司,南京 210000)
近年來,隨著計(jì)算機(jī)網(wǎng)絡(luò)化應(yīng)用的進(jìn)一步普及,大數(shù)據(jù)、云計(jì)算、區(qū)塊鏈等技術(shù)快速發(fā)展和應(yīng)用,軟件環(huán)境變得極其復(fù)雜,通常由網(wǎng)絡(luò)、數(shù)據(jù)庫、負(fù)載均衡器、應(yīng)用服務(wù)(中間件)、硬件等多個(gè)部分組成,任何一部分都有可能成為整個(gè)應(yīng)用軟件的性能瓶頸,從而導(dǎo)致軟件整體性能低下。同時(shí),軟件業(yè)務(wù)復(fù)雜度日益提升、用戶量急劇增加、操作行為多樣化使得保證軟件性能的過程變得極為困難,而如何對(duì)軟件性能進(jìn)行測試和驗(yàn)證,一直以來都缺少標(biāo)準(zhǔn)化的流程和方法[1-3]。
針對(duì)這一現(xiàn)狀,本文借助常用的性能測試工具LoadRunner,提出一種基于LoadRunner的軟件性能測試標(biāo)準(zhǔn)化流程,并對(duì)其中關(guān)鍵技術(shù)分析研究,以對(duì)軟件性能測試過程和方法給出指導(dǎo)。同時(shí),結(jié)合淮安市“互聯(lián)網(wǎng)+不動(dòng)產(chǎn)登記”一體化平臺(tái)項(xiàng)目對(duì)流程進(jìn)行應(yīng)用和驗(yàn)證,結(jié)果表明,該流程有效地剔除測試過程中的冗余步驟,提高測試效率,不僅滿足大部分企業(yè)級(jí)軟件的性能測試和驗(yàn)證,還可以指導(dǎo)測試人員快速準(zhǔn)確地定位軟件的性能瓶頸,分析存在的問題。
軟件性能測試是質(zhì)量保證過程必不可少的環(huán)節(jié),是驗(yàn)證軟件是否滿足用戶期望的性能需求,發(fā)現(xiàn)軟件可能存在的性能瓶頸,分析性能問題,并提供性能優(yōu)化方案的過程。在實(shí)際測試過程中,可以根據(jù)具體的性能需求和應(yīng)用領(lǐng)域采取不同的測試方法,完成對(duì)軟件的性能需求和應(yīng)用領(lǐng)域驗(yàn)證。常用的性能測試方法主要包括以下幾種[4-8]:
1)驗(yàn)收性能測試:模擬實(shí)際業(yè)務(wù)量和使用場景,測試軟件性能是否滿足實(shí)際生產(chǎn)的性能要求,即在特定運(yùn)行條件下驗(yàn)證軟件的能力狀況,是最常見的一種性能測試方法。
2)負(fù)載測試:在一定的軟硬件環(huán)境下,利用增加虛擬用戶數(shù)實(shí)現(xiàn)對(duì)被測軟件增加負(fù)載,直到規(guī)定的性能指標(biāo)或各項(xiàng)資源利用率超過預(yù)期目標(biāo)。該方法可以找到軟件的最大承載能力,了解系統(tǒng)的性能容量。
3)壓力測試:在服務(wù)器CPU、內(nèi)存處于飽和狀態(tài)下,測試軟件處理會(huì)話的能力、是否會(huì)出錯(cuò)等。一般通過模擬負(fù)載實(shí)現(xiàn)服務(wù)器資源達(dá)到較高水平,測試軟件的穩(wěn)定性。
4)配置測試:通過不斷對(duì)軟硬件的各項(xiàng)配置參數(shù)進(jìn)行調(diào)整、測試、驗(yàn)證,掌握軟件在不同環(huán)境中的運(yùn)行效率,從而獲得最優(yōu)的參數(shù)配置。可以用于探索軟件最大的性能潛力。
5)并發(fā)測試:測試較多用戶對(duì)軟件的同一個(gè)功能、同一個(gè)接口請(qǐng)求進(jìn)行訪問時(shí),軟件是否能正確響應(yīng)。主要驗(yàn)證軟件是否存在內(nèi)存泄露、線程鎖或資源競爭等情況。
6)可靠性測試:檢驗(yàn)軟件在一定的負(fù)載壓力下,是否可以持續(xù)、穩(wěn)定的運(yùn)行。測試時(shí)間2~3天,測試過程需隨時(shí)關(guān)注軟件各項(xiàng)性能指標(biāo)、資源使用情況是否滿足要求。
7)失效恢復(fù)測試:主要針對(duì)采用了負(fù)載均衡、集群部署、分布式軟件設(shè)計(jì),當(dāng)其中一臺(tái)或者多臺(tái)服務(wù)發(fā)生故障時(shí),軟件是否能正常被使用,且各項(xiàng)性能指標(biāo)是否都滿足要求。
LoadRunner是一款廣泛應(yīng)用于企業(yè)級(jí)軟件的性能測試工具,擁有良好的操作界面,可以通過模擬多虛擬用戶對(duì)軟件產(chǎn)生負(fù)載壓力。同時(shí),還可以與開發(fā)工具進(jìn)行持續(xù)集成,實(shí)時(shí)監(jiān)控軟件性能測試過程中各項(xiàng)指標(biāo)的運(yùn)行情況,支持廣泛的協(xié)議和編程技術(shù),適用于多種體系架構(gòu)的軟件性能測試[9-11]。LoadRunner主要包括用戶腳本生成器、控制器和分析器三大組件[12],其工作原理如圖1所示。
1)用戶腳本生成器(Vugen,virtual user generator),用于捕捉用戶業(yè)務(wù)操作流并生成腳本。腳本記錄了用戶的操作,同時(shí)包含一系列用來監(jiān)測軟件性能的函數(shù),用戶可以對(duì)生成的腳本進(jìn)行修改完善,來滿足實(shí)際性能測試工作的要求。
2)控制器(Controller),是整個(gè)軟件性能測試的控制中心,用來構(gòu)造和維護(hù)性能測試場景,管理協(xié)調(diào)虛擬用戶在系統(tǒng)上的操作行為。同時(shí),通過控制器將任務(wù)分派給負(fù)載生成器,并收集Vuser、服務(wù)器、軟件各項(xiàng)性能指標(biāo)數(shù)據(jù)。
3)分析器(Analysis),將控制器收集的各項(xiàng)性能指標(biāo)數(shù)據(jù)以圖表的形式進(jìn)行展示并生成測試報(bào)告,供測試人員分析和性能調(diào)優(yōu)。
圖1 LoadRunner工作原理
基于LoadRunner的軟件性能測試流程結(jié)合大部分軟件應(yīng)用現(xiàn)狀,將測試流程分為規(guī)劃測試工程、設(shè)計(jì)測試工程和測試結(jié)果分析3個(gè)階段,每個(gè)階段細(xì)分多個(gè)工作流程。實(shí)現(xiàn)將復(fù)雜的測試過程簡單化、流程化,降低測試難度,提高測試效率,為軟件的性能測試過程和方法提供指導(dǎo)?;贚oadRunner的軟件性能測試流程如圖2所示。
圖2 基于LoadRunner的軟件性能測試流程
軟件性能測試通常是利用工具模擬大量用戶操作來驗(yàn)證軟件能夠承受的負(fù)載情況,找出潛在的性能問題,并對(duì)問題進(jìn)行分析、解決,是一項(xiàng)復(fù)雜度高、綜合性強(qiáng)的工作,可以將其定義為一項(xiàng)測試工程,在開始階段需對(duì)工程進(jìn)行規(guī)劃,主要包括收集并分析性能需求、構(gòu)建性能模型和制定測試計(jì)劃。
3.1.1 需求收集與分析
需求收集與分析主要是了解被測軟件的系統(tǒng)架構(gòu)、業(yè)務(wù)流程、用戶特征,以及軟件的運(yùn)行環(huán)境,確定軟件性能測試的目的和范圍,分析哪些業(yè)務(wù)納入性能測試范圍以及用戶期望的性能指標(biāo)或測試終止標(biāo)準(zhǔn),形成需求收集表。同時(shí),還需要分析用戶使用行為、業(yè)務(wù)分布、業(yè)務(wù)量統(tǒng)計(jì),并根據(jù)分析結(jié)果估算出TPS和并發(fā)用戶數(shù)等指標(biāo)。
以淮安市“互聯(lián)網(wǎng)+不動(dòng)產(chǎn)登記”一體化平臺(tái)項(xiàng)目為例,該平臺(tái)主要是面向全市450余萬用戶提供不動(dòng)產(chǎn)登記業(yè)務(wù)線上辦理服務(wù)。業(yè)務(wù)需求收集示例表格對(duì)部分業(yè)務(wù)量、未來業(yè)務(wù)量、響應(yīng)時(shí)間、事務(wù)通過率等進(jìn)行了收集,如表1所示。
表1 業(yè)務(wù)需求收集示例
3.1.2 模型構(gòu)建和制定測試計(jì)劃
在軟件性能測試過程中,構(gòu)建性能模型類似編寫測試用例,主要是根據(jù)收集的性能需求和應(yīng)用軟件的相關(guān)信息完成模型的構(gòu)建,指導(dǎo)性能測試的實(shí)現(xiàn)和測試結(jié)果的輸出。軟件性能模型構(gòu)建主要包括業(yè)務(wù)模型和測試模型[13-20]。
1)業(yè)務(wù)模型(BM,business model),指經(jīng)過性能需求分析后,明確軟件的各個(gè)業(yè)務(wù)流程、業(yè)務(wù)相關(guān)功能在某個(gè)時(shí)間段內(nèi)運(yùn)行的業(yè)務(wù)種類及其業(yè)務(wù)占比,即哪些業(yè)務(wù)在哪個(gè)時(shí)間段運(yùn)行、運(yùn)行多久、業(yè)務(wù)量多少、并發(fā)用戶多少等。業(yè)務(wù)模型是構(gòu)建測試模型的重要基礎(chǔ),是性能測試關(guān)注的重點(diǎn)。
2)測試模型(TM,test model),從業(yè)務(wù)模型中分析和整理出來需要進(jìn)行性能測試的業(yè)務(wù),通常都是高頻業(yè)務(wù)、高資源占用的業(yè)務(wù),這些業(yè)務(wù)需要具有可測性、可驗(yàn)證性。測試模型作為性能測試場景設(shè)計(jì)的依據(jù),通常會(huì)繼承業(yè)務(wù)模型的大多數(shù)業(yè)務(wù)功能,針對(duì)因特殊原因無法進(jìn)行性能測試的(如第三方非開源加密程序,測試程序無法模擬),測試模型中會(huì)去掉這部分業(yè)務(wù),或者設(shè)計(jì)替代的等價(jià)方案。以淮安市“互聯(lián)網(wǎng)+不動(dòng)產(chǎn)登記”一體化平臺(tái)項(xiàng)目為例,部分測試模型如圖3所示。
圖3 測試模型示例
制定測試計(jì)劃的主要目的是用來規(guī)劃軟件性能測試工作,保證測試工作高效順利的進(jìn)行,同時(shí)防范和抵御可能出現(xiàn)的各類風(fēng)險(xiǎn),是正式開展性能測試工作的前提。測試計(jì)劃主要包括系統(tǒng)概述、測試環(huán)境、測試策略、測試場景、進(jìn)度計(jì)劃等內(nèi)容。同時(shí)還需明確人員安排、系統(tǒng)風(fēng)險(xiǎn),對(duì)測試過程中可能涉及的風(fēng)險(xiǎn)加以評(píng)估,確定風(fēng)險(xiǎn)的應(yīng)對(duì)策略,如人員風(fēng)險(xiǎn)可以通過加強(qiáng)人力儲(chǔ)備、采用AB角色、明確各自職責(zé)等來完成。
設(shè)計(jì)性能測試工程主要是利用LoadRunner組件完成測試腳本開發(fā)、數(shù)據(jù)準(zhǔn)備、場景設(shè)計(jì)、執(zhí)行與監(jiān)控等工作,是基于LoadRunner的軟件性能測試流程的重要環(huán)節(jié)。該階段的目標(biāo)是對(duì)測試工程的進(jìn)一步實(shí)現(xiàn)和深化,同時(shí)輸出軟件各項(xiàng)指標(biāo)記錄和報(bào)告,為后續(xù)性能調(diào)優(yōu)提供數(shù)據(jù)基礎(chǔ)。
3.2.1 腳本開發(fā)與調(diào)試
LoadRunner提供了用戶腳本生成器(Vugen)組件,支持Web(HTTP/HTML)、Flex、SAPGUI等多種主流協(xié)議和JAVA、C語言、VB等多種編程語言進(jìn)行測試腳本開發(fā),可以根據(jù)系統(tǒng)架構(gòu)設(shè)計(jì)選擇對(duì)應(yīng)的協(xié)議,參考構(gòu)建的性能模型完成腳本開發(fā)。開發(fā)完成后,需對(duì)腳本進(jìn)行回放、調(diào)試,同時(shí)還可以添加集合點(diǎn)、參數(shù)化使腳本更加接近真實(shí)用戶操作,也可以插入事務(wù)和檢查點(diǎn)來判斷腳本在執(zhí)行過程中系統(tǒng)是否能正確響應(yīng)。
以用戶登入業(yè)務(wù)腳本為例,在腳本上方插入集合點(diǎn)lr_rendezvous(“l(fā)ogin”),可以實(shí)現(xiàn)不同虛擬用戶在同一時(shí)間點(diǎn)執(zhí)行登入操作,實(shí)現(xiàn)真正意義上的并發(fā)。在腳本上方添加開始事務(wù)lr_start_transaction(“PC_login”),在操作結(jié)尾添加結(jié)束事務(wù)和檢查點(diǎn),根據(jù)響應(yīng)碼判斷事務(wù)成功或失敗,通過該操作可以輸出在指定壓力測試下登入操作的成功率、平均響應(yīng)時(shí)間等性能指標(biāo)。
lr_rendezvous("login");
lr_start_transaction("PC_login");
web_reg_save_param("access_token","LB="access_token":"","RB=",",LAST);
web_custom_request("newLogin",
"URL=http://localhost/estateplat-register/v2/loginModel/newLogin",
"Method=POST",
"Resource=0",
"RecContentType=application/json",
"Referer=http://localhost/estateplat-register/page/v2.1/login.html",
"Snapshot=t2.inf",
"Mode=HTML",
"EncType=application/json;charset=UTF-8",
"Body={"head":{"origin":"2","sign":"
""data":{"lxDh":"
LAST);
web_reg_find("Search=Body","SaveCount=pass_login","Text=個(gè)人中心",LAST);
web_url("new_user_index_個(gè)人中心",
"URL=http://localhost/estateplat-register/page/v2.1/new_user_index",
"Resource=0",
"RecContentType=text/html",
"Referer=http://localhost/estateplat-register/page/v2.1/login",
"Snapshot=t9.inf",
"Mode=HTML",
if(web_get_int_property(HTTP_INFO_RETURN_CODE) 200){
lr_end_transaction("PC_login",LR_PASS);
}
else{
lr_end_transaction("PC_login",LR_FAIL);
}
3.2.2 數(shù)據(jù)準(zhǔn)備
如何生成滿足軟件性能測試需要的大批量測試數(shù)據(jù)非常重要,因?yàn)樵谲浖膶?shí)際使用過程中,用戶可能會(huì)輸入各種各樣的數(shù)據(jù)進(jìn)行操作,LoadRunner提供了多種數(shù)據(jù)生成方法,主要包括如下幾種:
1)數(shù)據(jù)生成池技術(shù)。在LoadRunner參數(shù)列表中,提供了多種數(shù)據(jù)類型生成技術(shù),包括日期型、隨機(jī)數(shù)等,在測試腳本中插入定義的參數(shù)名或函數(shù),并設(shè)置參數(shù)循環(huán)方式,在腳本回放時(shí)就可以自動(dòng)從數(shù)據(jù)池取出數(shù)據(jù),完成大批量數(shù)據(jù)測試工作[21-25]。
2)自定義數(shù)據(jù)文件。用戶可以將自己定義的數(shù)據(jù)文件(*.dat格式)保存在腳本文件夾下,并對(duì)其進(jìn)行參數(shù)化,添加到腳本中。在腳本回放時(shí)就可以通過參數(shù)化讀取用戶自定義數(shù)據(jù)文件中的測試數(shù)據(jù)。
3)執(zhí)行SQL腳本文件。通過LoadRunner提供的數(shù)據(jù)庫向?qū)Чδ埽帉?、?zhí)行SQL語句從指定的數(shù)據(jù)庫中批量選擇出滿足要求的測試數(shù)據(jù)并存儲(chǔ)在本地*.dat文件中,該方法是一種比較高效的測試數(shù)據(jù)批量生成方法。
在本文項(xiàng)目中,采用第三種方法生成測試數(shù)據(jù),即通過執(zhí)行SQL語句,從數(shù)據(jù)庫中獲取足夠多的且符合要求的測試數(shù)據(jù),并保存至本地*.dat文件,為測試過程做數(shù)據(jù)準(zhǔn)備。當(dāng)數(shù)據(jù)庫中的數(shù)據(jù)量不足以滿足性能測試要求時(shí),可以通過執(zhí)行自動(dòng)化腳本或編寫插入數(shù)據(jù)SQL等方式批量添加數(shù)據(jù),當(dāng)性能測試結(jié)束后,需對(duì)本輪測試所產(chǎn)生的數(shù)據(jù)進(jìn)行清洗或重新恢復(fù)數(shù)據(jù)庫。
3.2.3 場景設(shè)計(jì)與實(shí)現(xiàn)
性能測試場景設(shè)計(jì)與實(shí)現(xiàn)是根據(jù)已構(gòu)建的軟件性能模型設(shè)計(jì)出相應(yīng)的測試場景,并利用LoadRunner控制器(Controller)組件,完成測試場景的實(shí)現(xiàn)。
1)場景設(shè)計(jì):在構(gòu)建軟件性能模型時(shí)已經(jīng)確定了需要測試的業(yè)務(wù)種類,場景設(shè)計(jì)則是結(jié)合虛擬用戶,將這些業(yè)務(wù)種類組合到一個(gè)測試單元。以淮安市“互聯(lián)網(wǎng)+不動(dòng)產(chǎn)登記”一體化平臺(tái)項(xiàng)目為例,根據(jù)收集的需求和構(gòu)建的性能模型,設(shè)計(jì)出部分業(yè)務(wù)場景示例,如表2所示。
表2 場景設(shè)計(jì)示例
Sec_01基準(zhǔn)測試:主要是用來驗(yàn)證測試環(huán)境、測試腳本的正確性、得到軟件的性能基準(zhǔn),為后續(xù)的測試執(zhí)行提供參考依據(jù)?;鶞?zhǔn)測試采用單業(yè)務(wù)場景、單用戶方式來執(zhí)行,執(zhí)行時(shí)長根據(jù)響應(yīng)時(shí)間來調(diào)整,測試結(jié)果采樣樣本盡量大。如響應(yīng)時(shí)間為1 s,1 000個(gè)事務(wù)就需要運(yùn)行1 000 s以上;響應(yīng)時(shí)間200 ms,運(yùn)行600 s就可以完成3 000個(gè)事務(wù)的采樣。
Sec_02配置測試:幫助分析軟件相關(guān)性能配置,確保軟件配置適合于當(dāng)前性能需求,一般為綜合場景(多個(gè)業(yè)務(wù)同時(shí)執(zhí)行)。測試過程是一個(gè)反復(fù)實(shí)驗(yàn)的過程,先找出不合理的配置,然后進(jìn)行修改、驗(yàn)證,直到配置滿足要求為止。
Sec_03負(fù)載測試:負(fù)載測試的目的是找出軟件的性能問題,并對(duì)軟件進(jìn)行定容定量,分析軟件性能變化趨勢,為軟件優(yōu)化、性能調(diào)優(yōu)提供數(shù)據(jù)支撐。負(fù)載測試分為單場景和綜合場景,單場景可以排除其他業(yè)務(wù)場景的干擾,有利于分析性能問題;綜合場景更接近用戶實(shí)際使用情況,可以對(duì)軟件進(jìn)行綜合的性能評(píng)估。
2)場景實(shí)現(xiàn):性能測試場景設(shè)計(jì)完成后,就可以利用Controller組件來實(shí)現(xiàn)具體場景。Controller支持手動(dòng)場景(manual scenario)和面向目標(biāo)的場景(goal-oriented scenario)兩種類型,手動(dòng)場景是指完全由用戶設(shè)置每個(gè)腳本的虛擬用戶、運(yùn)行時(shí)間等信息;面向目標(biāo)的場景則是用戶提前設(shè)定好性能測試要達(dá)到的目標(biāo)和虛擬用戶的增長模式,場景運(yùn)行后,直到達(dá)到用戶設(shè)定的目標(biāo)后停止。
以Sec_02配置測試為例,選擇手動(dòng)場景,在Controller中添加測試腳本,設(shè)置每個(gè)腳本的虛擬用戶數(shù)量和行為方式,完成配置測試場景的實(shí)現(xiàn)。如圖4所示。
圖4 配置測試場景示例
3.2.4 執(zhí)行與監(jiān)控
場景設(shè)計(jì)與實(shí)現(xiàn)完成后,就可以在Controller中運(yùn)行場景,對(duì)軟件進(jìn)行性能測試,同時(shí),實(shí)時(shí)監(jiān)控場景運(yùn)行情況、獲取虛擬用戶的運(yùn)行狀態(tài)、收集測試結(jié)果。測試結(jié)果不僅包括平均事務(wù)響應(yīng)時(shí)間、事務(wù)通過率、吞吐量等軟件性能指標(biāo),還包括數(shù)據(jù)庫性能狀態(tài)、JVM使用情況及服務(wù)器硬件性能指標(biāo),如CPU使用率、內(nèi)存利用率、磁盤空間等,如表3所示。
表3 性能監(jiān)控項(xiàng)目
結(jié)果分析是測試流程中的一個(gè)重要組成部分。場景運(yùn)行結(jié)束后,Analysis組件會(huì)自動(dòng)加載運(yùn)行數(shù)據(jù)并生成各類圖表信息,包括虛擬用戶運(yùn)行狀態(tài)、吞吐量、響應(yīng)時(shí)間及硬件資源等。同時(shí),還提供了圖表合并、分解、關(guān)聯(lián)等功能,可以將多個(gè)性能指標(biāo)數(shù)據(jù)關(guān)聯(lián)后進(jìn)行綜合分析,并確定測試結(jié)果是否滿足性能目標(biāo)要求、是否需要進(jìn)行性能調(diào)優(yōu)等。
3.3.1 分析測試結(jié)果
性能測試結(jié)果分析是一項(xiàng)復(fù)雜度高且難度大的工作,需結(jié)合軟硬件環(huán)境、測試報(bào)告進(jìn)行綜合分析,對(duì)測試人員綜合能力要求較高,其分析步驟主要包括如下:
1)首先查看性能測試整體運(yùn)行狀況,收集運(yùn)行日志信息,檢查運(yùn)行過程中是否存在異常報(bào)錯(cuò),若存在,則需進(jìn)一步分析并確定引起異常報(bào)錯(cuò)的具體原因。
2)其次分析性能測試執(zhí)行結(jié)果,查看響應(yīng)時(shí)間、吞吐量、事務(wù)通過率、資源利用率等指標(biāo)是否滿足性能要求,如圖5所顯示的是部分業(yè)務(wù)響應(yīng)時(shí)間結(jié)果圖。若不滿足要求,則首先需對(duì)硬件環(huán)境進(jìn)行排查,分析是否是硬件問題引起的性能瓶頸,硬件問題排除后,則需要對(duì)被測軟件本身進(jìn)行分析,確定引起性能問題的具體原因。
圖5 平均事務(wù)響應(yīng)時(shí)間
3.3.2 性能調(diào)優(yōu)
針對(duì)不滿足性能需求的指標(biāo),需結(jié)合硬件、數(shù)據(jù)庫及被測軟件綜合分析存在的問題,提出解決方案,并進(jìn)行性能調(diào)優(yōu)。通常性能調(diào)優(yōu)的方法包括空間換時(shí)間、時(shí)間換空間、并行、異步處理等,其中異步處理是指當(dāng)業(yè)務(wù)鏈路上有任務(wù)耗時(shí)較長,可以拆分業(yè)務(wù),甚至使用異步的方式減少阻塞影響,也就是常說的解耦。當(dāng)性能調(diào)優(yōu)完成后,還需對(duì)測試腳本進(jìn)行更新,以滿足軟件調(diào)優(yōu)后的實(shí)際情況,同時(shí)對(duì)軟件進(jìn)行性能復(fù)測。
在軟件性能測試過程中,除了制定統(tǒng)一、標(biāo)準(zhǔn)化的測試流程外,還需對(duì)各個(gè)性能指標(biāo)的度量進(jìn)行統(tǒng)一,如并發(fā)用戶數(shù)、每秒事務(wù)數(shù)、吞吐量等。同時(shí),在工具的應(yīng)用過程中,為了使得測試結(jié)果更加準(zhǔn)確和有效,還應(yīng)結(jié)合被測軟件實(shí)際情況采用一些增強(qiáng)技術(shù),如腳本參數(shù)化、腳本關(guān)聯(lián)。
并發(fā)用戶是指在軟件中操作業(yè)務(wù),并對(duì)后臺(tái)服務(wù)器產(chǎn)生壓力的用戶,在性能測試工具中通常被稱為虛擬用戶(VU,virutal user)。并發(fā)用戶數(shù)是由軟件具體的業(yè)務(wù)場景來決定,因此,在計(jì)算并發(fā)用戶數(shù)前,需首先確定典型的業(yè)務(wù)場景、具體的性能需求、業(yè)務(wù)模型等,然后再根據(jù)并發(fā)用戶計(jì)算公式計(jì)算出每個(gè)業(yè)務(wù)場景的并發(fā)用戶數(shù)[26-30]。
(1)
(2)
示例:以淮安市“互聯(lián)網(wǎng)+不動(dòng)產(chǎn)登記”一體化平臺(tái)項(xiàng)目為例,該軟件注冊(cè)用戶數(shù)為80萬,每天有1.5萬用戶訪問軟件進(jìn)行各項(xiàng)操作,操作平均時(shí)間為0.5小時(shí),該軟件每天對(duì)外開放時(shí)間為12小時(shí)。則根據(jù)式(1)和式(2)可以得到:
吞吐量是指單位時(shí)間內(nèi)系統(tǒng)處理客戶請(qǐng)求的數(shù)量,直接體現(xiàn)軟件系統(tǒng)的性能承載能力。一般情況下,以不同計(jì)量單位來表達(dá)吞吐量的方式可以表明軟件受不同層次的制約。如以Bytes/Second和Pages/Second為單位表示的吞吐量主要是受網(wǎng)絡(luò)、服務(wù)器架構(gòu)的制約;以Requests/Second為單位表示的吞吐量則主要是受應(yīng)用服務(wù)器、軟件代碼邏輯的制約。
一般情況下,在軟件未遇到性能瓶頸時(shí),吞吐量與并發(fā)用戶數(shù)之間存在一定的關(guān)聯(lián)關(guān)系,如圖6(a)所示,可以采用式(3)計(jì)算吞吐量:
(3)
其中:Fv是指吞吐量,Vu是指并發(fā)用戶數(shù),R是指每個(gè)用戶的實(shí)際請(qǐng)求數(shù)量,T是指性能測試場景執(zhí)行的時(shí)長。如果軟件遇到性能瓶頸,如圖6(b)所示,吞吐量與并發(fā)用戶數(shù)之間就不再存在關(guān)聯(lián)關(guān)系,不能通過式(3)進(jìn)行計(jì)算。
圖6 吞吐量-運(yùn)行Vuser
參數(shù)化是軟件性能測試過程中最常用的技術(shù)之一。在腳本錄制時(shí),只是簡單記錄了一組固定從客戶端發(fā)送到服務(wù)端的數(shù)據(jù),這并不符合實(shí)際軟件操作情況,同時(shí)也不滿足軟件性能測試大數(shù)據(jù)量的要求,因此就必須將這部分?jǐn)?shù)據(jù)設(shè)為“參數(shù)”,并允許參數(shù)以某種方式和形式取值,在腳本運(yùn)行時(shí)就可以通過預(yù)先設(shè)定的規(guī)則獲取不同的值。
如圖7所示,以辦件進(jìn)度查詢業(yè)務(wù)為例。對(duì)腳本中slbh=2022012405262中的受理編號(hào)進(jìn)行參數(shù)化,修改為slbh={slbh},同時(shí)在數(shù)據(jù)池中添加多組不同的受理編號(hào)數(shù)據(jù),并按照一定規(guī)則賦值給slbh參數(shù)。當(dāng)腳本回放時(shí),slbh參數(shù)根據(jù)規(guī)則獲取不同的數(shù)據(jù)執(zhí)行腳本,實(shí)現(xiàn)進(jìn)度查詢業(yè)務(wù)的性能測試。
圖7 參數(shù)化示例
由于很多軟件架構(gòu)都采用SessionID、SeqID等方法來標(biāo)識(shí)不同的任務(wù)和數(shù)據(jù)包,軟件在每次運(yùn)行時(shí)發(fā)送的數(shù)據(jù)并不完全相同。在這種情況下,為了讓腳本能夠滿足測試的要求,就需要對(duì)腳本進(jìn)行關(guān)聯(lián)處理。
如圖8所示,以用戶登入業(yè)務(wù)為例。在腳本錄制時(shí),客戶端首先向服務(wù)端發(fā)送login請(qǐng)求,服務(wù)端驗(yàn)證口令正確后,返回一個(gè)以某種規(guī)則生成的SessionID,客戶端將sessionID=375825QW7作為URL的一部分提交服務(wù)端,服務(wù)端返回客戶端相應(yīng)的信息。在腳本回放時(shí),客戶端發(fā)送login請(qǐng)求后,服務(wù)端返回新的SessionID,而此時(shí)由于測試腳本中的SessionID是寫死的,客戶端會(huì)提交過期的SessionID,服務(wù)端驗(yàn)證失敗后,返回會(huì)話失敗。
圖8 關(guān)聯(lián)示例
LoadRunner提供了手動(dòng)和自動(dòng)兩種關(guān)聯(lián)操作方式,并支持了一系列相關(guān)函數(shù)實(shí)現(xiàn)關(guān)聯(lián)操作。結(jié)合上文,需要對(duì)腳本進(jìn)行關(guān)聯(lián)的條件是:客戶端需要獲取服務(wù)端返回的部分?jǐn)?shù)據(jù),并將這部分?jǐn)?shù)據(jù)作為下一次請(qǐng)求的一部分發(fā)出。一般操作步驟如下:
1)從服務(wù)端返回的數(shù)據(jù)中選取需要進(jìn)行關(guān)聯(lián)的數(shù)據(jù);
2)將該數(shù)據(jù)存入腳本的一個(gè)參數(shù)中;
3)將腳本中需要使用到該參數(shù)的地方用參數(shù)來替代。
依據(jù)該流程對(duì)淮安市“互聯(lián)網(wǎng)+不動(dòng)產(chǎn)登記”一體化平臺(tái)項(xiàng)目進(jìn)行性能測試。以負(fù)載測試場景為例,對(duì)用戶登入業(yè)務(wù)分別按照200、400、600并發(fā)用戶進(jìn)行負(fù)載測試,測試時(shí)間為30 min,部分測試結(jié)果如表4所示。
表4 負(fù)載測試用戶登入業(yè)務(wù)部分測試結(jié)果
測試結(jié)果分析顯示,針對(duì)該業(yè)務(wù),隨著并發(fā)用戶的逐步增加,平均響應(yīng)時(shí)間和事務(wù)通過率未發(fā)生明顯的變化,且均滿足目標(biāo)要求。同時(shí),系統(tǒng)吞吐量呈倍數(shù)遞增趨勢,表明系統(tǒng)在單位時(shí)間內(nèi)處理客戶請(qǐng)求的能力表現(xiàn)良好,且存在進(jìn)一步提升的空間。在該場景下,應(yīng)用服務(wù)器的CPU使用率、內(nèi)存利用率均在閾值范圍內(nèi),滿足用戶指標(biāo)要求,如圖9所示。
圖9 用戶登入資源監(jiān)控
在本項(xiàng)目中,利用該流程成功完成對(duì)淮安市“互聯(lián)網(wǎng)+不動(dòng)產(chǎn)登記”一體化平臺(tái)的性能測試工作,包括基準(zhǔn)性能測試、穩(wěn)定性測試、可靠性測試及失效恢復(fù)性測試四部分,并出具多份規(guī)范性測試報(bào)告。本次項(xiàng)目實(shí)際應(yīng)用的結(jié)果,不僅獲得用戶一致認(rèn)可,也進(jìn)一步確定了該流程方法的可行性和正確性。
本文結(jié)合目前軟件性能測試現(xiàn)狀,借助常用的軟件性能測試工具LoadRunner,提出了一種標(biāo)準(zhǔn)化的軟件性能測試流程。該流程將測試過程分為規(guī)劃測試工程、設(shè)計(jì)測試工程和結(jié)果分析3個(gè)階段,每個(gè)階段對(duì)應(yīng)不同的工作模塊,如需求收集與分析、性能模型設(shè)計(jì)、場景設(shè)計(jì)與實(shí)現(xiàn)等。通過該流程,可以將復(fù)雜的測試過程簡單化、標(biāo)準(zhǔn)化,有效地降低了測試難度,提高了測試效率。同時(shí),本文還在實(shí)際項(xiàng)目中應(yīng)用該流程,解決了過去在軟件性能測試過程中存在較多冗余步驟、測試不規(guī)范等問題。最后,對(duì)流程中的關(guān)鍵難點(diǎn)分析研究,確定了并發(fā)用戶數(shù)、吞吐量等常用性能指標(biāo)的計(jì)算方法。
目前,該流程已廣泛應(yīng)用于不動(dòng)產(chǎn)統(tǒng)一登記、自然資源一體化審批等相關(guān)軟件的性能測試中,反響良好。未來將不斷增加試點(diǎn)項(xiàng)目,優(yōu)化流程設(shè)計(jì),為各類企業(yè)的軟件性能測試提供更多參考。