摘 要:目前支持Web的自動(dòng)化測(cè)試工具普遍存在價(jià)格偏高、測(cè)試腳本可重用性差、代碼維護(hù)工作量過(guò)大等缺點(diǎn)。為解決這一問(wèn)題提出了應(yīng)用.NET框架命名空間(NameSpace)技術(shù)實(shí)現(xiàn)Web應(yīng)用程序測(cè)試的自動(dòng)化方法。該方法不使用任何第三方測(cè)試工具,通過(guò)編寫簡(jiǎn)單、易維護(hù)的C#.NET代碼,對(duì)Web程序接口進(jìn)行信息抽取與調(diào)用,以實(shí)現(xiàn)測(cè)試的自動(dòng)化運(yùn)行。
關(guān)鍵詞:C#.NET; 命名空間; 自動(dòng)化測(cè)試; Web應(yīng)用程序
中圖分類號(hào):TP311.51文獻(xiàn)標(biāo)志碼:A
文章編號(hào):1001-3695(2010)06-2160-03
doi:10.3969/j.issn.1001-3695.2010.06.047
Using.NET framework’s namespace in Web application automatic testing
LEILei1, LU Xinquan1, LI Rui1, HONG Yu2
(1.PLAInternational Studies University, Nanjing 210039, China; 2.Institute of Command Automation, PLA University of Science Technology, Nanjing 210007, China)
Abstract:Generally, automate test tools supporting Web application are expensive, and their test scripts are hard to be maintained and reused. To solve this problem, this paper presented a method using NameSpace technology of .NET framework in Web application testing. This method realized Web application automatic testing though interface information collecting and interface invoking, and only required writing simple and easily maintained C#.NET code without using any thirdparty testing tools.
Key words:C#.NET; Name Space; automatic testing; Web application
隨著通信技術(shù)的發(fā)展,基于Internet平臺(tái)的Web應(yīng)用程序憑借著它強(qiáng)大的功能、靈活的交互性以及簡(jiǎn)單易用的特點(diǎn),深入到電信、通訊、銀行、商務(wù)、教育等各個(gè)領(lǐng)域中。Web應(yīng)用程序已經(jīng)在人們生活、學(xué)習(xí)、工作中起著越來(lái)越重要的作用,因此對(duì)Web應(yīng)用程序的可靠性有著越來(lái)越高的要求。但由于Web應(yīng)用程序復(fù)雜性日趨增長(zhǎng)、需求持續(xù)快速變化、采用分布式結(jié)構(gòu)等特點(diǎn),使得其在測(cè)試上有極大的難度。在傳統(tǒng)的手工測(cè)試方法中,測(cè)試設(shè)計(jì)、測(cè)試運(yùn)行全部由測(cè)試人員手工完成,工作量過(guò)重;而且在這一過(guò)程中,由于測(cè)試人員素質(zhì)與經(jīng)驗(yàn)的差別,在測(cè)試中加入過(guò)多的主觀因素。考慮到上面的因素,采用傳統(tǒng)的手工方法對(duì)Web應(yīng)用程序進(jìn)行測(cè)試很難取得令人滿意的結(jié)果。解決這一問(wèn)題最好的方法是實(shí)現(xiàn)Web應(yīng)用程序的自動(dòng)化測(cè)試。
目前市場(chǎng)上支持Web的測(cè)試工具通常存在價(jià)格偏高、測(cè)試腳本程序可重用性差、代碼維護(hù)量過(guò)大等不足,為解決這一問(wèn)題本文提出了應(yīng)用.NET框架命名空間(NameSpace)[1]技術(shù)實(shí)現(xiàn)Web應(yīng)用程序測(cè)試自動(dòng)化運(yùn)行的方法。該方法只要求測(cè)試人員編寫簡(jiǎn)單靈活的C#.NET測(cè)試腳本程序,腳本程序通過(guò).NET框架命名空間技術(shù)抽取所有Web接口的信息,然后通過(guò)對(duì)接口的調(diào)用實(shí)現(xiàn)測(cè)試自動(dòng)化運(yùn)行。Web測(cè)試的自動(dòng)化運(yùn)行可讓測(cè)試人員將更多的精力放在測(cè)試的設(shè)計(jì)上,進(jìn)一步提高測(cè)試的有效性。由于該方法編寫的C#.NET測(cè)試腳本程序只與Web應(yīng)用程序的接口進(jìn)行交互,具有很強(qiáng)的可重用性,極大地減少了Web應(yīng)用程序回歸測(cè)試在人力物力與時(shí)間上的花費(fèi)。
1 Web自動(dòng)化測(cè)試工具簡(jiǎn)介
測(cè)試的自動(dòng)化可以分為測(cè)試設(shè)計(jì)(測(cè)試用例生成)、測(cè)試運(yùn)行與測(cè)試結(jié)果分析的自動(dòng)化。在現(xiàn)實(shí)應(yīng)用中可用的測(cè)試設(shè)計(jì)與測(cè)試結(jié)果分析自動(dòng)化工具很少[2],原因是在對(duì)被測(cè)件進(jìn)行形式化描述過(guò)程中無(wú)法在完備性上達(dá)到100%。目前測(cè)試設(shè)計(jì)與測(cè)試結(jié)果分析的自動(dòng)化工具多采用基于模型的測(cè)試(modelbased testing)[3]技術(shù),并且多用于學(xué)術(shù)研究領(lǐng)域,如可嵌入Microsoft Word與Microsoft Visual Studio.NET框架使用的AsmL2[4];George Manson大學(xué)的SpecTest[5];Teradyne公司的TestMaster[6]等。
目前市場(chǎng)上支持Web的自動(dòng)化測(cè)試工具基本為測(cè)試自動(dòng)化運(yùn)行工具,從工作方式上可以分為兩類:a)采用“錄制/回放”式的工作方式,將測(cè)試人員對(duì)圖形用戶界面(graphic user interface, GUI)的操作錄制成測(cè)試腳本,通過(guò)對(duì)測(cè)試腳本的回放實(shí)現(xiàn)測(cè)試的自動(dòng)化,如Mercury公司的LoadRunner[7]、WinRunner[8]與應(yīng)用Ruby編寫的開源測(cè)試軟件Watir[9]等。這類工具使用相對(duì)容易,測(cè)試腳本中的代碼大部份由錄制器自動(dòng)生成,測(cè)試人員只需對(duì)生成的代碼進(jìn)行簡(jiǎn)單的修改,代碼維護(hù)量小。但由于其腳本程序記錄的是用戶對(duì)界面的操作,當(dāng)界面發(fā)生變化時(shí),舊的測(cè)試腳本便無(wú)法使用,測(cè)試人員不得不重新錄制測(cè)試腳本。Web應(yīng)用程序的最大特點(diǎn)之一就是需求持續(xù)快速變化,而且這種變化尤其體現(xiàn)在用戶界面上,所以這種測(cè)試工具在Web應(yīng)用程序的回歸測(cè)試應(yīng)用中存在著明顯的缺陷。b)通過(guò)記錄客戶端與服務(wù)器端之間的協(xié)議數(shù)據(jù),然后向特定終端發(fā)送特定的協(xié)議數(shù)據(jù)來(lái)實(shí)現(xiàn)測(cè)試的自動(dòng)化,如Borland公司的SilkPerformer[10]。這類工具在測(cè)試腳本中記錄的是Web應(yīng)用程序的各種協(xié)議數(shù)據(jù),它在回歸測(cè)試中較第一類工具明顯具有優(yōu)勢(shì)。但這類工具要求測(cè)試人員必須熟知被測(cè)件的內(nèi)部結(jié)構(gòu),在掌握協(xié)議全部字節(jié)意義的基礎(chǔ)上對(duì)自動(dòng)錄制的腳本程序進(jìn)行修改以實(shí)現(xiàn)自動(dòng)化。這類工具的代碼維護(hù)工作量過(guò)大,而且對(duì)測(cè)試人員的技術(shù)水平要求較高。
2 .NET框架命名空間在測(cè)試中的應(yīng)用
自.NET框架結(jié)構(gòu)出現(xiàn)以來(lái),所有采用Microsoft Visual Studio環(huán)境開發(fā)的軟件,不論采用何種.NET語(yǔ)言,最后都以同一種中間語(yǔ)言的形式存儲(chǔ),然后通過(guò)Microsoft的中間語(yǔ)言編譯器(intermediate language assembler)編譯發(fā)布。這樣做的好處是增加了軟件的跨平臺(tái)、跨語(yǔ)言、易移植等特點(diǎn)。從測(cè)試的角度考慮,中間語(yǔ)言的存在極大地提高了軟件的可測(cè)性。由于C#.NET是一種全新的完全基于.NET框架開發(fā)的高級(jí)語(yǔ)言,.NET框架的實(shí)現(xiàn)基礎(chǔ)——命名空間技術(shù)在C#.NET語(yǔ)言中得到完美的體現(xiàn)。在C#.NET中所有的類全部以層次式命名空間的形式存儲(chǔ),如System命名空間存儲(chǔ)所有基本的數(shù)據(jù)類、運(yùn)算類,是.NET中最大的一個(gè)命名空間; System.Drawing用來(lái)存儲(chǔ)所有用戶界面實(shí)現(xiàn)的類;System.IO命名空間用來(lái)存儲(chǔ)所有與輸入/輸出相關(guān)的類;System.IO.Compression命名空間存儲(chǔ)與流文件壓縮操作相關(guān)的類。
在所有這些命名空間中,System.Type是測(cè)試人員最感興趣的。System.Type也被叫做通用類系統(tǒng)(common type system, CTS)。System.Type提供的getTypes( )方法讓測(cè)試人員從中間語(yǔ)言中提取感興趣的信息。在C#.NET中g(shù)etTypes( )方法有三種重載的運(yùn)行方式,其參數(shù)可以是一個(gè)類名、一個(gè)文件名,甚至是一個(gè)內(nèi)存中正在運(yùn)行的進(jìn)程名。運(yùn)行代碼getTypes( )后,C#.NET還允許通過(guò)getFields( )、getMethods( )、getParameters( )方法分別獲取被測(cè)件中與類相關(guān)的屬性、方法及方法的參數(shù)。所有這些被提取的信息被存儲(chǔ)在System.Type提供的屬性變量中,如BaseType屬性變量負(fù)責(zé)存儲(chǔ)當(dāng)前類的基類名稱,F(xiàn)ullName屬性變量負(fù)責(zé)存儲(chǔ)當(dāng)前類的完整名稱(包括上層的命名空間),IsInterface布爾型屬性變量用來(lái)判斷當(dāng)前類是否為接口。
從以上可以看出,通過(guò)幾行簡(jiǎn)單的C#.NET代碼即可實(shí)現(xiàn)對(duì)接口關(guān)鍵信息的抽取,這些信息包括接口中所有的類、類中的屬性變量、類中的方法以及方法的所有參數(shù)與返回值的數(shù)據(jù)類型等。Web應(yīng)用程序的運(yùn)行過(guò)程是終端間進(jìn)行協(xié)議數(shù)據(jù)交互的過(guò)程,而協(xié)議數(shù)據(jù)的生成、發(fā)送與接收是由Web應(yīng)用程序的接口程序負(fù)責(zé)的。測(cè)試人員應(yīng)用C#.NET代碼抽取出Web應(yīng)用程序所有接口程序的詳細(xì)信息后,通過(guò)接口調(diào)用的方式即可驅(qū)動(dòng)Web應(yīng)用程序測(cè)試的自動(dòng)化運(yùn)行。
3 應(yīng)用.NET框架命名空間技術(shù)實(shí)現(xiàn)Web應(yīng)用程序測(cè)試的自動(dòng)化運(yùn)行
下面通過(guò)一個(gè)簡(jiǎn)化的Web視頻播放程序(圖1)來(lái)說(shuō)明應(yīng)用.NET框架的命名空間技術(shù)實(shí)現(xiàn)Web應(yīng)用程序測(cè)試的自動(dòng)化運(yùn)行方法。
程序由用戶端(user terminal,UT)、頁(yè)面服務(wù)器(Web server,WS)和存款服務(wù)器(credit server,CS)三個(gè)組件構(gòu)成,組件之間通過(guò)UTWS、WSCS、WSUT與CSWS四個(gè)接口通信。程序準(zhǔn)許用戶在登錄后進(jìn)行視頻訂購(gòu)與播放操作,并以小時(shí)計(jì)費(fèi)。程序的一般流程如圖2描述的時(shí)序交互圖所示。
用戶在用戶端進(jìn)行登錄操作,UT向WS發(fā)出登錄命令UW_Login(userID:int),userID為用戶的標(biāo)志。WS收到登錄命令后向WC發(fā)送WC_Login(userID:int)命令以獲取該用戶存款信息,即還有多少余款。如果用戶存在,CS向WS發(fā)回CW_Info(userID:int, totalCreidt:double):true命令,WS向UT發(fā)出WU_Info (userID:int, totalCreidt:double):true確定登錄成功,并顯示用戶的余額totalCredit;如果用戶不存在,即userID非法,則分別返回CW_Info(userID:int, totalCreidt:double):1與WU_Info(userID:int,totalCreidt:double):1命令以示登錄失敗。如果登錄成功,UT通過(guò)UW_Order(userID:int,orderID:int)訂購(gòu)待播放的視頻,WS發(fā)回WU_PlayOrder (credit:double,userID:int,orderID:int)命令為用戶播放其訂購(gòu)的視頻,credit為正在播放視頻以小時(shí)計(jì)費(fèi)的單價(jià)。由于用戶的余款有限,在播放過(guò)程中有兩種可能:播放時(shí)間過(guò)長(zhǎng),用戶余款不足,WS發(fā)出WU_CancelOrder(userID:int,orderID:int)取消用戶播放;用戶在余款不足時(shí)停止播放,UT發(fā)出WU_CancelOrder (userID:int,orderID:int)命令。播放完成時(shí)WS向中CS發(fā)出WC_ModifyCredit(userID:int,totalCredit:double)修改用戶余額,用戶通過(guò)UW_Logout(userID:int)命令退出系統(tǒng)。
在本例中測(cè)試人員雖然獲取了被測(cè)件的組件圖與時(shí)序交互圖,但并不知道接口在命名空間中的位置、接口的運(yùn)行環(huán)境等必要信息,而且在大部分情況下測(cè)試人員只能拿到被測(cè)件及其需求文檔,無(wú)法立刻開始測(cè)試腳本的編寫。本例中測(cè)試人員需將測(cè)試腳本分成兩部分編寫:首先對(duì)接口程序UT_WS與WS_UT進(jìn)行信息抽取,然后通過(guò)調(diào)用該接口程序以驅(qū)動(dòng)整個(gè)Web應(yīng)用程序測(cè)試運(yùn)行。第一部分代碼如下(以抽取UT_WS接口信息為例,并假設(shè)Webplay為視頻播放程序的最上層命名空間):
System.Type[] tps = UT_WS.GetTypes( );
//提取UT_WS接口中的所有類
foreach ( Type tp in tps)
{
FieldInfo[] flds = tp.GetFields();//提取類中所有屬性變量
MethodInfo[] mthds = tp.GetMethods();//提取類中所有方法
Foreach ( Methodinfo mthd in mthds)
{
ParameterInfo[] prmts = mthd.GetParameters();
//提取方法中的所有參數(shù)
}
}
上面的代碼將接口所有類存儲(chǔ)在tps中,與類對(duì)應(yīng)的屬性變量存儲(chǔ)在flds中,將所有的方法存儲(chǔ)在mthds中,將與方法對(duì)應(yīng)的參數(shù)存儲(chǔ)在prmts中。測(cè)試人員可以在本段代碼最后通過(guò)設(shè)置斷點(diǎn)方式查看這些數(shù)據(jù)的內(nèi)容以獲取調(diào)用Web接口的足夠信息。當(dāng)然測(cè)試人員還可以根據(jù)需要將抽取后的信息設(shè)計(jì)成TXT、Excel等格式的數(shù)據(jù)文件存儲(chǔ)以方便讀取,也可以實(shí)現(xiàn)數(shù)據(jù)驅(qū)動(dòng)的測(cè)試自動(dòng)化,數(shù)據(jù)文件的生成與讀取可以通過(guò)編寫代碼自動(dòng)完成,這一部分不是本文的重點(diǎn),不再詳細(xì)介紹。
當(dāng)?shù)谝徊糠执a運(yùn)行完畢后,測(cè)試人員已掌握了UT_WS與WS_UT兩接口的所有方法與相應(yīng)參數(shù),第二部分的工作就是如何調(diào)用這些接口中的方法。根據(jù)組件圖與時(shí)序圖的描述,測(cè)試人員為測(cè)試程序的正常流程一般會(huì)設(shè)計(jì)三個(gè)測(cè)試用例(如果考慮到異常情況,測(cè)試用例不止三個(gè)),代碼如下:
a)登錄不成功
Webplay. UT_WS.US_Login(userid); //userid為不存在的用戶ID
b)登錄成功,用戶主動(dòng)停止播放
Webplay. UT_WS.UW_Login(userid); //userid為合法的用戶ID
Webplay. UT_WS.UW_Order(userid,orderid)
//orderid為待播放視頻ID
Webplay. UT_WS.UW_CancelOrder(userid,orderid)
//用戶主動(dòng)停止播放
Webplay. UT_WS.UW_Logout(userid); //用戶退出系統(tǒng)
c)登錄成功,服務(wù)器停止播放
Webplay. UT_WS.UW_Login(userid); //userid為存在的用戶ID
Webplay. UT_WS.UW_Order(userid,orderid)//orderid為待播放視頻ID
Webplay. WS_UT.WU_CancelOrder(userid,orderid)//服務(wù)器停止播放
Webplay. UT_WS.UW_Logout(userid);//用戶退出系統(tǒng)
以上所有代碼只列出了腳本程序中最關(guān)鍵的片段,完整的程序應(yīng)包括命名空間聲明、變量聲明、被測(cè)程序代碼引用等。通過(guò)本例可以看出,應(yīng)用.NET的命名空間技術(shù),測(cè)試人員只需編寫簡(jiǎn)單的C#.NET代碼即可實(shí)現(xiàn)Web應(yīng)用程序測(cè)試的自動(dòng)化運(yùn)行。
4 實(shí)驗(yàn)比較
為證明.NET框架命名空間技術(shù)在Web軟件自動(dòng)化測(cè)試中的應(yīng)用價(jià)值,筆者曾經(jīng)做過(guò)多項(xiàng)測(cè)試實(shí)驗(yàn),下面將列舉其中具有代表性的兩項(xiàng)實(shí)驗(yàn)結(jié)果。
第一項(xiàng)實(shí)驗(yàn)中,將命名空間技術(shù)與開源Web測(cè)試工具Watir相比較,共同應(yīng)用在解放軍某部開發(fā)的缺陷管理系統(tǒng)的測(cè)試過(guò)程中。該系統(tǒng)采用B/S結(jié)構(gòu),在完成缺陷報(bào)告、跟蹤、分配等多種缺陷管理功能的基礎(chǔ)上,具有自動(dòng)化郵件通知、工作流程自定義、BBS等子功能,其應(yīng)用到了多種常用的Web服務(wù)功能。第二項(xiàng)實(shí)驗(yàn)中,將命名空間技術(shù)與如Borland公司的SilkPerformer進(jìn)行比較,測(cè)試對(duì)象是專門為實(shí)驗(yàn)而編寫的具有主要功能的簡(jiǎn)化網(wǎng)絡(luò)圖書館管理系統(tǒng),該系統(tǒng)只具有圖書購(gòu)置、分目、編碼、錯(cuò)閱、查詢功能。為保證實(shí)驗(yàn)結(jié)果的有效性,在這兩項(xiàng)實(shí)驗(yàn)中均采用覆蓋所有功能(充分考慮正常與異常情況)的原則設(shè)計(jì)與生成測(cè)試用例。表1列出了兩項(xiàng)實(shí)驗(yàn)的結(jié)果。
表1 對(duì)比實(shí)驗(yàn)結(jié)果
實(shí)驗(yàn)比較項(xiàng).NET框架命名空間技術(shù)WatirSilkPerformer
實(shí)驗(yàn)1用例數(shù)1 317956
(缺陷管理系統(tǒng))發(fā)現(xiàn)缺陷數(shù)142101
實(shí)驗(yàn)2用例數(shù)338196
(網(wǎng)絡(luò)圖書館管理系統(tǒng))發(fā)現(xiàn)缺陷數(shù)4534
從表1的實(shí)驗(yàn)結(jié)果可以看出,應(yīng)用命名空間技術(shù)生成的測(cè)試用例數(shù)與發(fā)現(xiàn)的錯(cuò)誤數(shù)上遠(yuǎn)遠(yuǎn)大于其他種工具,這是由于應(yīng)用命名空間技術(shù)在測(cè)試過(guò)程中實(shí)現(xiàn)了接口參數(shù)信息的自動(dòng)抽取,使得生成的用例充分地考慮相關(guān)參數(shù)的所有可能組合,這一點(diǎn)是人工很難做到的。但通過(guò)對(duì)實(shí)驗(yàn)結(jié)果的進(jìn)一步分析發(fā)現(xiàn),命名空間技術(shù)很難發(fā)現(xiàn)用戶界面錯(cuò)誤,這是由于其采用了直接在接口中輸入數(shù)據(jù)以驅(qū)動(dòng)測(cè)試運(yùn)行,這種方式跳過(guò)了用戶操作界面的過(guò)程。
5 結(jié)束語(yǔ)
應(yīng)用.NET空間技術(shù)實(shí)現(xiàn)Web應(yīng)用程序測(cè)試的自動(dòng)化運(yùn)行方法有很高的應(yīng)用價(jià)值:可以應(yīng)用于任何采用.NET編寫的或采用.NET的Web應(yīng)用程序;測(cè)試腳本程序相對(duì)簡(jiǎn)單,代碼易于維護(hù),不受用戶界面的影響;測(cè)試人員無(wú)須對(duì)被測(cè)件的內(nèi)部有太多了解,必要信息由腳本自動(dòng)抽取;靈活性高,通過(guò)對(duì)測(cè)試腳本更改可以實(shí)現(xiàn)數(shù)據(jù)驅(qū)動(dòng)等多種測(cè)試技術(shù);測(cè)試花費(fèi)小,不需要第三方測(cè)試軟件。
目前筆者已經(jīng)實(shí)現(xiàn)了被測(cè)件信息提取的自動(dòng)化與測(cè)試運(yùn)行的自動(dòng)化,為進(jìn)一步提高測(cè)試自動(dòng)化水平,如何根據(jù)提取的信息實(shí)現(xiàn)測(cè)試數(shù)據(jù)的自動(dòng)生成是未來(lái)的主要工作。
參考文獻(xiàn):
[1]SHARP J. C#從入門到精通[M]. 北京:清華出版社, 2006.
[2]BERTOLINO A. Software testing research: achievements, challenges, dreams[C]//Proc of International Conference on Future Software Engineering .Washington DC: IEEE Computer Society, 2007:85-103.
[3]UTTING M, PRESCHNER A, LEGEARD B. A taxonomy of modelbased testing [J/OL]. [2006-04]. http://www.cs.waikato.ac.nz/pubs/wp/2006/uowcswp-2006-04.pdf.
[4]BARNETT M, GRIESKAMP W, NACHMANSON L, et al. Modelbased testing with AsmL.NET framework [R]. [S.l]: Microsoft Research, 2003.
[5]HARTMAN A. Modelbased testing generation tools[EB/OL]. [2002-10-06].http://www.agedis.de/documents/ModelBasedTestGenerationTools_cs.pdf.
[6]STEPHENSON M, LYNCH T, WALTERSS. Using advanced tools to automate the design, generation and execution of formal qualification testing[C]//Proc of Test Technology and Commercialization Conference.1996:160-165.
[7]伊文斌,鄭劍. 基于LoadRunner的Web負(fù)載測(cè)試[J]. 江西理工大學(xué)學(xué)報(bào), 2008(4):13-15.
[8]樂(lè)翊舟. WinRunner在網(wǎng)管自動(dòng)化測(cè)試中的應(yīng)用[J]. 電信網(wǎng)技術(shù), 2002(5):26-30.
[9]KOHL J, RRGERS P. Watir works[J]. Better Softwares Magazine, 2005(4):40-45.
[10]Borland Software Corporation. Borland SilkPerformer[R/OL]. [2006-02].http://www.borland.com/resources/en/pdf/products/silk/silkperformer_datasheet.pdf.