紀芩
(江西省網絡安全研究院,江西 南昌 330019)
微信小程序是不需要用戶下載安裝、只需用微信掃碼或搜索打開即可使用的手機應用程序。因小程序的開發門檻低、傳播快、收益高,越來越多的開發者投入到小程序這一領域。馬化騰在第五屆世界互聯網大會公開表示,目前微信小程序應用數量超過了100萬,覆蓋200多個細分的行業,日活用戶達到2個億。但與此同時,由于整體開發水平參差不齊,已出現越來越多的小程序質量問題,尤其是在電商、零售、旅游、直播等容易有高并發量的行業,小程序出現“服務器崩潰”“訪問響應緩慢”“頁面操作卡死”“支付提交失敗”等性能問題更頻繁,所以對微信小程序的性能進行測試很有必要。目前用開源的性能測試工具測微信小程序的性能案例很少,為此,筆者以旅游行業為例,詳細介紹如何使用JMeter來測微信小程序的性能。
性能測試是指通過自動化工具模擬生產環境運行的業務壓力和使用場景組合,覆蓋多種正常負載、峰值負載和異常負載條件,測試系統的性能是否滿足生產性能指標要求的一系列過程[1]。性能測試是一項綜合性的工作,目的在于暴露性能問題,評估性能趨勢。通俗來說,性能測試實質上就是利用工具去模擬大量用戶操作來驗證系統能夠承受的負載情況,找出潛在的性能問題,分析并解決;找出系統性能變化趨勢,為后續的擴展提供參考。
常見的Web性能測試可以分為以下幾類:
(1)負載測試:不斷加大負載(不同虛擬用戶數)來確定在滿足性能指標情況下系統能夠承受的最大用戶數,這種測試可以幫我們對系統進行定容定量,找到系統性能拐點。
(2)壓力測試:也叫強度測試,它是指逐步給系統增加壓力,測試系統的性能變化,使系統某些資源達到飽和或系統崩潰的邊緣,從而確定系統所能承受的最大壓力。
(3)并發測試:模擬多用戶并發訪問同一應用、同一操作的測試,記錄是否會產生一些問題。
(4)配置測試:為了合理地調配資源,提高系統運行效率,通過測試手段來獲取、驗證、調整配置信息的過程,通過這個過程我們可以收集到不同配置反映出來的不同性能,從而為設備選擇及配置提供參考。
(5)容量測試:是指在一定的軟硬件及網絡環境下,測試系統所能支持的最大用戶數、最大存儲量等。容量測試通常與數據庫、系統資源(如CPU、內存、磁盤等)有關,用于規劃將來需求增長(如用戶增長、業務量增加等)時,對數據庫和系統資源的優化。
一般來說,性能測試的完整過程包括分析、設計、準備、執行和總結5個階段,常見的Web性能測試指標有:并發數、平均響應時間、服務器資源占用率、錯誤率、吞吐率等。
Apache JMeter是Apache組織開發的基于Java的性能測試工具,它是一款開源桌面應用軟件,可用來模擬用戶負載來完成性能測試工作。JMeter可以對Web應用進行測試,也可 以 對Java請 求、JMS、EJB、WebService、JDBC、FTP、JSR223、Socket等協議進行測試,除此之外,還可以通過擴展JMeter功能來滿足特定的測試需求。
在Web性能測試中,JMeter軟件被當作Web服務器與瀏覽器之間的一個代理網管,模擬在服務器、網絡或者其他對象上附加高負載以測試他們提供服務的受壓能力,或者分析他們提供的服務在不同負載條件下的總性能情況[2]。JMeter體系結構由取樣器、前/后置處理器、配置元件、控制器、斷言、監聽器、線程組等元件組成,它的基本工作原理是建立一個線程池,多線程運行取樣器產生大量負載,在運行過程中通過斷言來驗證結果的正確性,通過監聽器來記錄測試結果[3]。如果取樣器中有參數化的需求,可以通過配置元件或者前置處理器來完成;如果有關聯需求,可以通過后置處理器來完成;如果想要設置應用場景,比如模擬多少用戶、運行多長時間,可以設置線程組;如果想要模擬并發場景,可以利用定時器來設置;如果想要控制業務的執行邏輯,可以用控制器來完成。
JMeter具有開源免費且操作簡單、可進行功能擴展、測試腳本易于維護等眾多優點,正因如此,JMeter是目前使用率最高的性能測試工具之一。
本文選取“云游吉安”微信小程序的“關鍵詞搜索”操作作為測試點來進行性能測試,測試工具版本為JMeter 5.1.1。“云游吉安”微信小程序是吉安市文廣新聞出版旅游局推出的一款涵蓋吃、住、行、游、購、娛、文化、歷史八個版塊,內容豐富,可為游客提供人性化服務體驗的小程序,用戶規模龐大。
根據小程序的實際使用需求,制定性能指標如表1。由于“云游吉安”是一款真實在用的商業小程序,沒有開發方的配合,有些性能指標比如服務器CPU占用率和內存使用率無法進行測試獲取,故不列入本文性能測試指標。筆者首先從1500并發數開始測試,分5次逐漸增加并發數到3500,分析各個性能指標結果的變化。

表1 性能測試指標
微信小程序可在手機端微信和電腦端微信中運行,經過多次嘗試,筆者發現在手機端微信進行測試時JMeter工具錄制不到有效腳本,Fidder、Burpsuite等抓包工具可錄制到有效腳本,因此需要通過Fidder、Burpsuite錄制腳本導出.jmx格式然后在JMeter上運行,而且腳本還要進行開發和調試,此方法比較繁瑣。最終,筆者選用“云游吉安”微信小程序電腦端進行腳本錄制及測試。腳本錄制之前,電腦端要設置代理,地址為:127.0.0.1,端口號可自行設置,這里設為8886,和JMeter中的HTTP代理服務器端口號一致。
初次錄制時,打開JMeter按常規步驟添加線程組、HTTP代理服務器、HTTP Cookie管理器等元件,在HTTP代理服務器中,端口號設為8886,目標控制器選擇:測試計劃>線程組,分組選擇:不對樣本分組,其余設置默認,然后啟動HTTP代理服務器,接著在電腦端微信操作“云游吉安”小程序,錄制結束后發現JMeter無法錄制到有效內容,只錄制到個別無效請求。檢查發現這些請求都是https協議,因為錄制http和https有不一樣的規則,https是http+SSL,需要安全證書,所以被禁止訪問。
再次錄制時,啟動JMeter的HTTP代理服務器,此時會在JMeter安裝目錄的bin目錄下生成一個安全證書文件ApacheJMeterTemporaryRootCA.Crt,隨后需要在JMeter選項>SSL管理器中導入此證書,導入后關閉JMeter。同時,電腦端也要導入JMeter剛剛生成的安全證書,筆者使用的電腦操作系統為Windows 10,導入證書過程為:在“運行”里面輸入certmgr.msc,進入到證書管理器,點擊“受信任的根證書頒發機構”,選擇要導入的證書,點擊導入即可。
再次打開JMeter進行最后一次錄制,啟動HTTP代理服務器后,在電腦端微信打開“云游吉安”小程序,接著點擊首頁關鍵詞搜索框,頁面隨即跳轉到專門的搜索頁面,搜索框輸入“井岡山”回車后,搜索結果頁面如圖1所示。

圖1 搜索結果頁面
錄制結束后對腳本進行分析,將明顯的無用HTTP請求刪除,再對其余HTTP請求一一進行分析。通過在每條HTTP請求下面添加監聽器>察看結果樹,運行腳本后分析每條HTTP請求提交的數據和服務器對其的響應數據,直到出現正確的請求和響應數據,說明腳本調試成功,隨后可以刪除腳本中的無效請求,只保留“關鍵詞搜索”操作對應的請求。調試成功的腳本如圖2、圖3所示,圖2中同請求一起發送各參數值及圖3中察看結果樹的響應數據均與錄制時的圖1一致。圖2中HTTP信息頭管理器Referer值為:https://servicewechat.com/wx7827424d4fb6f317/67/page-frame.html。

圖2 關鍵詞搜索——HTTP請求

圖3 關鍵詞搜索——察看結果樹
在腳本中添加簡單控制器、同步定時器、聚合報告、圖形結果、響應斷言、斷言結果等元件,在響應斷言中測試模式里面輸入“井岡山”、自定義失敗消息里面輸入“查詢失敗”,其余設置默認,然后按照測試計劃分5次進行多用戶并發測試。分別將線程數和定時器中模擬用戶組數量設為1500、2000、2500、3000、3500,運行腳本后,性能測試結果(聚合報告)如圖4~圖8所示,將圖4~圖8的結果數據進行整理,得出表2。

圖4 1500并發數的聚合報告

圖8 3500并發數的聚合報告
從表2可知:

表2 性能測試結果
(1)系統的平均響應時間隨著并發數的逐步增加不斷增長,當并發數為3500時,平均響應時間達到3.134秒,不滿足性能測試指標要求。
(2)隨著并發數的增加,系統的吞吐率先增后降,當并發數為3000時,吞吐率達到最大值591.0事務/秒,而后開始急劇下降,當并發數為3500時,吞吐率降至156.0事務/秒,不滿足性能測試指標要求。
綜上所述,并發數不超過3000時,系統各性能測試結果均滿足指標要求。當并發數為3000~3500時,系統平均響應時間超時,錯誤率出現,吞吐率從峰值急降,系統性能開始出現瓶頸,瓶頸原因可能與服務器的配置、網絡帶寬以及程序代碼邏輯有關。
用開源性能測試工具JMeter對微信小程序進行性能測試的案例目前很少,所以本文測試方法具有一定的新穎性。傳統思想是用微信手機端運行小程序進行測試,那樣很可能會錄制失敗,或者錄制難度和繁瑣度會大大增加。本文作者的創新點在于運用JMeter對微信小程序電腦端進行性能測試,此測試方法準確有效,操作簡單易上手。讀者后續可以自行選擇一些感興趣的微信小程序參照本文方法進行測試,如果定的性能指標中并發數較大,可考慮采用多臺負載機進行分布式測試。

圖5 2000并發數的聚合報告

圖6 2500并發數的聚合報告

圖7 3000并發數的聚合報告