欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

一種測(cè)試用的壓力生成方法及裝置的制作方法

文檔序號(hào):6430917閱讀:159來(lái)源:國(guó)知局
專利名稱:一種測(cè)試用的壓力生成方法及裝置的制作方法
技術(shù)領(lǐng)域
本申請(qǐng)涉及服務(wù)端性能測(cè)試的技術(shù)領(lǐng)域,特別是涉及一種測(cè)試用的壓力生成方法,以及,一種測(cè)試用的壓力生成裝置。
背景技術(shù)
性能測(cè)試是指,通過(guò)生成大量并發(fā)和高頻率的請(qǐng)求,發(fā)送給服務(wù)端處理,以使服務(wù)器的系統(tǒng)資源處于高壓、高飽和狀態(tài),從而判斷該系統(tǒng)的穩(wěn)定性和處理能力,并產(chǎn)生數(shù)據(jù)以供分析。服務(wù)端是一種以接口或協(xié)議的形式對(duì)外提供服務(wù)的系統(tǒng)或裝置,比如,HTTP服務(wù)器 HTTPD, Nginx,或如,數(shù)據(jù)庫(kù)服務(wù)器 Oracle, Couchdb, Redis 等。服務(wù)端的性能測(cè)試是指,通過(guò)壓力生成裝置產(chǎn)生大量高并發(fā)高頻率的訪問(wèn)請(qǐng)求對(duì)服務(wù)端進(jìn)行訪問(wèn),讓服務(wù)端在長(zhǎng)時(shí)間高負(fù)載情況下運(yùn)行,檢查系統(tǒng)運(yùn)行正確性、穩(wěn)定性以及系統(tǒng)資源消耗的測(cè)試方法。其區(qū)別于UI性能測(cè)試、客戶端性能測(cè)試等。服務(wù)端的性能測(cè)試一個(gè)重要的緯度就是被測(cè)試服務(wù)器能夠支持最高的并發(fā)訪問(wèn)數(shù),即在同一個(gè)時(shí)間點(diǎn)上,大量的請(qǐng)求同時(shí)到達(dá),此時(shí)服務(wù)端處理這些請(qǐng)求的能力,具體可以表現(xiàn)為處理速度,響應(yīng)時(shí)間以及出錯(cuò)率。假設(shè)被測(cè)試服務(wù)端比較慢,但足夠穩(wěn)定,那么理論上的測(cè)試結(jié)果應(yīng)該是,處理速度不夠快導(dǎo)致高并發(fā)請(qǐng)求沒(méi)有馬上都得到反饋,而是每個(gè)請(qǐng)求陸續(xù)收到應(yīng)答包,并且導(dǎo)致每個(gè)請(qǐng)求的響應(yīng)時(shí)間長(zhǎng)短不一,但出錯(cuò)率很低或者為零。以上結(jié)果是通過(guò)一個(gè)性能測(cè)試系統(tǒng)來(lái)執(zhí)行測(cè)試所得到的結(jié)果,因此這個(gè)性能測(cè)試系統(tǒng)必須能夠在理論上同一時(shí)間點(diǎn)發(fā)出大量請(qǐng)求,以形成高并發(fā)的壓力。然而現(xiàn)有技術(shù)中的性能測(cè)試系統(tǒng)存在如下問(wèn)題第一,現(xiàn)有的性能測(cè)試通常采用單進(jìn)程單線程方式,或單進(jìn)程多線程方式,生成的并發(fā)要么不是真正的并發(fā),要么效率很低無(wú)法生成很高的并發(fā),比如I、單進(jìn)程單線程這種壓力生成模型都是通過(guò)在一個(gè)線程中,通過(guò)循環(huán)多次建立起多個(gè)測(cè)試系統(tǒng)和被測(cè)試服務(wù)端的socket連接,把這些連接放到一個(gè)數(shù)組中,再遍歷這個(gè)數(shù)組,每次得到一個(gè)socket后,對(duì)這個(gè)socket發(fā)送業(yè)務(wù)請(qǐng)求。這種模型產(chǎn)生的壓力在一個(gè)時(shí)間點(diǎn)上其實(shí)只有一個(gè)并發(fā),因?yàn)樗膕ocket建立以及請(qǐng)求的發(fā)送都是順序的,所以不是真正意義上的高并發(fā)壓力生成模型。2、單進(jìn)程多線程這種壓力生成模型是在一個(gè)進(jìn)程中生成多個(gè)子線程,每個(gè)子線程執(zhí)行建立socket然后發(fā)送業(yè)務(wù)請(qǐng)求,理論上這些子線程是并發(fā)生成的請(qǐng)求,但由于壓力的生成是在一個(gè)進(jìn)程內(nèi)完成的,所以無(wú)法生成很高的并發(fā)。因此,目前需要本領(lǐng)域技術(shù)人員解決的一個(gè)技術(shù)問(wèn)題就是,如何創(chuàng)造性地提出一種測(cè)試用的壓力生成機(jī)制,用以形成真正的高并發(fā)的壓力,為服務(wù)端性能測(cè)試提供高并發(fā)高頻率的訪問(wèn)請(qǐng)求
發(fā)明內(nèi)容
本申請(qǐng)所要解決的技術(shù)問(wèn)題是提供一種測(cè)試用的壓力生成方法,用以形成真正的高并發(fā)的壓力,為服務(wù)端性能測(cè)試提供高并發(fā)高頻率的訪問(wèn)請(qǐng)求。本申請(qǐng)還提供了一種測(cè)試用的壓力生成裝置,用以保證上述方法在實(shí)際中的應(yīng)用及實(shí)現(xiàn)。為了解決上述問(wèn)題,本申請(qǐng)公開(kāi)了一種測(cè)試用的壓力生成方法,包括獲取測(cè)試參數(shù)信息,所述測(cè)試參數(shù)信息包括測(cè)試需求信息和測(cè)試業(yè)務(wù)邏輯;主進(jìn)程根據(jù)所述測(cè)試需求信息產(chǎn)生相應(yīng)數(shù)量的子進(jìn)程;各子進(jìn)程分別生成指定數(shù)量的子線程;各子線程同時(shí)執(zhí)行所述測(cè)試業(yè)務(wù)邏輯。優(yōu)選的,所述測(cè)試需求信息包括預(yù)設(shè)的并發(fā)數(shù)NUM和預(yù)先配置的子進(jìn)程所含子線程數(shù)m,所述主進(jìn)程根據(jù)所述測(cè)試需求信息產(chǎn)生相應(yīng)數(shù)量的子進(jìn)程的步驟包括主進(jìn)程根據(jù)所述預(yù)設(shè)的并發(fā)數(shù)NUM和預(yù)配置的子進(jìn)程所含子線程數(shù)m,通過(guò)以下公式計(jì)算需要產(chǎn)生的子進(jìn)程數(shù)量η :n = NUM/m ; 判斷η是否為整數(shù),若是,則確定所述子進(jìn)程數(shù)量為η ;若否,則確定所述子進(jìn)程數(shù)量為η+1,并配置所述新增子進(jìn)程中所含子線程數(shù)為NUM/m的余數(shù);主進(jìn)程依據(jù)所述確定的子進(jìn)程數(shù)量,生成相應(yīng)數(shù)量的子進(jìn)程。優(yōu)選的,所述各子進(jìn)程分別生成指定數(shù)量的子線程的步驟為各子進(jìn)程依據(jù)所述預(yù)先配置的子線程數(shù)或主進(jìn)程配置的子線程數(shù),對(duì)應(yīng)生成相應(yīng)數(shù)量的子線程。優(yōu)選的,所述測(cè)試業(yè)務(wù)邏輯中包括測(cè)試業(yè)務(wù)邏輯函數(shù),所述測(cè)試業(yè)務(wù)邏輯函數(shù)包括初始化init函數(shù),執(zhí)行act函數(shù)和結(jié)束end函數(shù);所述子線程通過(guò)以下子步驟執(zhí)行所述測(cè)試業(yè)務(wù)邏輯執(zhí)行init函數(shù),完成當(dāng)前子線程的初始化操作;執(zhí)行act函數(shù),由當(dāng)前子線程循環(huán)產(chǎn)生業(yè)務(wù)請(qǐng)求;在當(dāng)前產(chǎn)生業(yè)務(wù)請(qǐng)求的時(shí)間達(dá)到了預(yù)置的業(yè)務(wù)執(zhí)行時(shí)長(zhǎng),或者,當(dāng)前產(chǎn)生的業(yè)務(wù)請(qǐng)求達(dá)到了預(yù)置的請(qǐng)求次數(shù)時(shí),則執(zhí)行end函數(shù)結(jié)束當(dāng)前子線程,并通知相應(yīng)的子進(jìn)程當(dāng)前子線程執(zhí)行完畢。優(yōu)選的,所述的方法,還包括主進(jìn)程等待其所產(chǎn)生的每個(gè)子進(jìn)程結(jié)束后,根據(jù)所述子進(jìn)程的運(yùn)行結(jié)果數(shù)據(jù)生成測(cè)試報(bào)告。優(yōu)選的,所述的方法,還包括各子進(jìn)程等待其所生成的每個(gè)子線程結(jié)束后,獲取各子線程的測(cè)試業(yè)務(wù)邏輯的執(zhí)行狀態(tài),并依據(jù)所述執(zhí)行狀態(tài)生成子進(jìn)程的運(yùn)行結(jié)果數(shù)據(jù)。優(yōu)選的,所述主進(jìn)程和子進(jìn)程共享同一內(nèi)存空間,并通過(guò)所述共享內(nèi)存空間進(jìn)行通信。優(yōu)選的,所述子線程位于其所屬子進(jìn)程的私有內(nèi)存空間,子線程之間通過(guò)其所屬子進(jìn)程的私有內(nèi)存空間進(jìn)行通信。本申請(qǐng)實(shí)施例還公開(kāi)了一種測(cè)試用的壓力生成裝置,包括
測(cè)試參數(shù)獲取模塊,用于獲取測(cè)試參數(shù)信息,所述測(cè)試參數(shù)信息包括測(cè)試需求信息和測(cè)試業(yè)務(wù)邏輯; 主進(jìn)程處理模塊,用于由主進(jìn)程根據(jù)所述測(cè)試需求信息產(chǎn)生相應(yīng)數(shù)量的子進(jìn)程;子進(jìn)程處理模塊,用于由各子進(jìn)程分別生成指定數(shù)量的子線程;子線程處理模塊,用于由各子線程同時(shí)執(zhí)行所述測(cè)試業(yè)務(wù)邏輯。優(yōu)選的,所述的裝置,還包括測(cè)試報(bào)告生成模塊,用于由主進(jìn)程等待其所產(chǎn)生的每個(gè)子進(jìn)程結(jié)束后,根據(jù)所述子進(jìn)程的運(yùn)行結(jié)果數(shù)據(jù)生成測(cè)試報(bào)告。與現(xiàn)有技術(shù)相比,本申請(qǐng)具有以下優(yōu)點(diǎn)首先,本申請(qǐng)?jiān)跍y(cè)試時(shí)使用多進(jìn)程多線程的壓力生成機(jī)制,可以利用多個(gè)進(jìn)程的資源,在每個(gè)進(jìn)程內(nèi)部再生成大量的線程,從而能為服務(wù)端性能測(cè)試提供高并發(fā)高頻率的訪問(wèn)請(qǐng)求,實(shí)現(xiàn)真正的高并發(fā)策略。其次,現(xiàn)有的性能測(cè)試機(jī)制將并發(fā)的生成和壓力業(yè)務(wù)邏輯的實(shí)現(xiàn)綁定在一起,導(dǎo)致用戶必須要負(fù)責(zé)實(shí)現(xiàn)高并發(fā)的代碼,也要實(shí)現(xiàn)業(yè)務(wù)邏輯的代碼,增加了工作量和學(xué)習(xí)成本。而本申請(qǐng)將高并發(fā)生成的代碼抽象出來(lái),成為一個(gè)獨(dú)立的模型。用戶僅需通過(guò)幾個(gè)函數(shù)指針,將實(shí)現(xiàn)的業(yè)務(wù)邏輯提交至本模型,本模型就可以將這些業(yè)務(wù)邏輯代碼變成高并發(fā)的請(qǐng)求,實(shí)現(xiàn)壓力的生成。在實(shí)際應(yīng)用中,本申請(qǐng)可以使用戶不必關(guān)注并發(fā)壓力的生成邏輯,而只需關(guān)注如何實(shí)現(xiàn)業(yè)務(wù)邏輯,大大簡(jiǎn)化了用戶的使用成本。最后,基于本申請(qǐng)可以實(shí)現(xiàn)一種通用的服務(wù)端性能測(cè)試機(jī)制,該機(jī)制無(wú)需關(guān)心業(yè)務(wù)的實(shí)現(xiàn)細(xì)節(jié),可以將測(cè)試系統(tǒng)與被測(cè)試業(yè)務(wù)解藕,使得用戶不必每次做一個(gè)性能測(cè)試就要實(shí)現(xiàn)一套性能測(cè)試系統(tǒng),而僅需關(guān)注于業(yè)務(wù)的實(shí)現(xiàn)和場(chǎng)景的設(shè)計(jì),并發(fā)壓力的生成則由這套通用的測(cè)試機(jī)制來(lái)完成,從而提高了代碼重利用率。


圖I是本申請(qǐng)的一種測(cè)試用的壓力生成方法實(shí)施例一的流程圖;圖2是本申請(qǐng)中所指主進(jìn)程、子進(jìn)程和子線程的關(guān)系示意圖;圖3是本申請(qǐng)中所指進(jìn)程內(nèi)存空間的示意4是本申請(qǐng)的一種測(cè)試用的壓力生成方法實(shí)施例二的流程圖;圖5是本申請(qǐng)的一種測(cè)試用的壓力生成裝置實(shí)施例的結(jié)構(gòu)框圖。
具體實(shí)施例方式為使本申請(qǐng)的上述目的、特征和優(yōu)點(diǎn)能夠更加明顯易懂,下面結(jié)合附圖和具體實(shí)施方式
對(duì)本申請(qǐng)作進(jìn)一步詳細(xì)的說(shuō)明。本申請(qǐng)的主要思想包括使用多進(jìn)程多線程的機(jī)制,利用多個(gè)進(jìn)程的資源,在每個(gè)進(jìn)程內(nèi)部生成大量的線程,從而實(shí)現(xiàn)真正的高并發(fā)。參考圖1,其示出了本申請(qǐng)的一種測(cè)試用的壓力生成方法實(shí)施例一的步驟流程圖,具體可以包括如下步驟步驟101、獲取測(cè)試參數(shù)信息,所述測(cè)試參數(shù)信息包括測(cè)試需求信息和測(cè)試業(yè)務(wù)邏輯;
在具體實(shí)現(xiàn)中,所述測(cè)試參數(shù)信息可以為用戶(如測(cè)試人員)輸入的測(cè)試參數(shù)信息,這些信息可以由主進(jìn)程獲取。具體而言,所述測(cè)試需求信息可以包括,預(yù)設(shè)的并發(fā)數(shù),預(yù)先配置的子進(jìn)程所含子線程數(shù)等;所述測(cè)試業(yè)務(wù)邏輯中可以包括每個(gè)虛擬用戶執(zhí)行的時(shí)長(zhǎng)或者次數(shù),測(cè)試業(yè)務(wù)邏輯函數(shù)和函數(shù)指針的映射等信息。需要說(shuō)明的是,所述虛擬用戶是指每一個(gè)單獨(dú)的壓力源。在本申請(qǐng)實(shí)施例中,一個(gè)子進(jìn)程可以看作一組壓力源,一個(gè)子線程也可以看作一個(gè)壓力源,也就是說(shuō),一個(gè)虛擬用戶可以理解為一個(gè)子線程。步驟102、主進(jìn)程根據(jù)所述測(cè)試需求信息產(chǎn)生相應(yīng)數(shù)量的子進(jìn)程;在本申請(qǐng)的一種優(yōu)選實(shí)施例中,所述測(cè)試需求信息可以包括預(yù)設(shè)的并發(fā)數(shù)NUM和預(yù)先配置的子進(jìn)程所含子線程數(shù)m,在這種情況下,所述步驟102具體可以包括如下子步驟子步驟S11、主進(jìn)程根據(jù)所述預(yù)設(shè)的并發(fā)數(shù)NUM和預(yù)配置的子進(jìn)程所含子線程數(shù)m,通過(guò)以下公式計(jì)算需要產(chǎn)生的子進(jìn)程數(shù)量η :n = NUM/m ;子步驟S 12、判斷η是否為整數(shù),若是,則執(zhí)行子步驟S 13;否則,執(zhí)行子步驟S14 ;子步驟S13、確定所述子進(jìn)程數(shù)量為η ;子步驟S14、確定所述子進(jìn)程數(shù)量為η+1,并配置所述新增子進(jìn)程中所含子線程數(shù)為NUM/m的余數(shù);子步驟S15、主進(jìn)程依據(jù)所述確定的子進(jìn)程數(shù)量,生成相應(yīng)數(shù)量的子進(jìn)程。例如,假設(shè)預(yù)設(shè)的并發(fā)數(shù)NUM = 2020,預(yù)先配置的子進(jìn)程所含子線程數(shù)m = 50,通過(guò)NUM/m取整確定子進(jìn)程數(shù)量η = 40,由于NUM/m還有余數(shù)20,于是可新增一個(gè)子進(jìn)程,并配置所述新增的子進(jìn)程中包含20個(gè)子線程。在具體實(shí)現(xiàn)中,主進(jìn)程可以通過(guò)執(zhí)行fork函數(shù)循環(huán)生成子進(jìn)程,并在每次循環(huán)的時(shí)候,分配給每個(gè)子進(jìn)程一個(gè)序號(hào)。步驟103、各子進(jìn)程分別生成指定數(shù)量的子線程;由于子進(jìn)程在生成的時(shí)候得到了自己所要生成的線程數(shù),所以在具體實(shí)現(xiàn)中,各子進(jìn)程會(huì)依據(jù)所述預(yù)先配置的子線程數(shù)或主進(jìn)程配置的子線程數(shù),對(duì)應(yīng)生成相應(yīng)數(shù)量的子線程。如參考上例,有40個(gè)子進(jìn)程會(huì)各自生成50個(gè)子線程,新增的I個(gè)子進(jìn)程會(huì)生成20個(gè)子線程。步驟104、各子線程同時(shí)執(zhí)行所述測(cè)試業(yè)務(wù)邏輯。在本申請(qǐng)的一種優(yōu)選實(shí)施例中,所述測(cè)試業(yè)務(wù)邏輯中包括測(cè)試業(yè)務(wù)邏輯函數(shù),所述測(cè)試業(yè)務(wù)邏輯函數(shù)包括初始化init函數(shù),執(zhí)行act函數(shù)和結(jié)束end函數(shù);所述子線程通過(guò)以下子步驟執(zhí)行所述測(cè)試業(yè)務(wù)邏輯子步驟S21、執(zhí)行init函數(shù),完成當(dāng)前子線程的初始化操作;子步驟S22、執(zhí)行act函數(shù),由當(dāng)前子線程循環(huán)產(chǎn)生業(yè)務(wù)請(qǐng)求;子步驟S23、在當(dāng)前產(chǎn)生業(yè)務(wù)請(qǐng)求的時(shí)間達(dá)到了預(yù)置的業(yè)務(wù)執(zhí)行時(shí)長(zhǎng),或者,當(dāng)前產(chǎn)生的業(yè)務(wù)請(qǐng)求達(dá)到了預(yù)置的請(qǐng)求次數(shù)時(shí),則執(zhí)行end函數(shù)結(jié)束當(dāng)前子線程,并通知相應(yīng)的子進(jìn)程當(dāng)前子線程執(zhí)行完畢。參考圖2所示的主進(jìn)程、子進(jìn)程和子線程的關(guān)系示意圖,應(yīng)用本申請(qǐng)實(shí)施例,主進(jìn)程生成11個(gè)子進(jìn)程0 1,0 2,0 3,.. . ,CPn ;每個(gè)子進(jìn)程又各自生成相應(yīng)數(shù)量的子線程,如子進(jìn)程CPl又生成m個(gè)子線程CP1T1,CP1T2,. . .,CPlTm,在執(zhí)行服務(wù)器端性能測(cè)試時(shí),通過(guò)觸發(fā)主進(jìn)程,即可利用多個(gè)子進(jìn)程下各個(gè)子線程的資源,每個(gè)子線程代表一個(gè)并發(fā),也就是虛擬用戶,假設(shè)每個(gè)子進(jìn)程都生成了 m個(gè)子線程,那么本實(shí)施例中生成的并發(fā)數(shù)為m*n。在每個(gè)子線程內(nèi),都會(huì)同時(shí)執(zhí)行性能測(cè)試業(yè)務(wù)邏輯的函數(shù),從而提供高并發(fā)高頻率的訪問(wèn)請(qǐng)求,實(shí)現(xiàn)真正的高并發(fā)策略。在本申請(qǐng)實(shí)施例中,所述主進(jìn)程和子進(jìn)程共享同一內(nèi)存空間,通過(guò)所述內(nèi)存空間進(jìn)行通信;所述子線程位于其所屬子進(jìn)程的私有內(nèi)存空間,子線程之間通過(guò)其所屬子進(jìn)程的私有內(nèi)存空間進(jìn)行通信。具體可以參考圖3所示的進(jìn)程內(nèi)存空間的示意圖,在具體實(shí)現(xiàn)中,主進(jìn)程會(huì)開(kāi)辟一塊進(jìn)程共享的內(nèi)存空間,用全局變量mbp來(lái)保存指向這個(gè)空間的指針,這塊內(nèi)存空間主要用來(lái)保存主進(jìn)程的信息以及每個(gè)子進(jìn)程的信息。在本申請(qǐng)的一種優(yōu)選實(shí)施例中,所述主進(jìn)程的信息可以保存在一塊由bench指針指向的結(jié)構(gòu)體中,而每個(gè)子進(jìn)程的信息可以保存在一塊由bench_child指針指向的結(jié)構(gòu)體中。主進(jìn)程通過(guò)mbp計(jì)算某個(gè)子進(jìn)程結(jié)構(gòu)體bench_child的偏移量,就可以得到任意一個(gè)子進(jìn)程結(jié)構(gòu)體的信息,這也就完成了主進(jìn)程與子進(jìn)程基于所述共享內(nèi)存空間的通信。在具體實(shí)現(xiàn)中,子進(jìn)程在主進(jìn)程執(zhí)行fork O函數(shù)(生成子進(jìn)程)時(shí),獲得主進(jìn)程的一份內(nèi)存?zhèn)浞荩瑥亩玫皆撟舆M(jìn)程所要生成的子線程數(shù),并得到主進(jìn)程生成的共享內(nèi)存空間的指針mbp。如前所述,主進(jìn)程可以通過(guò)循環(huán)來(lái)生成子進(jìn)程的,每次循環(huán)的時(shí)候給每個(gè)子進(jìn)程分配一個(gè)序號(hào),子進(jìn)程在被生成后可以繼承主進(jìn)程的變量,從而可以得到這個(gè)序號(hào)。子進(jìn)程通過(guò)mbp指針和這個(gè)序號(hào),再通過(guò)計(jì)算偏移量,就可以找到自己的bench_child結(jié)構(gòu)體在進(jìn)程共享內(nèi)存中的位置,找到后就可以將其初始化。為使本領(lǐng)域技術(shù)人員更好地理解本申請(qǐng),以下對(duì)所述共享內(nèi)存空間中的數(shù)據(jù)結(jié)構(gòu)進(jìn)一步說(shuō)明。( 一 ) bench 結(jié)構(gòu)體I、bench結(jié)構(gòu)體位于進(jìn)程共享內(nèi)存空間;2、bench結(jié)構(gòu)體只有一個(gè),由主進(jìn)程生成;3、主進(jìn)程在執(zhí)行時(shí)讀取測(cè)試參數(shù)信息,將這些參數(shù)信息保存到bench結(jié)構(gòu)體中;4、bench結(jié)構(gòu)體中包括param元素,該元素是一個(gè)void* (表示聲明一個(gè)指針類型變量,該指針為空,不指向任何類型數(shù)據(jù)。)類型的指針,用途是在每個(gè)子進(jìn)程中傳遞全局的數(shù)據(jù),每個(gè)子進(jìn)程通過(guò)該指針和其它子進(jìn)程進(jìn)行通訊,例如,某個(gè)子進(jìn)程自己開(kāi)辟一塊進(jìn)程共享內(nèi)存,把指針傳給param參數(shù),其他子進(jìn)程通過(guò)bench拿到param的值后,就可以對(duì)這個(gè)內(nèi)存進(jìn)行讀寫操作了。5、bench結(jié)構(gòu)體中包括script元素,該元素指向script結(jié)構(gòu)體,所述script結(jié)構(gòu)體中有若干個(gè)函數(shù)指針,指向的是測(cè)試業(yè)務(wù)邏輯函數(shù),在測(cè)試執(zhí)行時(shí),每個(gè)子線程都可以通過(guò)bench結(jié)構(gòu)體得到script的每個(gè)元素,然后執(zhí)行其中的方法以實(shí)現(xiàn)測(cè)試業(yè)務(wù)邏輯。主進(jìn)程在加載時(shí),會(huì)獲取相應(yīng)的測(cè)試業(yè)務(wù)邏輯函數(shù),并映射到所述script結(jié)構(gòu)體。
( 二)bench_child 結(jié)構(gòu)體I、bench_child結(jié)構(gòu)體位于進(jìn)程共享內(nèi)存空間;2、bench_child結(jié)構(gòu)體的數(shù)量與子進(jìn)程的數(shù)量對(duì)應(yīng),即每個(gè)子進(jìn)程都擁有一個(gè)屬于自己的bench_child,該結(jié)構(gòu)體由擁用它的子進(jìn)程生成;3、子進(jìn)程在生成后將子進(jìn)程的信息寫入到bench_child結(jié)構(gòu)體中;4、每個(gè)bench_chiId結(jié)構(gòu)體代表一組并發(fā)(一組壓力源),該結(jié)構(gòu)體擁有vuser (虛擬用戶)的鏈表指針,通過(guò)該鏈表指針能夠得到該子進(jìn)程下面的每一個(gè)子線程的vuser數(shù)據(jù)結(jié)構(gòu);5、每個(gè)子進(jìn)程的子線程執(zhí)行完測(cè)試后通知當(dāng)前子進(jìn)程,這個(gè)通知機(jī)制可以通過(guò)bench_child結(jié)構(gòu)體中的互斥鎖mutex和條件變量cond完成。所述bench_child結(jié)構(gòu)體中有一個(gè)count元素,該元素可以理解為一個(gè)計(jì)數(shù)器,代表已完成測(cè)試的子線程的數(shù)量,如果該元素等于該子進(jìn)程所包含的子線程數(shù),則代表該子進(jìn)程的所有子線程已經(jīng)完成測(cè)試任務(wù),子進(jìn)程可以準(zhǔn)備退出了。6、bench_child結(jié)構(gòu)體中包括group元素,該元素代表該子進(jìn)程在父進(jìn)程生成時(shí)的序號(hào)。(三)vuser(虛擬用戶)結(jié)構(gòu)體Uvuser結(jié)構(gòu)體位于每個(gè)子進(jìn)程的私有空間;2,vuser結(jié)構(gòu)體代表虛擬用戶,或者代表一個(gè)并發(fā)。也就是說(shuō),測(cè)試需要多少個(gè)并發(fā)就會(huì)有多少個(gè)vuser,每個(gè)子進(jìn)程的每一個(gè)子線程都會(huì)擁有一個(gè)vuser結(jié)構(gòu)體。每個(gè)子線程在執(zhí)行測(cè)試業(yè)務(wù)邏輯函數(shù)時(shí),都會(huì)傳遞該結(jié)構(gòu)體指針給這些函數(shù),所以用戶提供的測(cè)試業(yè)務(wù)邏輯代碼可以讀寫該結(jié)構(gòu)體,從而實(shí)現(xiàn)壓力業(yè)務(wù)邏輯和壓力測(cè)試邏輯的交互;3、子線程在生成后產(chǎn)生vuser結(jié)構(gòu)體,并且保存到所屬子進(jìn)程bench_child結(jié)構(gòu)體的vuser鏈表之后;4、vuser結(jié)構(gòu)體中包括統(tǒng)計(jì)事件的指針,用以在測(cè)試結(jié)束后統(tǒng)計(jì)每一個(gè)虛擬用戶的執(zhí)行狀態(tài),從而生成子進(jìn)程運(yùn)行結(jié)果數(shù)據(jù),以用于生成最終的測(cè)試報(bào)告。子進(jìn)程可以通過(guò)bench_child的vuser元素得到其下每個(gè)子線程的vuser信息,所以可以統(tǒng)計(jì)這些數(shù)據(jù);5、vuser結(jié)構(gòu)體中包括id元素,該元素代表該子線程在所屬子進(jìn)程生成時(shí)的序號(hào),表示所屬子線程的所有子線程的生成次序;6、vuser結(jié)構(gòu)體中包括group元素,該元素和bench_child的group元素相同。通過(guò)組合group和id兩個(gè)元素,就可以得到該子進(jìn)程或者vuser的唯一值,這個(gè)值可以用于區(qū)分本虛擬用戶和其他虛擬用戶的不同,從而可以實(shí)現(xiàn)每個(gè)虛擬用戶的差異化執(zhí)行。比如,用不同的用戶帳號(hào)實(shí)現(xiàn)登陸的測(cè)試場(chǎng)景要求賬號(hào)不同,那么可以根據(jù)這兩個(gè)元素的組合找到參數(shù)列表中屬于該vuser的測(cè)試賬號(hào),這樣就可以實(shí)現(xiàn)相應(yīng)測(cè)試場(chǎng)景的測(cè)試;7、vuser結(jié)構(gòu)體中包括verb元素,該元素是一個(gè)void*類型的指針,每個(gè)虛擬用戶在執(zhí)行時(shí)可以將要保留的數(shù)據(jù)分配到堆中,并將堆內(nèi)存的指針保存到verb元素。之后其他的函數(shù)或者下一次執(zhí)行本函數(shù)時(shí),就可以通過(guò)vuser結(jié)構(gòu)體的verb元素得到上次的執(zhí)行結(jié)果。例如,通過(guò)用init函數(shù)執(zhí)行完登陸后,保存得到的cookie等狀態(tài)信息,以供act函數(shù)構(gòu)造以登陸狀態(tài)的請(qǐng)求使用。這就實(shí)現(xiàn)了用戶提供的測(cè)試業(yè)務(wù)邏輯函數(shù)之間的相互通訊機(jī)制。
(四)script結(jié)構(gòu)體I、script結(jié)構(gòu)體位于進(jìn)程共享內(nèi)存空間;2、script結(jié)構(gòu)體只有一個(gè),由主進(jìn)程生成;3、主進(jìn)程在加載時(shí),將用戶實(shí)現(xiàn)的測(cè)試業(yè)務(wù)邏輯函數(shù)映射到script結(jié)構(gòu)體的各個(gè)元素,以供每個(gè)子進(jìn)程的每一個(gè)子線程訪問(wèn);4、該結(jié)構(gòu)體的三個(gè)元素init, act, end都是函數(shù)指針,類型是void*(*fun)(void*);分別映射到用戶實(shí)現(xiàn)的三個(gè)測(cè)試業(yè)務(wù)邏輯函數(shù)。執(zhí)行時(shí)會(huì)將這些指針函數(shù)的線程的vuser結(jié)構(gòu)體指針傳入;5、script中包括init元素,該元素用來(lái)保存測(cè)試業(yè)務(wù)邏輯的初始化函數(shù)指針。性能測(cè)試的初始化函數(shù)一般用來(lái)完成資源的初始化操作,或者完成迭代測(cè)試執(zhí)行的前置步驟,比如注冊(cè),登陸等操作,只執(zhí)行一次,并通過(guò)每個(gè)虛擬用戶的vuser結(jié)構(gòu)體的verb指針,將得到的信息傳遞給之后執(zhí)行的業(yè)務(wù)邏輯函數(shù),比如act和end ;6、script中包括act元素,該元素用來(lái)保存測(cè)試業(yè)務(wù)邏輯不斷執(zhí)行的請(qǐng)求函數(shù)。在測(cè)試執(zhí)行時(shí)會(huì)不停的產(chǎn)生壓力,就是通過(guò)一個(gè)循環(huán)代碼模塊來(lái)控制該函數(shù)執(zhí)行的,循環(huán)條件可以是按次數(shù)執(zhí)行,也可以是按時(shí)間執(zhí)行。當(dāng)然,上述數(shù)據(jù)結(jié)構(gòu)的定義僅僅用作示例,本領(lǐng)域技術(shù)人員根據(jù)實(shí)際情況任意增加或減少元素均是可行的,例如,可以在bench_chiId結(jié)構(gòu)體中設(shè)置指向主進(jìn)程結(jié)構(gòu)體bench的指針元素b,通過(guò)該元素可以快速訪問(wèn)主進(jìn)程結(jié)構(gòu)體bench ;或者,還可以在vuser結(jié)構(gòu)體中設(shè)置指向子進(jìn)程結(jié)構(gòu)體bench_child的指針元素b,通過(guò)該元素可以快速訪問(wèn)子進(jìn)程結(jié)構(gòu)體bench_child,以使子線程快速訪問(wèn)子進(jìn)程。參考圖4,示出了本申請(qǐng)的一種測(cè)試用的壓力生成方法實(shí)施例2的步驟流程圖,具體可以包括如下步驟步驟401、獲取測(cè)試參數(shù)信息,所述測(cè)試參數(shù)信息包括測(cè)試需求信息和測(cè)試業(yè)務(wù)邏輯;步驟402、主進(jìn)程根據(jù)所述測(cè)試需求信息產(chǎn)生相應(yīng)數(shù)量的子進(jìn)程;步驟403、各子進(jìn)程分別生成指定數(shù)量的子線程;步驟404、各子線程同時(shí)執(zhí)行所述測(cè)試業(yè)務(wù)邏輯;步驟405、各子進(jìn)程等待其所生成的每個(gè)子線程結(jié)束后,獲取各子線程的測(cè)試業(yè)務(wù)邏輯的執(zhí)行狀態(tài),并依據(jù)所述執(zhí)行狀態(tài)生成子進(jìn)程的運(yùn)行結(jié)果數(shù)據(jù);步驟406、主進(jìn)程等待其所產(chǎn)生的每個(gè)子進(jìn)程結(jié)束后,根據(jù)所述子進(jìn)程的運(yùn)行結(jié)果數(shù)據(jù)生成測(cè)試報(bào)告。為使本領(lǐng)域技術(shù)人員更好地理解本申請(qǐng),以下通過(guò)一些具體實(shí)例進(jìn)一步說(shuō)明用于性能測(cè)試的壓力生成過(guò)程中主進(jìn)程、子進(jìn)程和子線程所執(zhí)行的操作。一、主進(jìn)程I、獲取用戶輸入的測(cè)試參數(shù)信息,完成測(cè)試業(yè)務(wù)邏輯函數(shù)的映射,并將這些信息保存到bench結(jié)構(gòu)體中。2JARdispatchO函數(shù),計(jì)算子進(jìn)程數(shù)量,并且分配每個(gè)子進(jìn)程需要產(chǎn)生的并發(fā)子線程數(shù)。作為本申請(qǐng)實(shí)施例具體應(yīng)用的一種示例,可以通過(guò)并發(fā)子線程總數(shù)NUM和每個(gè)子進(jìn)程的最大子線程數(shù)(假設(shè)為m)相除并取整,得到n-Ι個(gè)子進(jìn)程,每個(gè)子進(jìn)程有m個(gè)子線程;再判斷NUM和m相除是否由余數(shù),如果有,則再生成一個(gè)子進(jìn)程,該子進(jìn)程的線程數(shù)是NUM除以m的余數(shù)。3、通過(guò)forkO函數(shù)生成子進(jìn)程后,主進(jìn)程等待每個(gè)子進(jìn)程的結(jié)束。例如,在Linux操作系統(tǒng)下可以通過(guò)wait O方法等待某個(gè)子進(jìn)程結(jié)束,然后計(jì)數(shù)器加一,繼續(xù)等待,直到計(jì)數(shù)器和子進(jìn)程總數(shù)相等為止。4、子進(jìn)程全部結(jié)束后,主進(jìn)程在通過(guò)bench結(jié)構(gòu)體以及每個(gè)子進(jìn)程的bench_child結(jié)構(gòu)體中提供的子進(jìn)程運(yùn)行信息分析出數(shù)據(jù),生成測(cè)試報(bào)告。二、子進(jìn)程I、以子進(jìn)程CPl為例,在子進(jìn)程生成前,先初始化該子進(jìn)程的bench_child結(jié)構(gòu)體
及其元素。比如初始化互斥鎖pthread_mutex_init(&bench_child_ > mutex),初始化條件變量 pthread_cond_init (&bench_child_ > cond),子線程計(jì)數(shù)器清零 i = O 等。2、生成多個(gè)子線程,之后通過(guò)條件變量等到子線程結(jié)束。例如,通過(guò)pthread_create O函數(shù)生成一個(gè)子線程,通過(guò)pthread庫(kù)的pthread_cond_wait函數(shù)等待條件變量的信號(hào)(可以理解為當(dāng)前子線程執(zhí)行完成的信號(hào)),得到信號(hào)后子線程計(jì)數(shù)器加1,然后判斷子線程計(jì)數(shù)器和子線程總數(shù)是否相等,如果相等則表明子線程都執(zhí)行完成,否則繼續(xù)等待。應(yīng)用本例的優(yōu)點(diǎn)是,使用條件變量比使用sleep或者空循環(huán)策略要有更高的性能,占用極少的Cpu使用率。三、子線程I、子線程生成后,先獲得bench結(jié)構(gòu)體指向的script結(jié)構(gòu)體,得到其中的init,act和end三個(gè)函數(shù)指針;2、執(zhí)行init函數(shù),并將該子進(jìn)程的vuser結(jié)構(gòu)體指針傳遞給它。執(zhí)行一次;3、執(zhí)行act函數(shù),并將該子進(jìn)程的vuser結(jié)構(gòu)體指針傳遞給它,通過(guò)一個(gè)循環(huán)模塊控制執(zhí)行次數(shù),循環(huán)條件可以是用戶指定的執(zhí)行次數(shù)或者用戶指定的執(zhí)行時(shí)長(zhǎng)。在具體實(shí)現(xiàn)中,可以通過(guò)一個(gè)計(jì)數(shù)器判斷是否到達(dá)用戶指定的執(zhí)行次數(shù),或者,通過(guò)計(jì)時(shí)器判斷是否到達(dá)用戶指定的執(zhí)行時(shí)長(zhǎng);若否,則記錄act函數(shù)當(dāng)前的執(zhí)行次數(shù)或執(zhí)行時(shí)長(zhǎng),若已到達(dá)用戶指定的執(zhí)行次數(shù)或者用戶指定的執(zhí)行時(shí)長(zhǎng);則執(zhí)行下一步。4、執(zhí)行end函數(shù),并將該子進(jìn)程的vuser結(jié)構(gòu)體指針傳遞給它。5、init, act, end三個(gè)測(cè)試業(yè)務(wù)邏輯函數(shù)執(zhí)行完畢后,通過(guò)vuser的b指針得到所屬子進(jìn)程的bench_child結(jié)構(gòu)體,對(duì)該結(jié)構(gòu)體的count計(jì)數(shù)器加I (即子線程加I),通過(guò)互斥鎖加鎖保護(hù)該變量,防止其他子線程也在對(duì)其進(jìn)行操作。在當(dāng)前子線程執(zhí)行完成后,將互斥鎖解鎖,向條件變量發(fā)送信號(hào)以通知子進(jìn)程當(dāng)前子線程已經(jīng)執(zhí)行完畢。需要說(shuō)明的是,對(duì)于前述方法實(shí)施例,為了簡(jiǎn)單描述,故將其都表述為一系列的動(dòng)作組合,但是本領(lǐng)域技術(shù)人員應(yīng)該知悉,本申請(qǐng)并不受所描述的動(dòng)作順序的限制,因?yàn)橐罁?jù)本申請(qǐng),某些步驟可以采用其他順序或者同時(shí)進(jìn)行。其次,本領(lǐng)域技術(shù)人員也應(yīng)該知悉,說(shuō)明書中所描述的實(shí)施例均屬于優(yōu)選實(shí)施例,所涉及的動(dòng)作和模塊并不一定是本申請(qǐng)所必須的。
參考圖5,示出了本申請(qǐng)的一種測(cè)試用的壓力生成裝置實(shí)施例的結(jié)構(gòu)框圖,具體可以包括如下模塊測(cè)試參數(shù)獲取模塊501,用于獲取測(cè)試參數(shù)信息,所述測(cè)試參數(shù)信息包括測(cè)試需求信息和測(cè)試業(yè)務(wù)邏輯;主進(jìn)程處理模塊502,用于由主進(jìn)程根據(jù)所述測(cè)試需求信息產(chǎn)生相應(yīng)數(shù)量的子進(jìn)子進(jìn)程處理模塊503,用于由各子進(jìn)程分別生成指定數(shù)量的子線程;子線程處理模塊504,用于由各子線程同時(shí)執(zhí)行所述測(cè)試業(yè)務(wù)邏輯。在本申請(qǐng)的一種優(yōu)選實(shí)施例中,所述測(cè)試需求信息可以包括預(yù)設(shè)的并發(fā)數(shù)NUM和預(yù)先配置的子進(jìn)程所含子線程數(shù)m,所述主進(jìn)程處理模塊具體可以包括以下子模塊子進(jìn)程數(shù)量計(jì)算子模塊,用于由主進(jìn)程根據(jù)所述預(yù)設(shè)的并發(fā)數(shù)NUM和預(yù)配置的子進(jìn)程所含子線程數(shù)m,通過(guò)以下公式計(jì)算需要產(chǎn)生的子進(jìn)程數(shù)量η n = NUM/m ;子進(jìn)程數(shù)量確定子模塊,用于判斷η是否為整數(shù),若是,則確定所述子進(jìn)程數(shù)量為η ;若否,則確定所述子進(jìn)程數(shù)量為η+1,并配置所述新增子進(jìn)程中所含子線程數(shù)為NUM/m的余數(shù);子進(jìn)程生成子模塊,用于由主進(jìn)程依據(jù)所述確定的子進(jìn)程數(shù)量,生成相應(yīng)數(shù)量的子進(jìn)程。在本申請(qǐng)的一種優(yōu)選實(shí)施例中,所述子進(jìn)程處理模塊具體可以包括如下子模塊第一子線程生成子模塊,用于由各子進(jìn)程依據(jù)所述預(yù)先配置的子線程數(shù),對(duì)應(yīng)生成相應(yīng)數(shù)量的子線程;或者,第二子線程生成子模塊,用于由各子進(jìn)程依據(jù)所述預(yù)先配置的子線程數(shù)或主進(jìn)程配置的子線程數(shù),對(duì)應(yīng)生成相應(yīng)數(shù)量的子線程。在具體實(shí)現(xiàn)中,所述測(cè)試業(yè)務(wù)邏輯中可以包括測(cè)試業(yè)務(wù)邏輯函數(shù),優(yōu)選的是,所述測(cè)試業(yè)務(wù)邏輯函數(shù)可以包括初始化init函數(shù),執(zhí)行act函數(shù)和結(jié)束end函數(shù);在本實(shí)施例中,所述子線程處理模塊具體可以包括如下子模塊初始化操作子模塊,用于執(zhí)行init函數(shù),完成當(dāng)前子線程的初始化操作;業(yè)務(wù)執(zhí)行子模塊,用于執(zhí)行act函數(shù),由當(dāng)前子線程循環(huán)產(chǎn)生業(yè)務(wù)請(qǐng)求;業(yè)務(wù)執(zhí)行條件判斷子模塊,用于在當(dāng)前產(chǎn)生業(yè)務(wù)請(qǐng)求的時(shí)間達(dá)到了預(yù)置的業(yè)務(wù)執(zhí)行時(shí)長(zhǎng),或者,當(dāng)前產(chǎn)生的業(yè)務(wù)請(qǐng)求達(dá)到了預(yù)置的請(qǐng)求次數(shù)時(shí),則調(diào)用結(jié)束子模塊;結(jié)束子模塊,用于執(zhí)行end函數(shù)結(jié)束當(dāng)前子線程,并通知相應(yīng)的子進(jìn)程當(dāng)前子線程執(zhí)行完畢。在實(shí)際中,本申請(qǐng)實(shí)施例還可以包括子進(jìn)程運(yùn)行結(jié)果獲取模塊,用于由各子進(jìn)程等待其所生成的每個(gè)子線程結(jié)束后,獲取各子線程的測(cè)試業(yè)務(wù)邏輯的執(zhí)行狀態(tài),并依據(jù)所述執(zhí)行狀態(tài)生成子進(jìn)程的運(yùn)行結(jié)果數(shù)據(jù)。以及,測(cè)試報(bào)告生成模塊,用于由主進(jìn)程等待其所產(chǎn)生的每個(gè)子進(jìn)程結(jié)束后,根據(jù)所述子進(jìn)程的運(yùn)行結(jié)果數(shù)據(jù)生成測(cè)試報(bào)告。作為實(shí)現(xiàn)本申請(qǐng)實(shí)施例的一種優(yōu)選示例,所述主進(jìn)程和子進(jìn)程可以共享同一內(nèi)存空間,并通過(guò)所述共享內(nèi)存空間進(jìn)行通信。所述子線程位于其所屬子進(jìn)程的私有內(nèi)存空間,子線程之間通過(guò)其所屬子進(jìn)程的私有內(nèi)存空間進(jìn)行通信。在具體實(shí)現(xiàn)中,本申請(qǐng)可以適用于采用Unix、Linux系統(tǒng)以及它們的衍生版本的服務(wù)端的性能測(cè)試系統(tǒng)中,在性能測(cè)試時(shí),壓力生成裝置模擬用戶的某種業(yè)務(wù)操作,并將該操作或請(qǐng)求通過(guò)多進(jìn)程多線程的壓力生成方法變成高并發(fā)高頻率的請(qǐng)求,以達(dá)到讓服務(wù)端 受壓的目的,并且壓力生成裝置生成的壓力是可控的,比如主控程序可以讓每個(gè)壓力執(zhí)行指定時(shí)間、暫停、恢復(fù)、停止、退出等。通過(guò)生成大量并發(fā)和高頻率的請(qǐng)求,發(fā)送給服務(wù)端(以接口或協(xié)議的形式對(duì)外提供服務(wù)的系統(tǒng)或裝置,比如HTTP服務(wù)器HTTPD、Nginx或者數(shù)據(jù)庫(kù)服務(wù)器Oracle、Couchdb、Redis等。)處理,以使服務(wù)器的系統(tǒng)資源處于高壓高飽和狀態(tài),讓服務(wù)端在長(zhǎng)時(shí)間高負(fù)載情況下運(yùn)行,從而檢查系統(tǒng)運(yùn)行正確性、穩(wěn)定性以及系統(tǒng)資源消耗,或判斷該系統(tǒng)的穩(wěn)定性和處理能力,并產(chǎn)生數(shù)據(jù)以供分析。由于本實(shí)施例基本相應(yīng)于前述圖I和圖4所不的方法實(shí)施例,故本實(shí)施例的描述中未詳盡之處,可以參見(jiàn)前述實(shí)施例中的相關(guān)說(shuō)明,在此就不贅述了。需要說(shuō)明的是,本申請(qǐng)裝置實(shí)施例和系統(tǒng)實(shí)施例中所涉及的模塊、子模塊和單元可以為軟件,可以為硬件,也可以為軟件和硬件的組合。本申請(qǐng)可用于眾多通用或?qū)S玫挠?jì)算系統(tǒng)環(huán)境或配置中。例如個(gè)人計(jì)算機(jī)、服務(wù)器計(jì)算機(jī)、手持設(shè)備或便攜式設(shè)備、平板型設(shè)備、多處理器系統(tǒng)、基于微處理器的系統(tǒng)、置頂盒、可編程的消費(fèi)電子設(shè)備、網(wǎng)絡(luò)PC、小型計(jì)算機(jī)、大型計(jì)算機(jī)、包括以上任何系統(tǒng)或設(shè)備的分布式計(jì)算環(huán)境等等。本申請(qǐng)可以在由計(jì)算機(jī)執(zhí)行的計(jì)算機(jī)可執(zhí)行指令的一般上下文中描述,例如程序模塊。一般地,程序模塊包括執(zhí)行特定任務(wù)或?qū)崿F(xiàn)特定抽象數(shù)據(jù)類型的例程、程序、對(duì)象、組件、數(shù)據(jù)結(jié)構(gòu)等等。也可以在分布式計(jì)算環(huán)境中實(shí)踐本申請(qǐng),在這些分布式計(jì)算環(huán)境中,由通過(guò)通信網(wǎng)絡(luò)而被連接的遠(yuǎn)程處理設(shè)備來(lái)執(zhí)行任務(wù)。在分布式計(jì)算環(huán)境中,程序模塊可以位于包括存儲(chǔ)設(shè)備在內(nèi)的本地和遠(yuǎn)程計(jì)算機(jī)存儲(chǔ)介質(zhì)中。最后,還需要說(shuō)明的是,在本文中,諸如第一和第二等之類的關(guān)系術(shù)語(yǔ)僅僅用來(lái)將一個(gè)實(shí)體或者操作與另一個(gè)實(shí)體或操作區(qū)分開(kāi)來(lái),而不一定要求或者暗示這些實(shí)體或操作之間存在任何這種實(shí)際的關(guān)系或者順序。而且,術(shù)語(yǔ)“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過(guò)程、方法、物品或者設(shè)備不僅包括那些要素,而且還包括沒(méi)有明確列出的其他要素,或者是還包括為這種過(guò)程、方法、物品或
者設(shè)備所固有的要素。在沒(méi)有更多限制的情況下,由語(yǔ)句“包括一個(gè)......”限定的要素,
并不排除在包括所述要素的過(guò)程、方法、物品或者設(shè)備中還存在另外的相同要素。以上對(duì)本申請(qǐng)所提供的一種測(cè)試用的壓力生成方法,以及,一種測(cè)試用的壓力生成裝置進(jìn)行了詳細(xì)介紹,本文中應(yīng)用了具體個(gè)例對(duì)本申請(qǐng)的原理及實(shí)施方式進(jìn)行了闡述,以上實(shí)施例的說(shuō)明只是用于幫助理解本申請(qǐng)的方法及其核心思想;同時(shí),對(duì)于本領(lǐng)域的一般技術(shù)人員,依據(jù)本申請(qǐng)的思想,在具體實(shí)施方式
及應(yīng)用范圍上均會(huì)有改變之處,綜上所述,本說(shuō)明書內(nèi)容不應(yīng)理解為對(duì)本申請(qǐng)的限制。
權(quán)利要求
1.一種測(cè)試用的壓力生成方法,其特征在于,包括獲取測(cè)試參數(shù)信息,所述測(cè)試參數(shù)信息包括測(cè)試需求信息和測(cè)試業(yè)務(wù)邏輯;主進(jìn)程根據(jù)所述測(cè)試需求信息產(chǎn)生相應(yīng)數(shù)量的子進(jìn)程;各子進(jìn)程分別生成指定數(shù)量的子線程;各子線程同時(shí)執(zhí)行所述測(cè)試業(yè)務(wù)邏輯。
2.如權(quán)利要求I所述的方法,其特征在于,所述測(cè)試需求信息包括預(yù)設(shè)的并發(fā)數(shù)NUM和預(yù)先配置的子進(jìn)程所含子線程數(shù)m,所述主進(jìn)程根據(jù)所述測(cè)試需求信息產(chǎn)生相應(yīng)數(shù)量的子進(jìn)程的步驟包括主進(jìn)程根據(jù)所述預(yù)設(shè)的并發(fā)數(shù)NUM和預(yù)配置的子進(jìn)程所含子線程數(shù)m,通過(guò)以下公式計(jì)算需要產(chǎn)生的子進(jìn)程數(shù)量η n = NUM/m ;判斷η是否為整數(shù),若是,則確定所述子進(jìn)程數(shù)量為η ;若否,則確定所述子進(jìn)程數(shù)量為η+1,并配置所述新增子進(jìn)程中所含子線程數(shù)為NUM/m的余數(shù);主進(jìn)程依據(jù)所述確定的子進(jìn)程數(shù)量,生成相應(yīng)數(shù)量的子進(jìn)程。
3.如權(quán)利要求2所述的方法,其特征在于,所述各子進(jìn)程分別生成指定數(shù)量的子線程的步驟為各子進(jìn)程依據(jù)所述預(yù)先配置的子線程數(shù)或主進(jìn)程配置的子線程數(shù),對(duì)應(yīng)生成相應(yīng)數(shù)量的子線程。
4.如權(quán)利要求2或3所述的方法,其特征在于,所述測(cè)試業(yè)務(wù)邏輯中包括測(cè)試業(yè)務(wù)邏輯函數(shù),所述測(cè)試業(yè)務(wù)邏輯函數(shù)包括初始化init函數(shù),執(zhí)行act函數(shù)和結(jié)束end函數(shù);所述子線程通過(guò)以下子步驟執(zhí)行所述測(cè)試業(yè)務(wù)邏輯執(zhí)行init函數(shù),完成當(dāng)前子線程的初始化操作;執(zhí)行act函數(shù),由當(dāng)前子線程循環(huán)產(chǎn)生業(yè)務(wù)請(qǐng)求;在當(dāng)前產(chǎn)生業(yè)務(wù)請(qǐng)求的時(shí)間達(dá)到了預(yù)置的業(yè)務(wù)執(zhí)行時(shí)長(zhǎng),或者,當(dāng)前產(chǎn)生的業(yè)務(wù)請(qǐng)求達(dá)到了預(yù)置的請(qǐng)求次數(shù)時(shí),則執(zhí)行end函數(shù)結(jié)束當(dāng)前子線程,并通知相應(yīng)的子進(jìn)程當(dāng)前子線程執(zhí)行完畢。
5.如權(quán)利要求1、2或3所述的方法,其特征在于,還包括主進(jìn)程等待其所產(chǎn)生的每個(gè)子進(jìn)程結(jié)束后,根據(jù)所述子進(jìn)程的運(yùn)行結(jié)果數(shù)據(jù)生成測(cè)試 艮告。
6.如權(quán)利要求5所述的方法,其特征在于,還包括各子進(jìn)程等待其所生成的每個(gè)子線程結(jié)束后,獲取各子線程的測(cè)試業(yè)務(wù)邏輯的執(zhí)行狀態(tài),并依據(jù)所述執(zhí)行狀態(tài)生成子進(jìn)程的運(yùn)行結(jié)果數(shù)據(jù)。
7.如權(quán)利要求1、2或3所述的方法,其特征在于,所述主進(jìn)程和子進(jìn)程共享同一內(nèi)存空間,并通過(guò)所述共享內(nèi)存空間進(jìn)行通信。
8.如權(quán)利要求7所述的方法,其特征在于,所述子線程位于其所屬子進(jìn)程的私有內(nèi)存空間,子線程之間通過(guò)其所屬子進(jìn)程的私有內(nèi)存空間進(jìn)行通信。
9.一種測(cè)試用的壓力生成裝置,其特征在于,包括測(cè)試參數(shù)獲取模塊,用于獲取測(cè)試參數(shù)信息,所述測(cè)試參數(shù)信息包括測(cè)試需求信息和測(cè)試業(yè)務(wù)邏輯;主進(jìn)程處理模塊,用于由主進(jìn)程根據(jù)所述測(cè)試需求信息產(chǎn)生相應(yīng)數(shù)量的子進(jìn)程;子進(jìn)程處理模塊,用于由各子進(jìn)程分別生成指定數(shù)量的子線程;子線程處理模塊,用于由各子線程同時(shí)執(zhí)行所述測(cè)試業(yè)務(wù)邏輯。
10.如權(quán)利要求9所述的裝置,其特征在于,還包括測(cè)試報(bào)告生成模塊,用于由主進(jìn)程等待其所產(chǎn)生的每個(gè)子進(jìn)程結(jié)束后,根據(jù)所述子進(jìn)程的運(yùn)行結(jié)果數(shù)據(jù)生成測(cè)試報(bào)告。
全文摘要
本申請(qǐng)?zhí)峁┝艘环N測(cè)試用的壓力生成方法及裝置,其中,所述方法包括獲取測(cè)試參數(shù)信息,所述測(cè)試參數(shù)信息包括測(cè)試需求信息和測(cè)試業(yè)務(wù)邏輯;主進(jìn)程根據(jù)所述測(cè)試需求信息產(chǎn)生相應(yīng)數(shù)量的子進(jìn)程;各子進(jìn)程分別生成指定數(shù)量的子線程;各子線程同時(shí)執(zhí)行所述測(cè)試業(yè)務(wù)邏輯。本申請(qǐng)可以形成真正的高并發(fā)的壓力,為服務(wù)端性能測(cè)試提供高并發(fā)高頻率的訪問(wèn)請(qǐng)求。
文檔編號(hào)G06F11/36GK102955721SQ20111023526
公開(kāi)日2013年3月6日 申請(qǐng)日期2011年8月16日 優(yōu)先權(quán)日2011年8月16日
發(fā)明者崔崢 申請(qǐng)人:阿里巴巴集團(tuán)控股有限公司
網(wǎng)友詢問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
德保县| 宁陕县| 耒阳市| 郴州市| 阳江市| 栾川县| 大新县| 固镇县| 高碑店市| 巧家县| 龙胜| 牙克石市| 阜城县| 莱西市| 威海市| 昌黎县| 泊头市| 高密市| 沁水县| 林西县| 盐津县| 玉龙| 衡水市| 舒城县| 延川县| 涞源县| 武鸣县| 邻水| 广州市| 澄城县| 高平市| 梁河县| 芷江| 汶川县| 分宜县| 股票| 凉城县| 竹北市| 张北县| 广安市| 陆河县|