本申請涉及計(jì)算機(jī)及網(wǎng)絡(luò)技術(shù)領(lǐng)域,尤其涉及一種基于套接字(Socket)的服務(wù)器負(fù)載測試方法及系統(tǒng)。
背景技術(shù):
負(fù)載壓力測試是在一定約束條件下測試系統(tǒng)所能承受的并發(fā)用戶量、運(yùn)行時間、數(shù)據(jù)量,以確定系統(tǒng)所能承受的最大負(fù)載壓力。通過測試系統(tǒng)在資源超負(fù)荷情況下的表現(xiàn),以發(fā)現(xiàn)設(shè)計(jì)上的錯誤或驗(yàn)證系統(tǒng)的負(fù)載能力。在這種測試中,將使測試對象承擔(dān)不同的工作量,以評測和評估測試對象在不同工作量條件下的性能行為,以及持續(xù)正常運(yùn)行的能力。
對于服務(wù)器-客戶端組成的系統(tǒng)來說,通常需要測試服務(wù)器所能承載的最大并發(fā)用戶數(shù)?,F(xiàn)有技術(shù)中,對于服務(wù)器的負(fù)載測試通常是將采用多臺測試客戶端,每臺測試客戶端上運(yùn)行盡可能多的客戶端程序,每個客戶端程序分別接入服務(wù)器,來構(gòu)造出大量的虛擬用戶來模擬正常用戶的行為,收集這個期間服務(wù)器性能數(shù)據(jù),通過分析這些數(shù)據(jù)判斷服務(wù)器功能模塊是否存在性能瓶頸。
現(xiàn)有技術(shù)中的服務(wù)器負(fù)載測試方法通常是基于HTTP協(xié)議,由客戶端設(shè)備生成盡可能多的虛擬客戶同時集中訪問服務(wù)器,以檢驗(yàn)服務(wù)器在超負(fù)荷情況下的表現(xiàn)。然而,同一臺客戶端設(shè)備中生成多個虛擬客戶端實(shí)際上是按照一定時序依次訪問服務(wù)器,只不過前后間隔時間極短,達(dá)到近似同時訪問的效果,并不是真正意義上的同時訪問服務(wù)器。
技術(shù)實(shí)現(xiàn)要素:
本申請?zhí)峁┝艘环N基于套接字的服務(wù)器負(fù)載測試方法及系統(tǒng),可以實(shí)現(xiàn)真正意義上的虛擬用戶同時執(zhí)行測試用例,達(dá)到最佳的測試效果。
本申請實(shí)施例提供的一種基于套接字的服務(wù)器負(fù)載測試系統(tǒng),包括:網(wǎng)絡(luò)引擎模塊、負(fù)載測試工具腳本模塊、負(fù)載測試過程管理模塊和負(fù)載測試數(shù)據(jù)監(jiān)控模塊;
網(wǎng)絡(luò)引擎模塊用于提供基于套接字的接口函數(shù)供測試腳本編寫測試用例,其中包 括與被測服務(wù)器建立連接,向被測服務(wù)器發(fā)送消息或接收來自服務(wù)器的消息,以及提供虛擬用戶的各種操作功能;
負(fù)載測試工具腳本模塊用于調(diào)用網(wǎng)絡(luò)引擎模塊提供的接口函數(shù),對虛擬用戶的操作進(jìn)行組合,獲得包含特定測試邏輯的測試用例;
負(fù)載測試管理模塊用于實(shí)現(xiàn)負(fù)載測試操作過程,通過多線程機(jī)制模擬多個虛擬客戶端同時執(zhí)行測試用例達(dá)到并發(fā)測試目的;
負(fù)載測試數(shù)據(jù)監(jiān)控模塊用于監(jiān)控被測服務(wù)器的整體性能數(shù)據(jù)和/或被測服務(wù)器某一具體服務(wù)進(jìn)程的性能數(shù)據(jù)。
較佳地,所述網(wǎng)絡(luò)引擎模塊用C#語言編寫,使用WinSocket網(wǎng)絡(luò)編程接口,通過TCP協(xié)議實(shí)現(xiàn)與服務(wù)器端進(jìn)行交互。
較佳地,所述網(wǎng)絡(luò)引擎模塊以dll文件的形式存在。
較佳地,所述被測服務(wù)器為網(wǎng)絡(luò)游戲服務(wù)器,所述網(wǎng)絡(luò)引擎模塊包括:
登錄單元,用于與被測服務(wù)器建立連接,登錄被測服務(wù)器或者退出登錄;
收發(fā)單元,用于向被測服務(wù)器發(fā)送消息包或者接收來自被測服務(wù)器的消息包;
測試單元,用于生成測試壓力場景。
較佳地,所述負(fù)載測試工具腳本模塊所實(shí)現(xiàn)的測試邏輯至少包含以下三個部分:
與被測服務(wù)器連接,返回一個保持連接狀態(tài)的套接字;
依據(jù)測試用例生成測試壓力,測試過程中通過所述套接字與被測服務(wù)器之間進(jìn)行信息收發(fā);
與被測服務(wù)器斷開連接。
較佳地,所述負(fù)載測試管理模塊包括負(fù)載測試控制單元和負(fù)載測試發(fā)生器,
負(fù)載測試控制單元,用于設(shè)計(jì)性能測試場景;配置虛擬玩家運(yùn)行數(shù)量,配置負(fù)載發(fā)生器,并向負(fù)載發(fā)生器發(fā)出負(fù)載測試操作指令;
負(fù)載發(fā)生器,用于執(zhí)行具體的負(fù)載測試操作;
一個負(fù)載測試控制單元控制多臺測試客戶端設(shè)備上的負(fù)載發(fā)生器。
較佳地,所述負(fù)載測試數(shù)據(jù)監(jiān)控模塊通過訪問游戲服務(wù)器RPC.STATD進(jìn)程獲取服務(wù)器性能數(shù)據(jù),并在可視化窗口內(nèi)顯示獲取到的服務(wù)器性能數(shù)據(jù)。
較佳地,所述負(fù)載測試數(shù)據(jù)監(jiān)控模塊通過簡單網(wǎng)絡(luò)管理協(xié)議SNMP監(jiān)控窗口,獲取到運(yùn)行在游戲服務(wù)器上某一進(jìn)程的CPU、內(nèi)存性能數(shù)據(jù)。
本申請實(shí)施例還提供了一種基于套接字的服務(wù)器負(fù)載測試方法,該方法由如前所述的基于套接字的服務(wù)器負(fù)載測試系統(tǒng)實(shí)現(xiàn),包括如下步驟:
A、調(diào)用網(wǎng)絡(luò)引擎模塊提供的接口函數(shù),對虛擬用戶的操作進(jìn)行組合,獲得包含特定測試邏輯的測試用例;
B、通過多線程機(jī)制模擬多個虛擬客戶端同時執(zhí)行測試用例達(dá)到并發(fā)測試目的;
C、監(jiān)控被測服務(wù)器的整體性能數(shù)據(jù)和/或被測服務(wù)器某一具體服務(wù)進(jìn)程的性能數(shù)據(jù)。
較佳地,所述網(wǎng)絡(luò)引擎模塊用C#語言編寫,使用WinSocket網(wǎng)絡(luò)編程接口,通過TCP協(xié)議實(shí)現(xiàn)與服務(wù)器端進(jìn)行交互。
較佳地,所述網(wǎng)絡(luò)引擎模塊以dll文件的形式存在。
較佳地,所述被測服務(wù)器為網(wǎng)絡(luò)游戲服務(wù)器,所述網(wǎng)絡(luò)引擎模塊提供的接口函數(shù)包括:
用于與被測服務(wù)器建立連接,登錄被測服務(wù)器或者退出登錄的接口函數(shù);
用于向被測服務(wù)器發(fā)送消息包或者接收來自被測服務(wù)器的消息包的接口函數(shù);
用于生成測試壓力場景的接口函數(shù)。
較佳地,所述測試邏輯至少包含以下三個部分:
與被測服務(wù)器連接,返回一個保持連接狀態(tài)的套接字;
依據(jù)測試用例生成測試壓力,測試過程中通過所述套接字與被測服務(wù)器之間進(jìn)行信息收發(fā);
與被測服務(wù)器斷開連接。
較佳地,步驟B包括:
設(shè)計(jì)性能測試場景;配置虛擬玩家運(yùn)行數(shù)量,配置負(fù)載發(fā)生器,并向一個以上的測試客戶端設(shè)備上的負(fù)載發(fā)生器發(fā)出負(fù)載測試操作指令;
接收到負(fù)載測試操作指令的負(fù)載發(fā)生器執(zhí)行具體的負(fù)載測試操作。
較佳地,步驟C中通過訪問游戲服務(wù)器RPC.STATD進(jìn)程獲取服務(wù)器性能數(shù)據(jù),并在可視化窗口內(nèi)顯示獲取到的服務(wù)器性能數(shù)據(jù)
較佳地,步驟C中通過簡單網(wǎng)絡(luò)管理協(xié)議SNMP監(jiān)控窗口,獲取到運(yùn)行在游戲服務(wù)器上某一進(jìn)程的CPU、內(nèi)存性能數(shù)據(jù)。
從以上技術(shù)方案可以看出,該負(fù)載測試方案使用多線程機(jī)制,通過負(fù)載控制單元生成指定數(shù)量線程模擬大量虛擬角色并控制每個線程執(zhí)行一個獨(dú)立、完整的測試用例,生成并發(fā)測試壓力,從而達(dá)到并發(fā)測試目的。
附圖說明
圖1為本申請實(shí)施例提供的基于Socket協(xié)議的服務(wù)器負(fù)載測試系統(tǒng)框圖;
圖2為本申請實(shí)施例提供的一種基于套接字的服務(wù)器負(fù)載測試方法流程圖。
具體實(shí)施方式
為使本申請技術(shù)方案的技術(shù)原理、特點(diǎn)以及技術(shù)效果更加清楚,以下結(jié)合具體實(shí) 施例對本申請技術(shù)方案進(jìn)行詳細(xì)闡述。
本申請實(shí)施例以一個大型多人在線角色扮演游戲(MMORPG)系統(tǒng)為例,對本申請方案進(jìn)行說明。本申請的應(yīng)用范圍不限于網(wǎng)絡(luò)游戲系統(tǒng),還可以適用于其他客戶端-服務(wù)器架構(gòu)的網(wǎng)絡(luò)系統(tǒng)。
本申請實(shí)施例提供的基于Socket協(xié)議的服務(wù)器負(fù)載測試系統(tǒng)如圖1所示,主要包括:網(wǎng)絡(luò)引擎模塊101、負(fù)載測試工具腳本模塊102、負(fù)載測試過程管理模塊103和負(fù)載測試數(shù)據(jù)監(jiān)控模塊104。各個模塊的功能如下:
網(wǎng)絡(luò)引擎模塊101:供負(fù)載測試工具腳本模塊102的測試腳本調(diào)用;用于提供API接口函數(shù)供測試腳本編寫測試用例,其中包括與服務(wù)器建立連接,向服務(wù)器發(fā)送消息或接收來自服務(wù)器的消息,以及提供虛擬用戶的各種操作功能。
本申請實(shí)施例中,該模塊用C#語言編寫,使用WinSocket網(wǎng)絡(luò)編程接口,通過TCP協(xié)議實(shí)現(xiàn)與服務(wù)器端進(jìn)行交互。
根據(jù)本申請的一個具體實(shí)施例,網(wǎng)絡(luò)引擎模塊101中包含:
登錄單元,用于與被測服務(wù)器建立連接,登錄被測服務(wù)器或者退出登錄;
收發(fā)單元,用于向被測服務(wù)器發(fā)送消息包或者接收來自被測服務(wù)器的消息包;
測試單元,用于生成測試壓力場景。
一個簡單的例子,測試單元可以是移動單元,用于控制虛擬玩家在虛擬游戲世界中的移動。
以下以偽代碼的形式描述上述幾個單元:
測試單元可以有一個或多個,除了移動單元之外,還可以包括戰(zhàn)斗、對話等功能單元,篇幅有限,不一一贅述。
負(fù)載測試工具腳本模塊102用于調(diào)用網(wǎng)絡(luò)引擎模塊提供的接口函數(shù),對虛擬用戶的操作進(jìn)行組合實(shí)現(xiàn)測試邏輯;該模塊將被負(fù)載測試管理模塊103調(diào)用。
根據(jù)本申請的一個具體實(shí)施例,負(fù)載測試工具腳本模塊102至少包含一個完成的測試用例執(zhí)行過程,腳本內(nèi)容包含以下三個部分:
與被測服務(wù)器連接,返回一個保持連接狀態(tài)的套接字;
依據(jù)測試用例生成測試壓力(該示例中,測試壓力為虛擬玩家在指定半徑內(nèi)隨機(jī)移動),測試過程中通過所述套接字與被測服務(wù)器之間進(jìn)行信息收發(fā);
與被測服務(wù)器斷開連接。
相應(yīng)的偽代碼如下:
負(fù)載測試管理模塊103用于實(shí)現(xiàn)負(fù)載測試操作過程,通過多線程機(jī)制控制多個虛擬客戶端同時執(zhí)行測試用例達(dá)到并發(fā)測試目的。具體包括:負(fù)載測試控制單元和負(fù)載測試發(fā)生器,
負(fù)載測試控制單元,用于設(shè)計(jì)性能測試場景;配置虛擬玩家運(yùn)行數(shù)量(此處設(shè)置同時運(yùn)行多少虛擬用戶),配置負(fù)載發(fā)生器,并向負(fù)載發(fā)生器發(fā)出負(fù)載測試操作指令;
負(fù)載發(fā)生器,用于執(zhí)行具體的負(fù)載測試操作。
一個負(fù)載測試控制單元可以控制多臺測試客戶端設(shè)備上的負(fù)載發(fā)生器。
負(fù)載測試數(shù)據(jù)監(jiān)控模塊104:
根據(jù)負(fù)載測試需要,負(fù)載測試數(shù)據(jù)監(jiān)控模塊104需要監(jiān)控被測游戲服務(wù)器(通常為Linux服務(wù)器)的整體CPU性能、內(nèi)存頁交換速率(Paging rate)、交換分區(qū)(Swap)等性能參數(shù),也需要監(jiān)控某一具體游戲服務(wù)進(jìn)程的CPU、內(nèi)存變化趨勢??梢酝ㄟ^訪問游戲服務(wù)器RPC.STATD進(jìn)程獲取服務(wù)器性能數(shù)據(jù),,比如Linux服務(wù)器CPU使用率,Paging rate、Swap等性能數(shù)據(jù),并在可視化窗體中顯示實(shí)時數(shù)據(jù)信息,該信息可直接作性能監(jiān)控。或者,也可以通過SNMP協(xié)議訪問游戲服務(wù)器某個游戲服務(wù)的性能數(shù)據(jù),比如獲取游戲場景服務(wù)AppSceneServer的CPU使用率、內(nèi)存使用率等實(shí)時數(shù)據(jù),作為判斷該游戲服務(wù)的性能指標(biāo)。
本申請實(shí)施例還提供了一種基于套接字的服務(wù)器負(fù)載測試方法,該方法由如上所述的基于套接字的服務(wù)器負(fù)載測試系統(tǒng)實(shí)現(xiàn),如圖2所示,包括如下步驟:
步驟201:調(diào)用網(wǎng)絡(luò)引擎模塊提供的接口函數(shù),對虛擬用戶的操作進(jìn)行組合,獲得包含特定測試邏輯的測試用例;
步驟202:通過多線程機(jī)制模擬多個虛擬客戶端同時執(zhí)行測試用例達(dá)到并發(fā)測試目的;
步驟203:監(jiān)控被測服務(wù)器的整體性能數(shù)據(jù)和/或被測服務(wù)器某一具體服務(wù)進(jìn)程的性能數(shù)據(jù)。
根據(jù)本申請的另一實(shí)施例,所述網(wǎng)絡(luò)引擎模塊用C#語言編寫,使用WinSocket網(wǎng)絡(luò)編程接口,通過TCP協(xié)議實(shí)現(xiàn)與服務(wù)器端進(jìn)行交互。
根據(jù)本申請的另一實(shí)施例,所述網(wǎng)絡(luò)引擎模塊以dll文件的形式存在。
根據(jù)本申請的另一實(shí)施例,所述被測服務(wù)器為網(wǎng)絡(luò)游戲服務(wù)器,所述網(wǎng)絡(luò)引擎模塊提供的接口函數(shù)包括:
用于與被測服務(wù)器建立連接,登錄被測服務(wù)器或者退出登錄的接口函數(shù);
用于向被測服務(wù)器發(fā)送消息包或者接收來自被測服務(wù)器的消息包的接口函數(shù);
用于生成測試壓力場景的接口函數(shù)。
根據(jù)本申請的另一實(shí)施例,所述測試邏輯至少包含以下三個部分:
與被測服務(wù)器連接,返回一個保持連接狀態(tài)的套接字;
依據(jù)測試用例生成測試壓力,測試過程中通過所述套接字與被測服務(wù)器之間進(jìn)行信息收發(fā);
與被測服務(wù)器斷開連接。
根據(jù)本申請的另一實(shí)施例,步驟202包括:
設(shè)計(jì)性能測試場景;配置虛擬玩家運(yùn)行數(shù)量,配置負(fù)載發(fā)生器,并向一個以上的測試客戶端設(shè)備上的負(fù)載發(fā)生器發(fā)出負(fù)載測試操作指令;
接收到負(fù)載測試操作指令的負(fù)載發(fā)生器執(zhí)行具體的負(fù)載測試操作。
根據(jù)本申請的另一實(shí)施例,步驟203中通過訪問游戲服務(wù)器RPC.STATD進(jìn)程獲取服務(wù)器性能數(shù)據(jù),并在可視化窗口內(nèi)顯示獲取到的服務(wù)器性能數(shù)據(jù)。
根據(jù)本申請的另一實(shí)施例,步驟203中通過簡單網(wǎng)絡(luò)管理協(xié)議SNMP監(jiān)控窗口,獲取到運(yùn)行在游戲服務(wù)器上某一進(jìn)程的CPU、內(nèi)存性能數(shù)據(jù)。
以測試100個虛擬用戶同時移動時服務(wù)器性能為例,對本申請實(shí)施例方案進(jìn)行說明。
網(wǎng)絡(luò)引擎處理模塊101該模塊以dll文件的形式存在,里面封裝了虛擬客戶端和服務(wù)器端交互時用到的各種API接口函數(shù),例如連接服務(wù)器、登陸、角色移動等接口函數(shù)。
其中,收發(fā)網(wǎng)絡(luò)數(shù)據(jù)流引擎函數(shù)(SocketHost.cs)的偽代碼描述如下:
SocketHost.cs/*封裝的網(wǎng)絡(luò)數(shù)據(jù)流收、發(fā)功能接口*/
登陸游戲函數(shù)(LoginGame.cs)的偽代碼描述如下:
LoginGame.cs/*登陸游戲服務(wù)器*
控制虛擬角色移動函數(shù)(MoveAction.cs)的偽代碼描述如下:
MoveAction.cs/*移動*
在該示例中,負(fù)載測試工具腳本模塊102的腳本包含四部分:全局設(shè)置函數(shù)(Globals.cs),用戶初始函數(shù)(Init.cs),行動函數(shù)(Action.cs),用戶結(jié)束函數(shù)(End.cs)。
其中,global.cs定義一些環(huán)境變量,比如整個測試過程都要用到的套接字:
init.cs,初始化腳本運(yùn)行所需的變量,根據(jù)服務(wù)器ip與端口連接游戲服務(wù)器并返回已登錄狀態(tài)的Socket套接字。
Action.cs,執(zhí)行負(fù)載測試內(nèi)容,簡單來說就是使用已經(jīng)和游戲服務(wù)器保持連接的socket發(fā)送虛擬用戶的移動請求,實(shí)現(xiàn)虛擬用戶的移動:
end.cs,用于清理運(yùn)行環(huán)境:
負(fù)載測試管理模塊103設(shè)置負(fù)載測試環(huán)境并啟動,其中,負(fù)載測試控制單元包含以下關(guān)鍵功能單元:
第一單元,用于向各個運(yùn)行環(huán)境分配測試腳本;
第二單元,用于設(shè)定運(yùn)行測試所需的虛擬用戶數(shù)量;
第三單元,用于定義運(yùn)行虛擬用戶的主機(jī);
第四單元,用于設(shè)定性能監(jiān)控。
負(fù)載測試數(shù)據(jù)監(jiān)控模塊104:監(jiān)控游戲服務(wù)器整體性能數(shù)據(jù),和/或監(jiān)控某一個游戲服務(wù)進(jìn)程(比如游戲場景進(jìn)程AppSceneServer).
監(jiān)控游戲服務(wù)器整體性能數(shù)據(jù)通過訪問游戲服務(wù)器RPC.STATD進(jìn)程獲取到服務(wù)器性能數(shù)據(jù)。通過SNMP監(jiān)控窗口,獲取到運(yùn)行在游戲服務(wù)器上某一進(jìn)程的CPU、內(nèi)存性能數(shù)據(jù),需要預(yù)先安裝簡單網(wǎng)絡(luò)管理協(xié)議(SNMP)。
通過以上的實(shí)施方式的描述,本領(lǐng)域的技術(shù)人員可以清楚地了解到本發(fā)明可借助軟件加必需的硬件平臺的方式來實(shí)現(xiàn),當(dāng)然也可以全部通過硬件來實(shí)施,但很多情況下前者是更佳的實(shí)施方式?;谶@樣的理解,本發(fā)明的技術(shù)方案對背景技術(shù)做出貢獻(xiàn)的全部或者部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該計(jì)算機(jī)軟件產(chǎn)品可以存儲在存儲介質(zhì)中,如ROM/RAM、磁碟、光盤等,包括若干指令用以使得一臺計(jì)算機(jī)設(shè)備(可以是個人計(jì)算機(jī),服務(wù)器,或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本發(fā)明各個實(shí)施例或者實(shí)施例的某些部分所述的方法。
以上所述僅為本申請的較佳實(shí)施例而已,并不用以限制本申請的保護(hù)范圍,凡在 本申請技術(shù)方案的精神和原則之內(nèi),所做的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本申請保護(hù)的范圍之內(nèi)。