技術(shù)領(lǐng)域
本發(fā)明涉及軟件測試技術(shù)領(lǐng)域,尤其涉及一種通用網(wǎng)關(guān)接口(CGI,CommonGatewayInterface)的測試方法及測試裝置。
背景技術(shù):
CGI是一種運(yùn)行在服務(wù)器上的程序,用于提供同客戶端交互的接口。CGI內(nèi)包括具體的邏輯處理模塊,其中包括不同的邏輯分支,用于對請求數(shù)據(jù)進(jìn)行相對應(yīng)的處理并返回處理結(jié)果。CGI處理請求包的具體過程包括:客戶端通過網(wǎng)絡(luò)將用戶的請求包送到服務(wù)器;服務(wù)器接收客戶端的請求包并交給CGI處理;CGI根據(jù)該請求包的類型采用對應(yīng)的處理邏輯進(jìn)行處理,把處理結(jié)果傳送給服務(wù)器;服務(wù)器通過應(yīng)答包把處理結(jié)果送回到客戶端。
目前,對于CGI的功能測試,大多數(shù)測試方法都是通過人工去驗證功能是否正常的方法,每次更新CGI的時候,測試人員都需要人工對整個系統(tǒng)進(jìn)行功能測試,從而保障系統(tǒng)質(zhì)量。這樣不僅需要較長的測試時間,并且也有很多重復(fù)性的工作。
目前也出現(xiàn)了一些測試工具,如iCAF工具,其主要功能是通過抓取客戶端用戶界面(UI,UserInterface)控件,修改UI控件的取值,然后自動發(fā)送測試包進(jìn)行測試。
但是,現(xiàn)有的這種UI測試方法有兩個主要缺點:
(1)客戶端系統(tǒng)的UI更新一般是很敏捷的,界面經(jīng)常出現(xiàn)變化,導(dǎo)致自動化腳本需要很大的維護(hù)量,就算CGI本身沒有變化,但界面一發(fā)生變化就需要大量地修改測試代碼和測試用例,測試工作量非常巨大,在實際中開展起來比較吃力,需要花費(fèi)很多人力在維護(hù)上面,并且一旦有新的界面,還需編寫新的用例去支持,而且跟CGI本身也沒有直接的關(guān)系。
(2)另外,客戶端界面通常有一些保護(hù)機(jī)制,利用UI控件無法任意修改請求的數(shù)據(jù),因此現(xiàn)有的這種方法只能驗證部分的正常功能,無法模擬各種請求情況,無法驗證CGI對于異常請求的邏輯處理以及容錯能力,而且發(fā)現(xiàn)問題的時候也很難準(zhǔn)確定位到CGI出錯的位置。例如黑客可以繞過客戶端對請求數(shù)據(jù)進(jìn)行篡改,在這種情況下需要檢測CGI對應(yīng)的容錯能力,但是由于現(xiàn)有的這種測試方法無法模擬這種黑客篡改的情況,因此無法檢測到CGI應(yīng)對的這種情況的能力。因此,現(xiàn)有這種測試方法發(fā)現(xiàn)和解決CGI邏輯錯誤的能力較低,測試的準(zhǔn)確度不高。
技術(shù)實現(xiàn)要素:
有鑒于此,本發(fā)明的主要目的在于提供一種CGI的測試方法及其測試裝置,減少測試工作量,提高測試精確度。
本發(fā)明的技術(shù)方案是這樣實現(xiàn)的:
一種通用網(wǎng)關(guān)接口CGI的測試方法,包括:
收集客戶端發(fā)出的請求包和服務(wù)器針對該請求響應(yīng)的應(yīng)答包,對所述請求包和應(yīng)答包進(jìn)行解析,生成包括請求數(shù)據(jù)和應(yīng)答數(shù)據(jù)的用例文件;
根據(jù)CGI的處理邏輯修改所述用例文件,其中包括將請求數(shù)據(jù)修改為構(gòu)造的請求數(shù)據(jù),以及將對應(yīng)的應(yīng)答數(shù)據(jù)修改為預(yù)期應(yīng)答數(shù)據(jù);
將所述修改后的請求數(shù)據(jù)封裝成測試請求包發(fā)送給服務(wù)器;
接收服務(wù)器返回的相應(yīng)應(yīng)答包,對所述應(yīng)答包進(jìn)行解析得到實際應(yīng)答數(shù)據(jù),與所述預(yù)期應(yīng)答數(shù)據(jù)進(jìn)行對比,輸出對比結(jié)果。
一種CGI的測試裝置,包括:
收集解包模塊,用于收集客戶端發(fā)出的請求包和服務(wù)器針對該請求響應(yīng)的應(yīng)答包,對所述請求包和應(yīng)答包進(jìn)行解析,得到對應(yīng)的請求數(shù)據(jù)和應(yīng)答數(shù)據(jù);
用例生成模塊,用于生成包括所述請求數(shù)據(jù)和應(yīng)答數(shù)據(jù)的用例文件;
用例修改模塊,用于根據(jù)測試人員指令修改所述用例文件,其中包括將請求數(shù)據(jù)修改為構(gòu)造的請求數(shù)據(jù),以及將對應(yīng)的應(yīng)答數(shù)據(jù)修改為預(yù)期應(yīng)答數(shù)據(jù);
封包模塊,用于將所述修改后的請求數(shù)據(jù)封裝成測試請求包發(fā)送給服務(wù)器;
解包對比模塊,用于接收服務(wù)器返回的應(yīng)答包,對所述應(yīng)答包進(jìn)行解析得到實際應(yīng)答數(shù)據(jù),與所述預(yù)期應(yīng)答數(shù)據(jù)進(jìn)行對比,將對比結(jié)果發(fā)送給輸出模塊輸出;
輸出模塊,用于輸出展示所述對比結(jié)果。
與現(xiàn)有技術(shù)相比,本發(fā)明不需要關(guān)心UI控件的變化,而是直接收集請求包生成一個基本的用例文件,并對用例中的數(shù)據(jù)進(jìn)行修改生成測試用請求包,不必根據(jù)界面的變化修改測試代碼和測試用例,減少了測試的工作量。
本發(fā)明不需要UI控件的幫助,不受客戶端界面的保護(hù)機(jī)制的影響,而是可以對請求包中的數(shù)據(jù)進(jìn)行任意修改,因此本發(fā)明中,測試人員可以根據(jù)CGI邏輯分支修改所生成的基本的用例文件,從而構(gòu)造出測試人員希望構(gòu)造出的任意的測試用例,用來模擬各種對應(yīng)的請求情況,從而提高發(fā)現(xiàn)和解決CGI邏輯錯誤的能力,提高測試的準(zhǔn)確度。
附圖說明
圖1為本發(fā)明所述CGI測試方法的主要流程圖;
圖2為本發(fā)明所述的CGI測試裝置的一種組成示意圖;
圖3為本發(fā)明所述CGI測試裝置包含存取控制模塊的一種組成示意圖;
圖4為本發(fā)明所述CGI測試裝置包含解包/封包代碼生成模塊的一種組成示意圖;
圖5a所示為請求包/應(yīng)答包收集解析過程的一種流程圖;
圖5b所示為測試請求包的構(gòu)造發(fā)送過程的一種流程圖;
圖5c所示為應(yīng)答包收取比對過程的一種流程圖。
具體實施方式
下面結(jié)合附圖及具體實施例對本發(fā)明再作進(jìn)一步詳細(xì)的說明。
圖1為本發(fā)明所述CGI測試方法的主要流程圖。參見圖1,該方法主要包括:
步驟101、收集客戶端發(fā)出的請求包和服務(wù)器針對該請求響應(yīng)的應(yīng)答包,對所述請求包和應(yīng)答包進(jìn)行解析,得到對應(yīng)的請求數(shù)據(jù)和應(yīng)答數(shù)據(jù)。
由于客戶端和服務(wù)器之間的數(shù)據(jù)包(包括請求包和應(yīng)答包)是二進(jìn)制的超文本傳送協(xié)議(HTTP)數(shù)據(jù)包,因此需要對收集的請求包和應(yīng)答包進(jìn)行解析得到測試人員可以識別理解的數(shù)據(jù)。本步驟中,所述對請求包和應(yīng)答包進(jìn)行解析的一種具體方式為:
對所述二進(jìn)制的請求包和應(yīng)答包進(jìn)行解析得到對應(yīng)的字段名稱及其具體數(shù)據(jù);當(dāng)然,也可以進(jìn)一步解析得到字段的類型,以提供給測試人員更為詳細(xì)的信息。在CGI的處理邏輯中,每一種數(shù)據(jù)包都對應(yīng)一種數(shù)據(jù)結(jié)構(gòu)類型,每一種數(shù)據(jù)結(jié)構(gòu)類型中包括對應(yīng)的數(shù)據(jù)結(jié)構(gòu),具體包括至少一個字段、每個字段對應(yīng)的數(shù)據(jù)類型。在具體數(shù)據(jù)包中需要包括數(shù)據(jù)類型對應(yīng)的字段、每個字段對應(yīng)的數(shù)據(jù)類型及每個字段的具體數(shù)值。例如對于登錄請求包對應(yīng)包括的字段包括:用戶名、密碼等數(shù)據(jù)。
步驟102、生成包括步驟101所解析得到的請求數(shù)據(jù)和應(yīng)答數(shù)據(jù)的用例文件。
本步驟生成的該用例文件是一種基本的用例文件,每一種請求包都至少對應(yīng)一種基本的用例文件,測試人員可以在后續(xù)過程中在該用例文件的基礎(chǔ)上修改得到任意的測試用例。本步驟中生成包括請求數(shù)據(jù)和應(yīng)答數(shù)據(jù)的用例文件的一種具體方式為:
根據(jù)步驟101解析得到的所述字段名稱及其具體數(shù)據(jù)生成用例文件,該用例文件中包括兩部分內(nèi)容:一部分為請求包部分,即請求數(shù)據(jù),包括請求包的數(shù)據(jù)結(jié)構(gòu)類型名稱和各字段的名稱及其具體數(shù)據(jù),其中每一字段名稱及其具體數(shù)據(jù)可以看作是一項請求數(shù)據(jù);另一部分為對應(yīng)的應(yīng)答包部分,即應(yīng)答數(shù)據(jù),包括應(yīng)答包的數(shù)據(jù)結(jié)構(gòu)類型名稱和各字段的名稱及其具體數(shù)據(jù),同理,其中每一字段名稱及其具體數(shù)據(jù)可以看作是一項應(yīng)答數(shù)據(jù)。
步驟103、根據(jù)測試人員的指令修改所述用例文件,其中包括將請求數(shù)據(jù)修改為構(gòu)造的請求數(shù)據(jù),以及將對應(yīng)的應(yīng)答數(shù)據(jù)修改為預(yù)期應(yīng)答數(shù)據(jù)。
本步驟中,所述測試人員可以根據(jù)CGI邏輯分支發(fā)出修改指令,從而構(gòu)造出測試人員希望構(gòu)造出的任意的測試用例,用來模擬各種對應(yīng)的請求情況,從而提高發(fā)現(xiàn)和解決CGI邏輯錯誤的能力,提高測試的準(zhǔn)確度。
本步驟中,修改所述用例文件具體為:測試人員根據(jù)CGI邏輯分支,將用例文件中的請求數(shù)據(jù)中的至少一項字段名稱對應(yīng)的值修改為構(gòu)造值,所謂構(gòu)造值就是測試人員根據(jù)對CGI的測試需求人工編造的值,并將該請求數(shù)據(jù)對應(yīng)的應(yīng)答數(shù)據(jù)中對應(yīng)的字段名稱的對應(yīng)值改為預(yù)期應(yīng)答值,所謂預(yù)期應(yīng)答值就是測試人員根據(jù)所述構(gòu)造值按照正常的CGI處理邏輯確定出的應(yīng)答值,該應(yīng)答值代表了所述構(gòu)造值對應(yīng)的正常的CGI處理結(jié)果。修改完畢后,修改后的請求數(shù)據(jù)和預(yù)期應(yīng)答數(shù)據(jù)則構(gòu)成了一個新的用于測試的用例。此外,還可以進(jìn)一步為該修改后的用例分配標(biāo)識(ID)、以及輸入該用例的描述信息,例如該用例是用于測試CGI邏輯中的哪個分支內(nèi)容等,更方便測試人員在看到對比結(jié)果后更加準(zhǔn)確地定位CGI的出錯位置。
步驟104、將所述修改后的請求數(shù)據(jù)封裝成測試請求包發(fā)送給服務(wù)器。
步驟105、接收服務(wù)器返回的針對所述測試請求包的應(yīng)答包,對所述應(yīng)答包進(jìn)行解析得到實際應(yīng)答數(shù)據(jù),與所述預(yù)期應(yīng)答數(shù)據(jù)進(jìn)行對比。
本步驟中的一種具體的處理方法包括:將所收到的所述二進(jìn)制的應(yīng)答包進(jìn)行解析得到實際應(yīng)答數(shù)據(jù),其中包括字段名稱及其實際值;讀取步驟103所述預(yù)期應(yīng)答數(shù)據(jù)中的各字段名稱及其預(yù)期值;將所述實際應(yīng)答數(shù)據(jù)和預(yù)期應(yīng)答數(shù)據(jù)中的各具有相同字段名稱的實際值和預(yù)期值進(jìn)行對比,判斷是否滿足預(yù)設(shè)的對比規(guī)則,將不滿足所述對比規(guī)則的字段名稱及其實際值和預(yù)期值交給步驟106輸出。
步驟106、輸出所述對比結(jié)果。
為了更好更加直觀地將所述不滿足對比規(guī)則的對比結(jié)果呈現(xiàn)給測試人員,本發(fā)明可以將所述對比結(jié)果的內(nèi)容包含在郵件中,將該郵件發(fā)送給測試人員的目標(biāo)郵箱。如果測試人員在修改用例文件時進(jìn)一步記錄了修改后用例的標(biāo)識和用例描述信息,則在輸出該用例對應(yīng)的對比結(jié)果時,進(jìn)一步輸出該用例的標(biāo)識和用例描述信息。
對應(yīng)的,本發(fā)明還公開了一種CGI的測試裝置,用于執(zhí)行本發(fā)明所述的方法步驟。圖2為本發(fā)明所述的CGI測試裝置的一種組成示意圖。參見圖2,該測試裝置為一種測試程序,主要包括:
收集解包模塊201,用于收集客戶端發(fā)出的請求包和服務(wù)器針對該請求響應(yīng)的應(yīng)答包,對所述請求包和應(yīng)答包進(jìn)行解析,得到對應(yīng)的請求數(shù)據(jù)和應(yīng)答數(shù)據(jù)。
用例生成模塊202,用于生成包括所述請求數(shù)據(jù)和應(yīng)答數(shù)據(jù)的用例文件。
用例修改模塊203,用于根據(jù)測試人員指令修改所述用例文件,其中包括將請求數(shù)據(jù)修改為構(gòu)造的請求數(shù)據(jù),以及將對應(yīng)的應(yīng)答數(shù)據(jù)修改為預(yù)期應(yīng)答數(shù)據(jù)。
該用例修改模塊203可以提供用例修改界面,其中可以顯示所述基本的用例文件的請求數(shù)據(jù)和應(yīng)答數(shù)據(jù),用戶可以對其中的數(shù)據(jù)進(jìn)行修改。
封包模塊204,用于將所述修改后的請求數(shù)據(jù)封裝成測試請求包發(fā)送給服務(wù)器。
解包對比模塊205,用于接收服務(wù)器返回的應(yīng)答包,對所述應(yīng)答包進(jìn)行解析得到實際應(yīng)答數(shù)據(jù),與所述預(yù)期應(yīng)答數(shù)據(jù)進(jìn)行對比,將對比結(jié)果發(fā)送給輸出模塊206輸出。
輸出模塊206,用于輸出展示所述對比結(jié)果。
通過本發(fā)明的方案,請求的數(shù)據(jù)是從真實的正常的客戶數(shù)據(jù)中提取的,通過修改請求包里面的一兩個特定字段,就可以使得測試人員能夠更加容易地確保該構(gòu)造出來的請求應(yīng)當(dāng)進(jìn)入CGI處理邏輯的哪一條邏輯分支里面,從而更方便測試人員發(fā)現(xiàn)問題和定位問題,減少測試工作量。
在本發(fā)明的一種實施例中,本發(fā)明步驟101中,在解析得到所述字段名稱及其具體數(shù)據(jù)之后,進(jìn)一步保存所述解析得到的字段名稱及其具體數(shù)據(jù)到數(shù)據(jù)庫中;步驟102中,在生成所述用例文件時,從數(shù)據(jù)庫中讀取對應(yīng)的字段名稱及其具體的數(shù)據(jù)用于生成所述用例文件。
將所述字段名稱及其具體數(shù)據(jù)保存到數(shù)據(jù)庫的原因是:請求包及其對應(yīng)的應(yīng)答包不能同時收集到,應(yīng)答包往往要遲后請求包一段時間,因此在解析請求包后不能立刻生成用例文件,需要等到解析完對應(yīng)的應(yīng)答包之后才能生成用例文件,如果不保存到數(shù)據(jù)庫雖然也可以實現(xiàn)本發(fā)明的發(fā)明目的,但是生成用例文件的時間和占用的資源比較多,因此,在解析出的請求數(shù)據(jù)后,將請求數(shù)據(jù)保存到數(shù)據(jù)庫,例如此處以可擴(kuò)展標(biāo)記語言(XML,ExtensibleMarkupLanguage)格式保存請求數(shù)據(jù)到數(shù)據(jù)庫中;當(dāng)收集到所述請求包對應(yīng)的應(yīng)答包并解析出應(yīng)答數(shù)據(jù)之后,再將應(yīng)答數(shù)據(jù)以XML格式保存到數(shù)據(jù)庫中。這樣的好處是生成用例文件的進(jìn)程不必等待數(shù)據(jù)解析,在需要生成用例文件時讀取數(shù)據(jù)庫即可,可以提高效率和降低資源占用。在需要生成用例文件時,直接從數(shù)據(jù)庫中讀取請求包的XML數(shù)據(jù)串以及對應(yīng)的應(yīng)答包的XML數(shù)據(jù)串,對取出的XML數(shù)據(jù)串進(jìn)行解析獲取各個字段所對應(yīng)的取值,生成一個用例文件,在該用例文件中,把相應(yīng)的請求包的請求數(shù)據(jù)和對應(yīng)應(yīng)答包的應(yīng)答數(shù)據(jù)集成在一起,這樣請求包和應(yīng)答包各個字段的內(nèi)容就一目了然了。
同理,在步驟103中,在修改完所述用例文件后,進(jìn)一步將該用例文件的請求數(shù)據(jù)和應(yīng)答數(shù)據(jù)保存到數(shù)據(jù)庫中,即將修改后的用例文件的全部請求數(shù)據(jù)(包括修改的字段值及其字段名稱,以及沒有修改的字段值及其字段名稱)和全部應(yīng)答數(shù)據(jù)(包括修改的字段預(yù)期應(yīng)答值及其字段名稱,以及沒有修改的字段值及其字段名稱)保存到數(shù)據(jù)庫中,此處也以XML的格式保存。
在步驟104封裝測試請求包時,從數(shù)據(jù)庫中讀取對應(yīng)的請求數(shù)據(jù)用于封裝成測試請求包;在步驟105中得到實際應(yīng)答數(shù)據(jù)后,從數(shù)據(jù)庫中讀取對應(yīng)的預(yù)期應(yīng)答值進(jìn)行對比。
所述XML是用于標(biāo)記電子文件使其具有結(jié)構(gòu)性的標(biāo)記語言,可以用來標(biāo)記數(shù)據(jù)、定義數(shù)據(jù)類型,是一種允許用戶對自己的標(biāo)記語言進(jìn)行定義的源語言。XML是標(biāo)準(zhǔn)通用標(biāo)記語言(SGML)的子集,非常適合Web傳輸。由于XML有標(biāo)準(zhǔn)的格式并且已有許多開源的解析程序可供使用,所以本發(fā)明的優(yōu)選實施例中采用XML格式來保存所述數(shù)據(jù),當(dāng)然本發(fā)明對具體的數(shù)據(jù)保存格式并不限定于XML格式,在其他實施例中也可以采用其它格式保存所述數(shù)據(jù)。
對應(yīng)的,在所述CGI測試裝置的一種具體實施例中,如圖3所示,還進(jìn)一步包括存取控制模塊207,用于進(jìn)一步將解析到的所述請求數(shù)據(jù)和應(yīng)答數(shù)據(jù)存儲到數(shù)據(jù)庫208中,并在生成用例文件時從數(shù)據(jù)庫208讀取對應(yīng)的請求數(shù)據(jù)和應(yīng)答數(shù)據(jù);還用于將修改后的請求數(shù)據(jù)和應(yīng)答數(shù)據(jù)存儲到數(shù)據(jù)庫208中,并在構(gòu)造測試請求包時,從數(shù)據(jù)庫208中讀取對應(yīng)的請求數(shù)據(jù),在對比時從數(shù)據(jù)庫208中讀取對應(yīng)的預(yù)期應(yīng)答數(shù)據(jù)。
在CGI中,每一種數(shù)據(jù)包有一一對應(yīng)的數(shù)據(jù)結(jié)構(gòu)類型,每一種數(shù)據(jù)結(jié)構(gòu)類型中包括對應(yīng)的數(shù)據(jù)結(jié)構(gòu),具體包括至少一個字段、每個字段對應(yīng)的數(shù)據(jù)類型及每個字段的具體數(shù)值。這些數(shù)據(jù)結(jié)構(gòu)類型的信息被記錄在CGI的數(shù)據(jù)結(jié)構(gòu)定義文件中。由于數(shù)據(jù)結(jié)構(gòu)類型不同,因此不同數(shù)據(jù)包(包括請求包和應(yīng)答包)的解析和封裝操作會有所不同,因此需要由不同的程序代碼執(zhí)行所述解析和封裝操作。本發(fā)明中的方法中,所述對請求包或應(yīng)答包進(jìn)行解析的操作由該請求包數(shù)據(jù)結(jié)構(gòu)類型或應(yīng)答包數(shù)據(jù)結(jié)構(gòu)類型對應(yīng)的解包代碼執(zhí)行;所述將請求數(shù)據(jù)封裝成測試請求包的操作由該請求數(shù)據(jù)結(jié)構(gòu)類型對應(yīng)的封包代碼執(zhí)行。在本發(fā)明的所述測試裝置中,所述收集解包模塊和解包對比模塊中具體包括解包代碼,或可以調(diào)用解包代碼,所述對請求包或應(yīng)答包進(jìn)行解析的操作由該請求包數(shù)據(jù)結(jié)構(gòu)類型或應(yīng)答包數(shù)據(jù)結(jié)構(gòu)類型對應(yīng)的解包代碼執(zhí)行;所述封包模塊中具體包括封包代碼,或可以調(diào)用封包代碼,所述將請求數(shù)據(jù)封裝成測試請求包的操作由該請求數(shù)據(jù)結(jié)構(gòu)類型對應(yīng)的封包代碼執(zhí)行。所述封包代碼和解包代碼可以直接調(diào)用CGI開發(fā)過程中已有的代碼,詳細(xì)的封包和解包過程在后文中介紹。
如果CGI的數(shù)據(jù)結(jié)構(gòu)相對固定,在一種實施例中,可以將所述解包代碼和封包代碼直接寫入所述測試裝置的程序中。如果某一數(shù)據(jù)包對應(yīng)的數(shù)據(jù)結(jié)構(gòu)有變化,則其對應(yīng)的封包和解包操作也要隨之變化,這時需要對所述解包代碼和封包代碼進(jìn)行修改,在一種實施例中,可以人工修改所述解包代碼和封包代碼以實現(xiàn)本發(fā)明的目的。
但是,為了進(jìn)一步降低人員的工作量,在本發(fā)明的一種優(yōu)選實施例中,可以進(jìn)一步包括封包/解包代碼的自動生成過程,即:通過掃描開發(fā)人員的數(shù)據(jù)結(jié)構(gòu)定義文件,然后進(jìn)行分析處理,從而自動生成各個數(shù)據(jù)結(jié)構(gòu)類型對應(yīng)的封包/解包代碼,將這些程序代碼更新到測試裝置的測試程序中,從而可以使測試程序自動適應(yīng)CGI的新的數(shù)據(jù)結(jié)構(gòu),保證測試過程的正常運(yùn)行。這個過程可以在第一次測試時以及每次CGI進(jìn)行變更同步之后自動執(zhí)行,從而得到適應(yīng)性的測試程序,以適應(yīng)CGI的修改。
對應(yīng)的,所述CGI測試裝置中,如圖4所示,進(jìn)一步包括解包/封包代碼生成模塊209,用于根據(jù)CGI的數(shù)據(jù)結(jié)構(gòu)定義文件生成與各數(shù)據(jù)結(jié)構(gòu)類型對應(yīng)的解包代碼和封包代碼,將所述解包代碼提供給所述收集解包模塊201和解包對比模塊205,將所述封包代碼提供給所述封包模塊204。
所述具體的封包/解包代碼的自動生成過程如下步驟41至步驟43:
步驟41:對所述CGI的數(shù)據(jù)結(jié)構(gòu)定義文件進(jìn)行解析,得到各數(shù)據(jù)結(jié)構(gòu)類型名稱以及各數(shù)據(jù)結(jié)構(gòu)類型包含的字段名稱和類型,并生成各字段的初始化數(shù)據(jù)。
所述生成各字段的初始化數(shù)據(jù)的目的在于:在構(gòu)造測試請求包時,對于測試人員不修改的、且取值不確定的字段附上所述初始值,由于該初始值是一種正常數(shù)據(jù),因此可以避免不確定的字段對測試結(jié)果造成干擾。
步驟42:為所述每一數(shù)據(jù)結(jié)構(gòu)類型對應(yīng)生成二進(jìn)制轉(zhuǎn)換函數(shù)和封裝函數(shù),該二進(jìn)制轉(zhuǎn)換函數(shù)和封裝函數(shù)組成了該數(shù)據(jù)結(jié)構(gòu)類型對應(yīng)的封包代碼。所述二進(jìn)制轉(zhuǎn)換函數(shù)可以直接調(diào)用CGI開發(fā)時的現(xiàn)有函數(shù),但該函數(shù)必須與數(shù)據(jù)結(jié)構(gòu)類型對應(yīng),專用于將該數(shù)據(jù)結(jié)構(gòu)類型內(nèi)的字段名稱、類型及其數(shù)據(jù)轉(zhuǎn)換為二進(jìn)制流。在構(gòu)造測試請求包時,根據(jù)請求數(shù)據(jù)中的數(shù)據(jù)結(jié)構(gòu)類型名稱調(diào)用該數(shù)據(jù)結(jié)構(gòu)類型對應(yīng)的二進(jìn)制轉(zhuǎn)換函數(shù),由該二進(jìn)制轉(zhuǎn)換函數(shù)將該數(shù)據(jù)結(jié)構(gòu)類型內(nèi)的字段名稱、類型及其數(shù)據(jù)轉(zhuǎn)換為二進(jìn)制流的包體。所述封裝函數(shù)用于對所述二進(jìn)制流包體進(jìn)行封裝得到對應(yīng)的請求包,其中封裝信息(主要是包頭)包括該請求包對應(yīng)的數(shù)據(jù)結(jié)構(gòu)類型名稱,所述封裝操作主要是為包體打上包頭,進(jìn)行加密、加壓等操作,制作成二進(jìn)制流的請求包。所述封裝函數(shù)也可以直接調(diào)用CGI開發(fā)時的現(xiàn)有函數(shù)。所述進(jìn)行轉(zhuǎn)換的原因是客戶端與服務(wù)器之間采用超文本傳送協(xié)議(HTTP)傳輸,而HTTP所需要的是二進(jìn)制流文件。
步驟43:為所述每一數(shù)據(jù)結(jié)構(gòu)類型對應(yīng)生成字段轉(zhuǎn)換函數(shù)和解封裝函數(shù),由該字段轉(zhuǎn)換函數(shù)和解封裝函數(shù)組成了該數(shù)據(jù)結(jié)構(gòu)類型對應(yīng)的解包代碼;其中所述解封裝函數(shù)可以直接調(diào)用CGI開發(fā)時的現(xiàn)有函數(shù),用于解封裝請求包或應(yīng)答包,所述解封裝操作主要包括解壓、解密、解包頭等操作,得到包頭中的數(shù)據(jù)結(jié)構(gòu)類型名稱和二進(jìn)制流的包體,再調(diào)用該數(shù)據(jù)結(jié)構(gòu)類型名稱對應(yīng)的字段轉(zhuǎn)換函數(shù)。該字段轉(zhuǎn)換函數(shù)也可以直接調(diào)用CGI開發(fā)時的現(xiàn)有函數(shù),但是該函數(shù)必須與該數(shù)據(jù)結(jié)構(gòu)類型對應(yīng),專用于將所述二進(jìn)制流的包體轉(zhuǎn)換成對應(yīng)數(shù)據(jù)結(jié)構(gòu)類型的字段名稱、類型及其數(shù)據(jù)。
當(dāng)然上述步驟42和43之間沒有嚴(yán)格的先后順序,也可以先步驟43后步驟42,或同時執(zhí)行。
下面舉例說明上述的處理過程:
例如:在開發(fā)人員的數(shù)據(jù)結(jié)構(gòu)定義文件中,數(shù)據(jù)結(jié)構(gòu)SpecialStruct的結(jié)構(gòu)定義如下:
經(jīng)過解析,可以得到字段tA的數(shù)據(jù)類型是SomeStruct,字段iB的數(shù)據(jù)類型是unsignedint,字段pcC的數(shù)據(jù)類型是char*,進(jìn)而可以得到數(shù)據(jù)結(jié)構(gòu)類型SpecialStruct的數(shù)據(jù)初始化函數(shù):
通過上述初始化函數(shù)可以生成各字段的初始化數(shù)據(jù),之后調(diào)用該數(shù)據(jù)結(jié)構(gòu)類型SpecialStruct對應(yīng)的二進(jìn)制轉(zhuǎn)換函數(shù)以及對應(yīng)的封裝函數(shù),組成封包代碼。當(dāng)進(jìn)行封包操作時,利用二進(jìn)制轉(zhuǎn)換函數(shù)把該數(shù)據(jù)結(jié)構(gòu)類型的字段及其取值轉(zhuǎn)換成二進(jìn)制流,并通過所述封裝函數(shù)封裝成一個二進(jìn)制流文件,在跟服務(wù)器端完成短鏈接之后就可以順利地進(jìn)行數(shù)據(jù)包的收發(fā)操作了。
由上所述,本發(fā)明數(shù)據(jù)包的數(shù)據(jù)結(jié)構(gòu)及其解包封包的代碼是通過對開發(fā)人員的數(shù)據(jù)結(jié)構(gòu)定義文件進(jìn)行分析處理直接自動生成的,并且這些代碼會定時更新,因此,即使CGI開發(fā)過程中的數(shù)據(jù)結(jié)構(gòu)經(jīng)常修改,也不需要人工修改對應(yīng)的測試程序,這樣就大大減少了人力在這方面上的維護(hù),進(jìn)一步減少了測試工作量。
下面以自動檢測微信CGI為例,再次介紹本發(fā)明所述方法的一具體實施例。所述微信是一種支持跨通信運(yùn)營商、跨操作系統(tǒng)平臺通過網(wǎng)絡(luò)快速發(fā)送免費(fèi)(需消耗少量網(wǎng)絡(luò)流量)語音短信、視頻、圖片和文字,支持多人群聊的手機(jī)聊天軟件。當(dāng)然,本發(fā)明并不僅僅限于自動檢測微信CGI的功能正常性和異常處理的容錯能力,還可以用于進(jìn)行壓力測試、內(nèi)存泄漏測試和性能測試等測試用途。
自動檢測微信CGI的過程主要包括如下步驟:
步驟501、請求包/應(yīng)答包的封包/解包代碼自動生成過程。即CGI測試裝置根據(jù)微信CGI的數(shù)據(jù)結(jié)構(gòu)定義文件,自動生成各數(shù)據(jù)結(jié)構(gòu)類型對應(yīng)的(即各數(shù)據(jù)包對應(yīng)的)封包代碼和解包代碼。主要過程如上述步驟41至步驟43。
步驟502、請求包/應(yīng)答包的收集解析。
如圖5a所示為請求包/應(yīng)答包收集解析過程的一種流程圖。參見圖5a,該過程包括:
步驟521、客戶端接收測試人員發(fā)出的一個請求操作,向服務(wù)器發(fā)出一個請求包。
步驟522、服務(wù)器端在接收到所述請求包后會對請求包進(jìn)行解包和解壓解密處理,然后根據(jù)服務(wù)器本身制定的CGI邏輯生成并返回一個應(yīng)答包。
步驟523、CGI測試裝置收集上述請求包和對應(yīng)的應(yīng)答包,所述請求包和應(yīng)答包均為二進(jìn)制流,CGI測試裝置需要將這種二進(jìn)制流轉(zhuǎn)換(通常采用業(yè)界常用的Dump操作進(jìn)行轉(zhuǎn)換)為對應(yīng)的二進(jìn)制請求包文件和二進(jìn)制應(yīng)答包文件并保存。
步驟524、CGI測試裝置調(diào)用所述解包代碼對所述二進(jìn)制的請求包文件和相應(yīng)的應(yīng)答包文件進(jìn)行解析,即:先用解封裝函數(shù)解壓、解密、解包頭得到包頭中的數(shù)據(jù)結(jié)構(gòu)類型名稱和二進(jìn)制流的包體,再調(diào)用該數(shù)據(jù)結(jié)構(gòu)類型名稱對應(yīng)的字段轉(zhuǎn)換函數(shù)將所述二進(jìn)制流的包體轉(zhuǎn)換成對應(yīng)數(shù)據(jù)結(jié)構(gòu)類型的字段名稱及其取值。解析之后得到請求數(shù)據(jù)和對應(yīng)的應(yīng)答數(shù)據(jù),所述請求數(shù)據(jù)包括請求包的數(shù)據(jù)結(jié)構(gòu)類型名稱和數(shù)據(jù)結(jié)構(gòu)中所包含的字段名稱及其具體值;所述應(yīng)答數(shù)據(jù)包括應(yīng)答包的數(shù)據(jù)結(jié)構(gòu)類型名稱和數(shù)據(jù)結(jié)構(gòu)中所包含的字段名稱及其具體值。
步驟525、CGI測試裝置把所述請求數(shù)據(jù)和相應(yīng)的應(yīng)答數(shù)據(jù)合成XML的格式并保存到數(shù)據(jù)庫中。這里注意,所述請求包的請求數(shù)據(jù)和對應(yīng)的應(yīng)答包的應(yīng)答數(shù)據(jù)要關(guān)聯(lián)存儲,在生成用例文件時需要關(guān)聯(lián)讀取。在向數(shù)據(jù)庫中保存所述數(shù)據(jù)時,如果某些字段的值為音視頻等二進(jìn)制數(shù)據(jù),則需要采用Base64編碼轉(zhuǎn)換之后再保存,當(dāng)從數(shù)據(jù)庫讀取這些數(shù)據(jù)時,同樣用Base64編碼轉(zhuǎn)換回二進(jìn)制數(shù)據(jù)。
步驟526、在生成用例文件時,CGI測試裝置首先從數(shù)據(jù)庫中取出請求數(shù)據(jù)和相應(yīng)的應(yīng)答數(shù)據(jù)的XML數(shù)據(jù)串,對取出的XML數(shù)據(jù)串進(jìn)行解析得到請求包的數(shù)據(jù)結(jié)構(gòu)類型名稱及各個字段及其對應(yīng)的取值,以及解析得到對應(yīng)應(yīng)答包的數(shù)據(jù)結(jié)構(gòu)類型名稱及各個字段及其對應(yīng)取值,生成一個用例文件,把解析得到的請求包的所述數(shù)據(jù)和相應(yīng)應(yīng)答包的所述數(shù)據(jù)分別寫入這個用例文件,從而在該用例文件中集成了請求包部分和應(yīng)答包部分兩部分內(nèi)容,即請求包的請求數(shù)據(jù)和相應(yīng)應(yīng)答包的應(yīng)答數(shù)據(jù),這樣請求包和應(yīng)答包各個字段的內(nèi)容就一目了然了。
對于不同類型的請求包及其對應(yīng)的應(yīng)答包,可以分別生成不同的用例文件。當(dāng)測試人員進(jìn)行測試時,可以修改不同的用例文件從而構(gòu)造出不同類型的測試請求包。
步驟503、測試請求包的構(gòu)造發(fā)送。
如圖5b所示為測試請求包的構(gòu)造發(fā)送過程的一種流程圖。參見圖5b,該過程包括:
步驟531、測試人員根據(jù)CGI的邏輯分支在用例修改界面上修改某一請求包的用例文件,在用例文件的請求包的請求數(shù)據(jù)中,把請求包原來的一些字段的值修改為測試人員希望的構(gòu)造值,在對應(yīng)的應(yīng)答包的應(yīng)答數(shù)據(jù)中,把原來的應(yīng)答值修改成測試人員預(yù)期會得到的預(yù)期應(yīng)答值,修改之后的用例就變成了新的測試用例,也可以稱之為目標(biāo)用例文件。除此之外,測試人員還可以輸入該新的測試用例的描述信息,例如該用例是用于測試CGI邏輯中的哪個分支內(nèi)容等,以更方便測試人員在看到對比結(jié)果后更加準(zhǔn)確地定位CGI的出錯位置。CGI測試裝置還可以自動為該新用例分別標(biāo)識。
步驟532、CGI測試裝置把修改后的目標(biāo)用例文件中的請求包部分和應(yīng)答包部分保存到數(shù)據(jù)庫中,保存的時候以XML格式來保存,以達(dá)到可以快速通用地解析這些數(shù)據(jù)包的效果,而且也便于保存。
步驟533、當(dāng)需要構(gòu)造測試請求包時,CGI測試裝置從數(shù)據(jù)庫中取出所述目標(biāo)用例的請求包數(shù)據(jù)(XML格式),解析出其中數(shù)據(jù)結(jié)構(gòu)類型名稱以及各個字段名稱及其取值,其中包括修改后的字段和沒有修改的字段,用于構(gòu)造一個測試請求包。
步驟534、CGI測試裝置調(diào)用步驟533所解析出的數(shù)據(jù)結(jié)構(gòu)類型名稱對應(yīng)的封包代碼,用該封包代碼中的二進(jìn)制轉(zhuǎn)換函數(shù)將所述解析出請求包的字段名稱及其取值轉(zhuǎn)換成二進(jìn)制流的包體,再用封裝函數(shù)進(jìn)行打包頭、加密、加壓等操作,制作成HTTP二進(jìn)制流的請求包,該請求包就是構(gòu)造出的測試請求包,最后將該測試請求包發(fā)送給服務(wù)器端進(jìn)行處理。
步驟504、應(yīng)答包收取比對。
如圖5c所示為應(yīng)答包收取比對過程的流程圖。參見圖5c,該過程包括:
步驟541、接收服務(wù)器返回的針對所述測試請求包的實際應(yīng)答包,調(diào)用解包代碼對所述應(yīng)答包進(jìn)行解析處理,即:先用解封裝函數(shù)解壓、解密、解包頭得到包頭中的數(shù)據(jù)結(jié)構(gòu)類型名稱和二進(jìn)制流的包體,再調(diào)用該數(shù)據(jù)結(jié)構(gòu)類型名稱對應(yīng)的字段轉(zhuǎn)換函數(shù)將所述二進(jìn)制流的包體轉(zhuǎn)換成對應(yīng)數(shù)據(jù)結(jié)構(gòu)類型的字段名稱及其取值。解析之后得到實際應(yīng)答數(shù)據(jù),即應(yīng)答包的數(shù)據(jù)結(jié)構(gòu)類型名稱和數(shù)據(jù)結(jié)構(gòu)中所包含的字段名稱及其具體值,這些具體值為實際值。
步驟542、根據(jù)所述數(shù)據(jù)結(jié)構(gòu)類型名稱(與所述應(yīng)答包對應(yīng))從數(shù)據(jù)庫中查詢對應(yīng)用例中的預(yù)期應(yīng)答數(shù)據(jù)的XML數(shù)據(jù)串,將該XML數(shù)據(jù)串解析成預(yù)期應(yīng)答數(shù)據(jù),即包括對應(yīng)的字段名稱及其具體值,其中的具體值就包括測試人員在修改用例時保存的預(yù)期值。
由于得到的應(yīng)答包是二進(jìn)制流文件,而預(yù)期結(jié)果又是以XML的形式保存在數(shù)據(jù)庫中的,測試人員很難直接比對這兩個結(jié)果來判斷出得到的結(jié)果是否符合預(yù)期。因此需要執(zhí)行上述步驟541和542對得到的二進(jìn)制結(jié)果和預(yù)期結(jié)果分別進(jìn)行解析,把各個字段的取值還原出來,這樣比對就直觀許多了。
步驟543、調(diào)用所述對比模塊將所述步驟542得到的和步驟541得到的各個具有相同字段名稱的預(yù)期值和實際值進(jìn)行對比,判斷是否滿足預(yù)設(shè)的對比規(guī)則。所述預(yù)設(shè)的對比規(guī)則可以根據(jù)不同的字段名稱進(jìn)行有針對性的設(shè)定,主要的對比規(guī)則有如下幾條:
(1)字段的預(yù)期值和實際值是否相等,如果是則滿足對比規(guī)則,否則不滿足對比規(guī)則。
(2)字段的預(yù)期值是否大于實際值,如果是則滿足對比規(guī)則,否則不滿足對比規(guī)則。
(3)字段的預(yù)期值是否小于實際值,如果是則滿足對比規(guī)則,否則不滿足對比規(guī)則。
(4)當(dāng)字段值為索引時,判斷字段的預(yù)期值索引到的二進(jìn)制流和實際值索引到的二進(jìn)制流是否相同,如果是則滿足對比規(guī)則,否則不滿足對比規(guī)則。
(5)字段的預(yù)期值和實際值可以是任意值,都認(rèn)為滿足對比規(guī)則。
當(dāng)然,本發(fā)明不限定于上述幾種對比規(guī)則,測試人員可以根據(jù)CGI的邏輯測試需要,自行規(guī)定更為有針對性的對比規(guī)則,此處不再贅述。
步驟544、將不滿足所述對比規(guī)則的字段名稱及其實際值和預(yù)期值輸出給輸出模塊進(jìn)行輸出。例如把不滿足比對預(yù)期的結(jié)果以字段和相應(yīng)取值的方式顯示出來,并會向測試人員明確顯示該字段的預(yù)期值和實際得到的值分別是什么,而其他比對正常的字段和用例則不會有任何的顯示。
步驟505、輸出模塊將對比結(jié)果的輸出顯示。
所述對比結(jié)果可以是以郵件和網(wǎng)頁前端頁面展示的方式反饋給測試人員。輸出模塊用于把CGI測試裝置需要輸出的有問題的比對結(jié)果以更好的、更加直觀的方式呈現(xiàn)給測試人員。當(dāng)出現(xiàn)比對的實際結(jié)果跟預(yù)期結(jié)果不一致的時候,輸出模塊會向測試人員和開發(fā)人員發(fā)送一份包含有結(jié)果比對的一些概要信息的郵件,其中包含有問題的用例ID、用例描述信息、預(yù)期結(jié)果和實際結(jié)果內(nèi)容等概要信息;另外該郵件中還可以進(jìn)一步包含有一個鏈接,測試人員通過該鏈接可以進(jìn)入查看此次測試比對的詳細(xì)信息說明,其中除了比對的概要信息外,還會包括出問題的是應(yīng)答包里的哪一個字段、數(shù)據(jù)類型是什么、重試了多少次等詳細(xì)的比對信息。如此一來,測試人員和開發(fā)人員就可以通過用例的描述信息和結(jié)果比對不一致的問題點出在哪一個地方等信息來確定出現(xiàn)潛在問題的邏輯分支。當(dāng)CGI出現(xiàn)問題的時候,可以通過出現(xiàn)異常的請求的用例ID出發(fā),很迅速地定位到問題點,從而減少受到影響和需要查找的范圍,使得測試人員能夠更快捷地發(fā)現(xiàn)和定位問題,也為開發(fā)人員能夠快速地定位和解決問題提供了便利條件。
經(jīng)過本發(fā)明,在對微信CGI進(jìn)行測試時,整個操作過程中的大部分都是自動完成的,測試人員可以在點擊運(yùn)行測試裝置后直接看到比對結(jié)果,而不用去了解結(jié)果的來源和結(jié)果比對的過程,大大提高了效率,減少了測試工作量。
本發(fā)明的上述流程不斷重復(fù)自動執(zhí)行,可以很有效地監(jiān)控整個微信CGI系統(tǒng)的功能使用情況和異常處理情況,包括成功數(shù)和失敗數(shù),從而知道系統(tǒng)當(dāng)前的運(yùn)行情況,使得整個微信CGI更加穩(wěn)定可靠,達(dá)到更全面的監(jiān)控,當(dāng)每次有微信CGI進(jìn)行變更同步的時候,都會自動執(zhí)行該測試裝置,如果出現(xiàn)有實際得到的結(jié)果跟預(yù)期結(jié)果比對不一致的情況就會反饋給測試人員,查看微信CGI是否出現(xiàn)了問題,迅速定位出現(xiàn)問題的位置,提高了發(fā)現(xiàn)和解決CGI邏輯錯誤或故障的能力。
以上所述僅為本發(fā)明的較佳實施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所做的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明保護(hù)的范圍之內(nèi)。