紀芩
(江西省網(wǎng)絡(luò)安全研究院,江西 南昌 330019)
微信小程序是不需要用戶下載安裝、只需用微信掃碼或搜索打開即可使用的手機應(yīng)用程序。因小程序的開發(fā)門檻低、傳播快、收益高,越來越多的開發(fā)者投入到小程序這一領(lǐng)域。馬化騰在第五屆世界互聯(lián)網(wǎng)大會公開表示,目前微信小程序應(yīng)用數(shù)量超過了100萬,覆蓋200多個細分的行業(yè),日活用戶達到2個億。但與此同時,由于整體開發(fā)水平參差不齊,已出現(xiàn)越來越多的小程序質(zhì)量問題,尤其是在電商、零售、旅游、直播等容易有高并發(fā)量的行業(yè),小程序出現(xiàn)“服務(wù)器崩潰”“訪問響應(yīng)緩慢”“頁面操作卡死”“支付提交失敗”等性能問題更頻繁,所以對微信小程序的性能進行測試很有必要。目前用開源的性能測試工具測微信小程序的性能案例很少,為此,筆者以旅游行業(yè)為例,詳細介紹如何使用JMeter來測微信小程序的性能。
性能測試是指通過自動化工具模擬生產(chǎn)環(huán)境運行的業(yè)務(wù)壓力和使用場景組合,覆蓋多種正常負載、峰值負載和異常負載條件,測試系統(tǒng)的性能是否滿足生產(chǎn)性能指標要求的一系列過程[1]。性能測試是一項綜合性的工作,目的在于暴露性能問題,評估性能趨勢。通俗來說,性能測試實質(zhì)上就是利用工具去模擬大量用戶操作來驗證系統(tǒng)能夠承受的負載情況,找出潛在的性能問題,分析并解決;找出系統(tǒng)性能變化趨勢,為后續(xù)的擴展提供參考。
常見的Web性能測試可以分為以下幾類:
(1)負載測試:不斷加大負載(不同虛擬用戶數(shù))來確定在滿足性能指標情況下系統(tǒng)能夠承受的最大用戶數(shù),這種測試可以幫我們對系統(tǒng)進行定容定量,找到系統(tǒng)性能拐點。
(2)壓力測試:也叫強度測試,它是指逐步給系統(tǒng)增加壓力,測試系統(tǒng)的性能變化,使系統(tǒng)某些資源達到飽和或系統(tǒng)崩潰的邊緣,從而確定系統(tǒng)所能承受的最大壓力。
(3)并發(fā)測試:模擬多用戶并發(fā)訪問同一應(yīng)用、同一操作的測試,記錄是否會產(chǎn)生一些問題。
(4)配置測試:為了合理地調(diào)配資源,提高系統(tǒng)運行效率,通過測試手段來獲取、驗證、調(diào)整配置信息的過程,通過這個過程我們可以收集到不同配置反映出來的不同性能,從而為設(shè)備選擇及配置提供參考。
(5)容量測試:是指在一定的軟硬件及網(wǎng)絡(luò)環(huán)境下,測試系統(tǒng)所能支持的最大用戶數(shù)、最大存儲量等。容量測試通常與數(shù)據(jù)庫、系統(tǒng)資源(如CPU、內(nèi)存、磁盤等)有關(guān),用于規(guī)劃將來需求增長(如用戶增長、業(yè)務(wù)量增加等)時,對數(shù)據(jù)庫和系統(tǒng)資源的優(yōu)化。
一般來說,性能測試的完整過程包括分析、設(shè)計、準備、執(zhí)行和總結(jié)5個階段,常見的Web性能測試指標有:并發(fā)數(shù)、平均響應(yīng)時間、服務(wù)器資源占用率、錯誤率、吞吐率等。
Apache JMeter是Apache組織開發(fā)的基于Java的性能測試工具,它是一款開源桌面應(yīng)用軟件,可用來模擬用戶負載來完成性能測試工作。JMeter可以對Web應(yīng)用進行測試,也可 以 對Java請 求、JMS、EJB、WebService、JDBC、FTP、JSR223、Socket等協(xié)議進行測試,除此之外,還可以通過擴展JMeter功能來滿足特定的測試需求。
在Web性能測試中,JMeter軟件被當作Web服務(wù)器與瀏覽器之間的一個代理網(wǎng)管,模擬在服務(wù)器、網(wǎng)絡(luò)或者其他對象上附加高負載以測試他們提供服務(wù)的受壓能力,或者分析他們提供的服務(wù)在不同負載條件下的總性能情況[2]。JMeter體系結(jié)構(gòu)由取樣器、前/后置處理器、配置元件、控制器、斷言、監(jiān)聽器、線程組等元件組成,它的基本工作原理是建立一個線程池,多線程運行取樣器產(chǎn)生大量負載,在運行過程中通過斷言來驗證結(jié)果的正確性,通過監(jiān)聽器來記錄測試結(jié)果[3]。如果取樣器中有參數(shù)化的需求,可以通過配置元件或者前置處理器來完成;如果有關(guān)聯(lián)需求,可以通過后置處理器來完成;如果想要設(shè)置應(yīng)用場景,比如模擬多少用戶、運行多長時間,可以設(shè)置線程組;如果想要模擬并發(fā)場景,可以利用定時器來設(shè)置;如果想要控制業(yè)務(wù)的執(zhí)行邏輯,可以用控制器來完成。
JMeter具有開源免費且操作簡單、可進行功能擴展、測試腳本易于維護等眾多優(yōu)點,正因如此,JMeter是目前使用率最高的性能測試工具之一。
本文選取“云游吉安”微信小程序的“關(guān)鍵詞搜索”操作作為測試點來進行性能測試,測試工具版本為JMeter 5.1.1?!霸朴渭病蔽⑿判〕绦蚴羌彩形膹V新聞出版旅游局推出的一款涵蓋吃、住、行、游、購、娛、文化、歷史八個版塊,內(nèi)容豐富,可為游客提供人性化服務(wù)體驗的小程序,用戶規(guī)模龐大。
根據(jù)小程序的實際使用需求,制定性能指標如表1。由于“云游吉安”是一款真實在用的商業(yè)小程序,沒有開發(fā)方的配合,有些性能指標比如服務(wù)器CPU占用率和內(nèi)存使用率無法進行測試獲取,故不列入本文性能測試指標。筆者首先從1500并發(fā)數(shù)開始測試,分5次逐漸增加并發(fā)數(shù)到3500,分析各個性能指標結(jié)果的變化。
表1 性能測試指標
微信小程序可在手機端微信和電腦端微信中運行,經(jīng)過多次嘗試,筆者發(fā)現(xiàn)在手機端微信進行測試時JMeter工具錄制不到有效腳本,F(xiàn)idder、Burpsuite等抓包工具可錄制到有效腳本,因此需要通過Fidder、Burpsuite錄制腳本導出.jmx格式然后在JMeter上運行,而且腳本還要進行開發(fā)和調(diào)試,此方法比較繁瑣。最終,筆者選用“云游吉安”微信小程序電腦端進行腳本錄制及測試。腳本錄制之前,電腦端要設(shè)置代理,地址為:127.0.0.1,端口號可自行設(shè)置,這里設(shè)為8886,和JMeter中的HTTP代理服務(wù)器端口號一致。
初次錄制時,打開JMeter按常規(guī)步驟添加線程組、HTTP代理服務(wù)器、HTTP Cookie管理器等元件,在HTTP代理服務(wù)器中,端口號設(shè)為8886,目標控制器選擇:測試計劃>線程組,分組選擇:不對樣本分組,其余設(shè)置默認,然后啟動HTTP代理服務(wù)器,接著在電腦端微信操作“云游吉安”小程序,錄制結(jié)束后發(fā)現(xiàn)JMeter無法錄制到有效內(nèi)容,只錄制到個別無效請求。檢查發(fā)現(xiàn)這些請求都是https協(xié)議,因為錄制http和https有不一樣的規(guī)則,https是http+SSL,需要安全證書,所以被禁止訪問。
再次錄制時,啟動JMeter的HTTP代理服務(wù)器,此時會在JMeter安裝目錄的bin目錄下生成一個安全證書文件ApacheJMeterTemporaryRootCA.Crt,隨后需要在JMeter選項>SSL管理器中導入此證書,導入后關(guān)閉JMeter。同時,電腦端也要導入JMeter剛剛生成的安全證書,筆者使用的電腦操作系統(tǒng)為Windows 10,導入證書過程為:在“運行”里面輸入certmgr.msc,進入到證書管理器,點擊“受信任的根證書頒發(fā)機構(gòu)”,選擇要導入的證書,點擊導入即可。
再次打開JMeter進行最后一次錄制,啟動HTTP代理服務(wù)器后,在電腦端微信打開“云游吉安”小程序,接著點擊首頁關(guān)鍵詞搜索框,頁面隨即跳轉(zhuǎn)到專門的搜索頁面,搜索框輸入“井岡山”回車后,搜索結(jié)果頁面如圖1所示。
圖1 搜索結(jié)果頁面
錄制結(jié)束后對腳本進行分析,將明顯的無用HTTP請求刪除,再對其余HTTP請求一一進行分析。通過在每條HTTP請求下面添加監(jiān)聽器>察看結(jié)果樹,運行腳本后分析每條HTTP請求提交的數(shù)據(jù)和服務(wù)器對其的響應(yīng)數(shù)據(jù),直到出現(xiàn)正確的請求和響應(yīng)數(shù)據(jù),說明腳本調(diào)試成功,隨后可以刪除腳本中的無效請求,只保留“關(guān)鍵詞搜索”操作對應(yīng)的請求。調(diào)試成功的腳本如圖2、圖3所示,圖2中同請求一起發(fā)送各參數(shù)值及圖3中察看結(jié)果樹的響應(yīng)數(shù)據(jù)均與錄制時的圖1一致。圖2中HTTP信息頭管理器Referer值為:https://servicewechat.com/wx7827424d4fb6f317/67/page-frame.html。
圖2 關(guān)鍵詞搜索——HTTP請求
圖3 關(guān)鍵詞搜索——察看結(jié)果樹
在腳本中添加簡單控制器、同步定時器、聚合報告、圖形結(jié)果、響應(yīng)斷言、斷言結(jié)果等元件,在響應(yīng)斷言中測試模式里面輸入“井岡山”、自定義失敗消息里面輸入“查詢失敗”,其余設(shè)置默認,然后按照測試計劃分5次進行多用戶并發(fā)測試。分別將線程數(shù)和定時器中模擬用戶組數(shù)量設(shè)為1500、2000、2500、3000、3500,運行腳本后,性能測試結(jié)果(聚合報告)如圖4~圖8所示,將圖4~圖8的結(jié)果數(shù)據(jù)進行整理,得出表2。
圖4 1500并發(fā)數(shù)的聚合報告
圖8 3500并發(fā)數(shù)的聚合報告
從表2可知:
表2 性能測試結(jié)果
(1)系統(tǒng)的平均響應(yīng)時間隨著并發(fā)數(shù)的逐步增加不斷增長,當并發(fā)數(shù)為3500時,平均響應(yīng)時間達到3.134秒,不滿足性能測試指標要求。
(2)隨著并發(fā)數(shù)的增加,系統(tǒng)的吞吐率先增后降,當并發(fā)數(shù)為3000時,吞吐率達到最大值591.0事務(wù)/秒,而后開始急劇下降,當并發(fā)數(shù)為3500時,吞吐率降至156.0事務(wù)/秒,不滿足性能測試指標要求。
綜上所述,并發(fā)數(shù)不超過3000時,系統(tǒng)各性能測試結(jié)果均滿足指標要求。當并發(fā)數(shù)為3000~3500時,系統(tǒng)平均響應(yīng)時間超時,錯誤率出現(xiàn),吞吐率從峰值急降,系統(tǒng)性能開始出現(xiàn)瓶頸,瓶頸原因可能與服務(wù)器的配置、網(wǎng)絡(luò)帶寬以及程序代碼邏輯有關(guān)。
用開源性能測試工具JMeter對微信小程序進行性能測試的案例目前很少,所以本文測試方法具有一定的新穎性。傳統(tǒng)思想是用微信手機端運行小程序進行測試,那樣很可能會錄制失敗,或者錄制難度和繁瑣度會大大增加。本文作者的創(chuàng)新點在于運用JMeter對微信小程序電腦端進行性能測試,此測試方法準確有效,操作簡單易上手。讀者后續(xù)可以自行選擇一些感興趣的微信小程序參照本文方法進行測試,如果定的性能指標中并發(fā)數(shù)較大,可考慮采用多臺負載機進行分布式測試。
圖5 2000并發(fā)數(shù)的聚合報告
圖6 2500并發(fā)數(shù)的聚合報告
圖7 3000并發(fā)數(shù)的聚合報告