面向winform_control的自動(dòng)化測(cè)試框架的設(shè)計(jì)與實(shí)現(xiàn)-畢業(yè)設(shè)計(jì)_第1頁(yè)
已閱讀1頁(yè),還剩68頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、<p><b>  摘要</b></p><p>  隨著控件技術(shù)的不斷發(fā)展,用戶對(duì)WinForm Control的需求不斷增加,使得WinForm Control逐漸產(chǎn)品化,一批以WinForm Control為產(chǎn)品的公司或者部門(mén)的建立更加推動(dòng)了其快速發(fā)展。與此同時(shí),也給WinForm Control的自動(dòng)化測(cè)試提出了新的要求。目前,現(xiàn)有的用于WinForm Control自動(dòng)化

2、測(cè)試的自動(dòng)化測(cè)試框架都是單元測(cè)試框架,只能用于測(cè)試WinForm Control的基本屬性、方法和事件,而其他測(cè)試只能手動(dòng)進(jìn)行,因此,開(kāi)發(fā)一套面向WinForm Control的自動(dòng)化測(cè)試框架是非常有必要的。</p><p>  本文深入研究了WinForm Control的特點(diǎn),詳細(xì)分析了WinForm Control自動(dòng)化測(cè)試的原理及過(guò)程,對(duì)現(xiàn)有的單元測(cè)試框架做了簡(jiǎn)單的介紹,通過(guò)研究,在單元測(cè)試框架NUnit

3、的基礎(chǔ)上,著重處理鼠標(biāo)和鍵盤(pán)的交互操作,并將GUI測(cè)試思想應(yīng)用到WinForm Control的自動(dòng)化測(cè)試中,將WinForm Control的各個(gè)組成部分抽象成一個(gè)ComponentGUI,讓測(cè)試人員可以方便地定位控件并進(jìn)行自動(dòng)化測(cè)試,最終實(shí)現(xiàn)了面向WinForm Control的自動(dòng)化測(cè)試框架。整個(gè)框架在設(shè)計(jì)上充分考慮了代碼的可復(fù)用性、可移植性和可維護(hù)性。目前,該自動(dòng)化測(cè)試框架已經(jīng)在日本多家控件公司投入使用,達(dá)到實(shí)用化水平。<

4、/p><p>  關(guān)鍵詞:WinForm Control 自動(dòng)化測(cè)試 GUI Input</p><p><b>  Abstract</b></p><p>  With the continuous development of control techniques and the increasing demand for WinFo

5、rm Control,WinForm Control is gradually commercialized in recent years,and the establishment of a group of corporations or departments taking WinForm Control as their product further promotes its rapid development. Meanw

6、hile, new requirements of automatic testing of WinForm Control have been arisen. At present,existing automatic testing frameworks for WinForm Control are all unit testing frameworks,which can</p><p>  In thi

7、s article,the features of WinForm Control are firstly introduced,then,the principles and procedures of automatic testing for WinForm Control are discussed in detail and existing unit testing frameworks are also introduce

8、d briefly. Finally,a new automatic testing framework for WinForm Control is introduced. The new framework is mainly based on the following ideas:on the basis of the unit testing framework NUnit,focusing on the handling o

9、f the interactive operations of keyboard and mouse;and</p><p>  KeyWords: WinForm Control Automatic Testing GUI Input</p><p><b>  目錄</b></p><p><b>  第一章 緒論1&

10、lt;/b></p><p>  1.1 研究背景1</p><p>  1.2 國(guó)內(nèi)外現(xiàn)狀2</p><p>  1.3 課題的意義2</p><p>  1.4 論文的工作和結(jié)構(gòu)3</p><p>  第二章 WinForm Control及常用單元測(cè)試框架5</p><p>

11、;  2.1 WinForm Control的定義及分類5</p><p>  2.1.1 WinForm Control的定義5</p><p>  2.1.2 WinForm Control的分類6</p><p>  2.2 常用單元測(cè)試框架9</p><p>  2.2.1 JUnit測(cè)試框架原理9</p>&

12、lt;p>  2.2.2 CppUnit測(cè)試框架原理12</p><p>  2.2.3 NUnit測(cè)試框架原理13</p><p>  2.2.4 XUnit.net測(cè)試框架原理15</p><p><b>  2.3 小結(jié)16</b></p><p>  第三章 WinForm Control自動(dòng)化測(cè)試

13、研究與分析17</p><p>  3.1 WinForm Control自動(dòng)化測(cè)試原理分析17</p><p>  3.1.1 基本屬性、方法和事件的測(cè)試17</p><p>  3.1.2 鼠標(biāo)和鍵盤(pán)相關(guān)事件的測(cè)試20</p><p>  3.1.3 GUI測(cè)試24</p><p>  3.2 WinFo

14、rm Control自動(dòng)化測(cè)試的流程26</p><p>  3.3 WinForm Control自動(dòng)化測(cè)試的優(yōu)點(diǎn)26</p><p><b>  3.4 小結(jié)27</b></p><p>  第四章 面向WinForm Control的自動(dòng)化測(cè)試框架的設(shè)計(jì)29</p><p>  4.1 GUI測(cè)試框架的設(shè)計(jì)

15、29</p><p>  4.2 Input測(cè)試框架的設(shè)計(jì)35</p><p>  4.2.1 鼠標(biāo)輸入測(cè)試框架的設(shè)計(jì)35</p><p>  4.2.2 鍵盤(pán)輸入測(cè)試框架的設(shè)計(jì)38</p><p>  4.3 結(jié)果比較方法的設(shè)計(jì)40</p><p>  4.4 面向WinForm Control的自動(dòng)化測(cè)試

16、框架的優(yōu)點(diǎn)41</p><p><b>  4.5 小結(jié)42</b></p><p>  第五章 面向WinForm Control的自動(dòng)化測(cè)試框架的驗(yàn)證45</p><p>  5.1 制定測(cè)試用例45</p><p>  5.2 編寫(xiě)測(cè)試腳本46</p><p>  5.3 運(yùn)行測(cè)試

17、腳本51</p><p>  5.4 生成測(cè)試報(bào)告53</p><p><b>  5.5 小結(jié)54</b></p><p>  第六章 結(jié)束語(yǔ)55</p><p><b>  致謝57</b></p><p><b>  參考文獻(xiàn)59</b>

18、;</p><p><b>  第一章 緒論</b></p><p>  隨著計(jì)算機(jī)技術(shù)的發(fā)展,人們對(duì)軟件產(chǎn)品的質(zhì)量有了更高的要求,因此軟件測(cè)試工作在整個(gè)軟件開(kāi)發(fā)的過(guò)程中也越發(fā)重要。從繁雜的手工測(cè)試到實(shí)用性強(qiáng)的自動(dòng)化測(cè)試,從最初只提供簡(jiǎn)單的捕捉/回放功能的測(cè)試工具到功能和靈活性更強(qiáng)的測(cè)試腳本工具,自動(dòng)化測(cè)試已經(jīng)取得了很大的進(jìn)步[2]。但隨著軟件規(guī)模的不斷擴(kuò)大,軟件類型

19、的不斷增多,人們希望自動(dòng)化測(cè)試能夠更加高效和簡(jiǎn)便。自動(dòng)化測(cè)試框架的出現(xiàn),加速了自動(dòng)化腳本的生成,提高腳本的可維護(hù)性,加速腳本執(zhí)行效率等,目的是減少實(shí)現(xiàn)和維護(hù)的成本,使測(cè)試人員可以把精力集中在應(yīng)用程序的測(cè)試用例設(shè)計(jì)上,而不是開(kāi)發(fā)測(cè)試。</p><p><b>  1.1 研究背景</b></p><p>  2001年后,.NET Framework2.0的誕生,人們將

20、它看作是多年來(lái)最重要的新技術(shù)。.NET Framework以多種方式對(duì)面向組件的開(kāi)發(fā)模式做了強(qiáng)而有力的支持。.NET Framework為開(kāi)發(fā)人員提供了兩種控件支持:一種是Web Control,一種是WinForm Control[15]。其中WinForm Control是目前發(fā)展最快,應(yīng)用最廣泛的。.NET Framework使得開(kāi)發(fā)人員可以通過(guò)將多個(gè)標(biāo)準(zhǔn)WinForm Control組合,而定制出符合用戶需求的應(yīng)用程序。開(kāi)發(fā)人員

21、還可以通過(guò)繼承某個(gè)標(biāo)準(zhǔn)WinForm Control,附加新的功能與業(yè)務(wù)邏輯滿足自己的需要。更高級(jí)的開(kāi)發(fā)人員可以直接從.NET Framework提供的Control基類派生出自定義的WinForm Control(Custom Control)[20]。盡管面向組件的開(kāi)發(fā)模式和.NET Framework的支持,使得WinForm Control的開(kāi)發(fā)人員以及廠商獲取了更多的好處,但卻給WinForm Control的測(cè)試工作帶

22、來(lái)了很多困難,因?yàn)槟壳笆袌?chǎng)上并不存在面向WinForm C</p><p><b>  1.2 國(guó)內(nèi)外現(xiàn)狀</b></p><p>  目前,可用于對(duì)WinForm Control的基本屬性、方法和事件進(jìn)行自動(dòng)化測(cè)試的單元測(cè)試框架很多,常用的單元測(cè)試框架根據(jù)開(kāi)發(fā)語(yǔ)言不同,可分為[13]:</p><p>  1 JUnit:JUnit就是為Ja

23、va程序開(kāi)發(fā)者實(shí)現(xiàn)單元測(cè)試提供一種框架,使得Java單元測(cè)試更規(guī)范有效,并且更有利于測(cè)試的集成。此框架是由Alan Ray和Erich Gamma開(kāi)發(fā)的。</p><p>  2 CppUnit:CppUnit是從著名的JUnit框架為C++移植過(guò)來(lái)的。是由Michael Feathers開(kāi)發(fā)的。</p><p>  3 Microsoft.NET Framework提供的單元測(cè)試框架,包

24、括:NUnit、CsUnit、MbUnit和XUnit.net。許多.NET開(kāi)發(fā)人員都或多或少有一些使用NUnit的經(jīng)驗(yàn),它是.NET的一個(gè)最主要的單元測(cè)試框架,是由James Newkirk所開(kāi)發(fā)的。雖然NUnit涵蓋了.NET應(yīng)用程序單元測(cè)試的大多數(shù)必要情景,但MbUnit可以讓單元測(cè)試更進(jìn)一步。MbUnit是由Jonathan “Peli” de Halleux首先編寫(xiě)的一個(gè)開(kāi)源單元測(cè)試框架。最新推出的單元測(cè)試框架為XUnit.n

25、et,此框架從現(xiàn)有框架中脫穎而出的因素有很多。最重要的一點(diǎn)是,它是由James Newkirk和Brad Wilson構(gòu)建的。Newkirk是Microsoft負(fù)責(zé)CodePlex項(xiàng)目的產(chǎn)品經(jīng)理,曾幫助構(gòu)建NUnit,他撰寫(xiě)了大量有關(guān)于單元測(cè)試的書(shū)籍。Brad Wilson是thedotguy上的一位資深博客作者,模式和實(shí)施方案小組的前成員,還是Microsoft的特別員工。這一全新框架的目標(biāo)是利用在過(guò)去五年內(nèi)積累的有關(guān)單元測(cè)試的最佳實(shí)

26、踐,構(gòu)建一種能體現(xiàn)并鼓勵(lì)這些實(shí)踐的全新框架[23</p><p><b>  1.3 課題的意義</b></p><p>  目前,單元測(cè)試框架技術(shù)一直在不斷發(fā)展,現(xiàn)有的單元測(cè)試框架也一直在被更新和改進(jìn),但隨著WinForm Control的類型和復(fù)雜度不斷增加,現(xiàn)有的單元測(cè)試框架無(wú)法準(zhǔn)確定位WinForm Control,尤其是無(wú)法獲取WinForm Control

27、的各個(gè)組成部分信息并進(jìn)行測(cè)試,而且現(xiàn)有的單元測(cè)試框架也無(wú)法模擬鼠標(biāo)和鍵盤(pán)的操作,因此無(wú)法測(cè)試用鼠標(biāo)和鍵盤(pán)對(duì)WinForm Control操作后的結(jié)果是否正確,也無(wú)法監(jiān)聽(tīng)鼠標(biāo)或鍵盤(pán)觸發(fā)的事件是否正確,驗(yàn)證數(shù)據(jù)和腳本代碼維護(hù)也有諸多不便,由此可見(jiàn),現(xiàn)有的單元測(cè)試框架已經(jīng)無(wú)法滿足現(xiàn)有WinForm Control的自動(dòng)化測(cè)試需求。本人通過(guò)在西安某控件開(kāi)發(fā)公司一年的實(shí)習(xí),在NUnit單元測(cè)試框架的基礎(chǔ)上,設(shè)計(jì)并實(shí)現(xiàn)了GUI測(cè)試框架和Input測(cè)

28、試框架,最終成功開(kāi)發(fā)了這套面向WinForm Control的自動(dòng)化測(cè)試框架,此框架不僅基本解決了現(xiàn)有WinForm Control自動(dòng)化測(cè)試存在的問(wèn)題,而且對(duì)于面向控件的自動(dòng)化測(cè)試框架的研究具有長(zhǎng)遠(yuǎn)的現(xiàn)實(shí)意義。目前,該框架已被很多日本控件公司投入使用,取得了良好的市場(chǎng)反映。</p><p>  1.4 論文的工作和結(jié)構(gòu)</p><p>  本論文選題來(lái)自西安某控件開(kāi)發(fā)公司基于面向WinF

29、orm Control的自動(dòng)化測(cè)試系統(tǒng)研發(fā)項(xiàng)目。</p><p>  本人在WinForm Control自動(dòng)化測(cè)試的研究與設(shè)計(jì)自動(dòng)化測(cè)試框架的工作經(jīng)歷了四個(gè)主要階段:</p><p>  第一階段:學(xué)習(xí)階段。在原有單元測(cè)試框架的理論基礎(chǔ)上,進(jìn)一步對(duì)NUnit單元測(cè)試框架進(jìn)行了深入學(xué)習(xí),閱讀了大量自動(dòng)化測(cè)試及WinForm Control開(kāi)發(fā)技術(shù)的書(shū)籍,為后續(xù)的工作奠定了良好的專業(yè)理論基礎(chǔ)

30、。同時(shí),為了更好地進(jìn)行自動(dòng)化測(cè)試框架的設(shè)計(jì),學(xué)習(xí)了C#語(yǔ)言和相關(guān)開(kāi)發(fā)工具。</p><p>  第二階段:研究階段。對(duì)WinForm Control的測(cè)試特點(diǎn)進(jìn)行分析和研究,總結(jié)了WinForm Control自動(dòng)化測(cè)試的特點(diǎn)和原理,并給出了WinForm Control自動(dòng)化測(cè)試的流程,為WinForm Control自動(dòng)化測(cè)試框架的設(shè)計(jì)提供了明確方案。</p><p>  第三階段:設(shè)

31、計(jì)階段。根據(jù)目前WinForm Control自動(dòng)化測(cè)試存在的問(wèn)題,在之前研究方案的基礎(chǔ)上,設(shè)計(jì)了GUI測(cè)試框架和Input測(cè)試框架,最終實(shí)現(xiàn)了面向WinForm Control的自動(dòng)化測(cè)試框架。</p><p>  第四階段:驗(yàn)證階段。通過(guò)幾個(gè)典型的測(cè)試用例,證明了面向WinForm Control的自動(dòng)化測(cè)試框架的實(shí)用性。</p><p>  根據(jù)所完成的工作,將論文結(jié)構(gòu)安排如下:&l

32、t;/p><p><b>  第一章 緒論</b></p><p>  本章首先分析了課題的研究背景,然后通過(guò)介紹國(guó)內(nèi)外現(xiàn)有的單元測(cè)試框架,分析了現(xiàn)有的單元測(cè)試框架無(wú)法滿足WinForm Control自動(dòng)化測(cè)試需求的原因,闡明了開(kāi)發(fā)一套面向WinForm Control的自動(dòng)化測(cè)試框架的意義,最后對(duì)論文的工作進(jìn)行了總結(jié)以及對(duì)各章節(jié)內(nèi)容進(jìn)行了安排。</p>

33、<p>  第二章 WinForm Control及常用單元測(cè)試框架</p><p>  本章介紹了WinForm Control的定義及分類,并分析了幾個(gè)常用的單元測(cè)試框架的原理。</p><p>  第三章 WinForm Control自動(dòng)化測(cè)試研究與分析</p><p>  本章根據(jù)WinForm Control的特點(diǎn),研究總結(jié)了WinForm C

34、ontrol自動(dòng)化測(cè)試的原理,著重研究了鼠標(biāo)和鍵盤(pán)的事件處理,提出了WinForm Control的GUI測(cè)試思想,并給出了WinForm Control自動(dòng)化測(cè)試的流程及分析了WinForm Control自動(dòng)化測(cè)試的優(yōu)點(diǎn)。</p><p>  第四章 面向WinForm Control的自動(dòng)化測(cè)試框架的設(shè)計(jì)</p><p>  本章詳細(xì)描述了如何對(duì)GUI測(cè)試框架和Input測(cè)試框架進(jìn)行

35、設(shè)計(jì)實(shí)現(xiàn),以及對(duì)結(jié)果比較方法的設(shè)計(jì)實(shí)現(xiàn),并分析了面向WinForm Control的自動(dòng)化測(cè)試框架的優(yōu)點(diǎn)。</p><p>  第五章 面向WinForm Control的自動(dòng)化測(cè)試框架的驗(yàn)證</p><p>  本章將此框架運(yùn)用于WinForm Control的自動(dòng)化測(cè)試工作中,根據(jù)具體的測(cè)試用例,運(yùn)用此框架編寫(xiě)測(cè)試腳本,根據(jù)腳本運(yùn)行的情況及測(cè)試結(jié)果報(bào)告,驗(yàn)證了框架的正確性和實(shí)用性。&l

36、t;/p><p><b>  第六章 結(jié)束語(yǔ)</b></p><p>  本章一方面對(duì)本文所研究的項(xiàng)目加以總結(jié),另一方面提出進(jìn)一步改進(jìn)和完善該項(xiàng)目的方法。希望能有更多更好的面向控件領(lǐng)域的自動(dòng)化測(cè)試框架推出,并投入實(shí)際生產(chǎn)當(dāng)中。</p><p>  第二章 WinForm Control及常用單元測(cè)試框架</p><p>  

37、2.1 WinForm Control的定義及分類</p><p>  控件(Control)是在圖形用戶界面(GUI)中屏幕上的一種對(duì)象,用戶可操作該對(duì)象來(lái)執(zhí)行某一行為。 控件是用戶可與之交互以輸入或操作數(shù)據(jù)的對(duì)象。控件通常出現(xiàn)在對(duì)話框中或工具欄上[16]。WinForm Control是控件的一種,目前,對(duì)于WinForm Control的應(yīng)用非常廣泛。</p><p>  2.1.1

38、 WinForm Control的定義</p><p>  .NET Framework為開(kāi)發(fā)人員提供了兩種控件支持。一種是Web Control,一種是WinForm Control。顧名思義,Web Control是Web開(kāi)發(fā)所需要的控件產(chǎn)品,而WinForm Control則是在設(shè)計(jì)和開(kāi)發(fā)Windows應(yīng)用程序時(shí),用到的控件[17]。</p><p>  WinForm Contro

39、l是可重用的控件,它們封裝了用戶界面的功能,可以在基于Windows的客戶端應(yīng)用程序中使用?!癢indows窗體”不僅提供了許多現(xiàn)成控件,還提供了自行開(kāi)發(fā)控件的基礎(chǔ)結(jié)構(gòu)??梢越M合現(xiàn)有控件、擴(kuò)展現(xiàn)有控件或創(chuàng)作自己的自定義控件。</p><p>  WinForm Control是從System.Windows.Forms.Control直接或間接派生的類。以下列表描述了開(kāi)發(fā)Windows窗體控件的常見(jiàn)方案[9]:&

40、lt;/p><p>  1 組合現(xiàn)有控件來(lái)創(chuàng)作一個(gè)復(fù)合控件。</p><p>  復(fù)合控件封裝有一個(gè)可以作為控件重復(fù)使用的用戶界面。其中的一個(gè)示例就是由文本框和重置按鈕組成的控件??梢暬O(shè)計(jì)器為創(chuàng)建復(fù)合控件提供了有力的支持。若要?jiǎng)?chuàng)作復(fù)合控件,請(qǐng)從System.Windows.Forms.UserControl派生?;怳serControl為子控件提供了鍵盤(pán)路由并使子控件可以作為一個(gè)組進(jìn)行工作

41、。</p><p>  2 擴(kuò)展現(xiàn)有控件,對(duì)其進(jìn)行自定義或?yàn)槠涮砑庸δ堋?lt;/p><p>  一個(gè)不能更改顏色的按鈕和一個(gè)具有跟蹤點(diǎn)擊次數(shù)屬性的按鈕就是擴(kuò)展控件的具體示例??梢酝ㄟ^(guò)從任何Windows窗體控件派生控件并重寫(xiě)或添加屬性、方法和事件的方式來(lái)自定義Windows窗體控件。</p><p>  3 創(chuàng)作一個(gè)不是通過(guò)組合或擴(kuò)展現(xiàn)有控件而形成的控件。</p

42、><p>  在這種方案中,需從基類Control派生控件??梢蕴砑雍椭貙?xiě)基類的屬性、方法和事件。</p><p>  4 WinForm Control的基類提供了客戶端基于Windows的應(yīng)用程序中的可視顯示所需的機(jī)制。Control提供窗口句柄,處理消息路由,并提供鼠標(biāo)和鍵盤(pán)事件以及許多其他用戶界面事件。還提供了高級(jí)布局,并具有特定于可視顯示的屬性,如ForeColour、BackCol

43、our、Height、Width和許多其他屬性。此外,它還提供了安全性、線程支持以及與ActiveX控件的交互性。由于基類提供了很多基礎(chǔ)結(jié)構(gòu),使得開(kāi)發(fā)自己的Windows窗體控件變得相對(duì)簡(jiǎn)單。</p><p>  2.1.2 WinForm Control的分類</p><p>  目前,微軟已經(jīng)推出三代控件,分別是:</p><p>  1 ActiveX控件:A

44、ctiveX控件是微軟公司提供的功能強(qiáng)大的程序設(shè)計(jì)和開(kāi)發(fā)技術(shù),是COM組件開(kāi)發(fā)技術(shù)的重要組成部分。它是OLE的第三個(gè)版本,對(duì)原先OLE控件的最大擴(kuò)展是增加了Internet功能,它不僅可以在支持OLE控件的容器中使用,更可以作為一個(gè)Internet控件,直接成為網(wǎng)頁(yè)的一部分。另外,ActiveX控件作為一種可重用的組件,相當(dāng)于一個(gè)封裝好的代碼模塊,它是通過(guò)其方法、屬性、事件來(lái)與應(yīng)用程序進(jìn)行通信的,此外,ActiveX控件是與開(kāi)發(fā)語(yǔ)言無(wú)關(guān)

45、的。用戶在使用控件時(shí)不必考慮它是VC還是用VB等其它語(yǔ)言開(kāi)發(fā)的,應(yīng)用程序都是通過(guò)COM與控件進(jìn)行通信的[19]??梢?jiàn),任何支持ActiveX控件的軟件平臺(tái)上都可以使用ActiveX控件,它使得不同廠商所開(kāi)發(fā)的控件可以真正地組裝在一起,從而令軟件的生產(chǎn)過(guò)程類似于硬件業(yè)的各個(gè)插件的裝配過(guò)程一樣,實(shí)現(xiàn)了軟件的工業(yè)化,大大降低了軟件的開(kāi)發(fā)成本,極大地提高了軟件的生產(chǎn)效率,實(shí)現(xiàn)了軟件資源的共享。</p><p>  2 C

46、OM控件:COM組件是以WIN32動(dòng)態(tài)鏈接庫(kù)(DLL)或可執(zhí)行文件(EXE)形式發(fā)布的可執(zhí)行代碼組成,它是遵循COM規(guī)范編寫(xiě)的,是一些小的二進(jìn)制可執(zhí)行文件,COM控件可以給應(yīng)用程序、操作系統(tǒng)以及其他組件提供服務(wù)。自定義的COM控件可以在運(yùn)行時(shí)刻同其他組件連接起來(lái)構(gòu)成某個(gè)應(yīng)用程序。COM組件可以動(dòng)態(tài)的插入或卸出應(yīng)用,而且必須是動(dòng)態(tài)鏈接的,它必須隱藏(封裝)其內(nèi)部實(shí)現(xiàn)細(xì)節(jié),必須可以在不妨礙已有用戶的情況下被升級(jí),且可以透明的在網(wǎng)絡(luò)上被重新分

47、配位置[24]。</p><p>  3 WinForm Control:常用的WinForm Control可以分為六大類[11],分別是:</p><p>  (1)最根本的父控件Form:</p><p>  這個(gè)類別中只包含一種控件:窗體類。這樣分類的理由在于:窗體類是所有其他類的父親(parent),這里的“父親”你可以作以下的理解。</p>

48、<p>  如果這里的“父親”你理解作“容器”,那么窗體類是所有控件的父類。這就是說(shuō),每個(gè)控件在視覺(jué)上都處在某個(gè)窗體中(或者是在別的控件中,例如面板(Panel)控件,面板控件自己還是被包含在一個(gè)窗體中的)。 </p><p>  (2)容器控件,常用的有:</p><p><b>  1) Panel</b></p><p>  

49、2) TabControl</p><p>  3) TabPage</p><p>  4) FlowLayoutPanel</p><p>  5) GroupBox</p><p>  容器控件用來(lái)盛放別的控件。它們沒(méi)有自己的GUI能力,而是依賴于被包含的控件來(lái)做真正的工作。把控件放在一個(gè)容器中的真正理由在于,你能夠把放在其中的控件做為

50、一個(gè)整體進(jìn)行顯示、隱藏、移動(dòng)等操作。</p><p>  容器控件都能接受鼠標(biāo)事件,而別的控件類都不能接受原始鼠標(biāo)輸入。對(duì)別的控件而言,鼠標(biāo)消息被轉(zhuǎn)換成特定控件事件,例如Click事件,或者產(chǎn)生一個(gè)副作用,例如使控件獲得或失去焦點(diǎn)。</p><p>  (3)單項(xiàng)控件,常用的有:</p><p><b>  1) Button</b></

51、p><p>  2) CheckBox</p><p>  3) CheckedListBox</p><p><b>  4) Label</b></p><p>  5) PictureBox</p><p>  6) RadioButton</p><p>  7) St

52、atusBar</p><p>  8) TextBox</p><p>  9) ProgressBar</p><p>  單項(xiàng)控件通常用來(lái)顯示和接收單項(xiàng)信息。它們具有用以保存數(shù)值的Text屬性,并且當(dāng)這一數(shù)值改變時(shí),它們會(huì)接收到一個(gè)TextChanged事件。舉例來(lái)說(shuō),如果一個(gè)用戶正在向一個(gè)TextBox控件輸入文本,那么每一個(gè)被輸入的字符都會(huì)引發(fā)TextCh

53、anged事件。</p><p>  所有的單項(xiàng)控件都支持一種被稱為數(shù)據(jù)綁定的特性。這個(gè)特性使你可以將你的用戶界面對(duì)象連接到數(shù)據(jù)對(duì)象。這樣的連接一旦建立,任何用戶界面中的改變都會(huì)引起內(nèi)存中對(duì)應(yīng)對(duì)象的自動(dòng)更新——反之亦然。數(shù)據(jù)綁定使得在此之前的GUI程序員必須手動(dòng)處理的工作得以自動(dòng)完成,并且使你的編碼工作大大簡(jiǎn)化。所有的單項(xiàng)控件都使用了同樣的數(shù)據(jù)綁定方法,這種方法被稱為簡(jiǎn)單數(shù)據(jù)綁定[4]。</p>&

54、lt;p>  (4)復(fù)合項(xiàng)控件,常用的有:</p><p>  1) ComboBox</p><p>  2) DataGrid</p><p>  3) DominUpDown</p><p>  4) ListBox</p><p>  5) ListView</p><p>  6

55、) TreeView</p><p>  復(fù)合項(xiàng)控件可以顯示一個(gè)列表或是一個(gè)數(shù)組,并且允許用戶從列表中選取某一選項(xiàng)。每一個(gè)控件類都允許你通過(guò)容器來(lái)訪問(wèn)被顯示的數(shù)據(jù)——數(shù)組或是列表——這被作為控件的一個(gè)屬性得以實(shí)現(xiàn)。這些控件使你可以使用面向?qū)ο蟮姆绞絹?lái)訪問(wèn)底層數(shù)據(jù)。對(duì)幾乎所用控件而言——除了DataGrid控件——實(shí)際的數(shù)據(jù)都存在于一個(gè)對(duì)應(yīng)的底層Win32控件之中。</p><p>  除了

56、DataGrid控件之外,每一個(gè)復(fù)合項(xiàng)控件都允許你在程序編譯時(shí)給定一個(gè)初始化列表。Visual Studio .NET設(shè)計(jì)器使你可以通過(guò)控件的屬性窗口來(lái)創(chuàng)建這一列表。(對(duì)樹(shù)形控件(TreeView)而言,用來(lái)初始化的集合被稱為節(jié)點(diǎn)(Node),并且這一集合擁有和其他控件初始集合平面結(jié)構(gòu)不相同的層次結(jié)構(gòu)。)這一為控件設(shè)定初始值的能力將使你的工作變得簡(jiǎn)單,因?yàn)槌窃谶\(yùn)行時(shí)(runtime)才知道初始值,設(shè)計(jì)器都可以提前為你創(chuàng)建初始化所需代碼

57、。如果你確實(shí)需要在運(yùn)行時(shí)再進(jìn)行初始化,那么在你開(kāi)始學(xué)習(xí)怎樣訪問(wèn)初始化集合時(shí),看看設(shè)計(jì)器所產(chǎn)生的代碼是個(gè)不錯(cuò)的選擇[10]。</p><p>  為了幫助你將程序中的數(shù)據(jù)與這些控件的數(shù)據(jù)在運(yùn)行時(shí)相連接,復(fù)合項(xiàng)控件也支持?jǐn)?shù)據(jù)綁定。復(fù)合項(xiàng)控件實(shí)現(xiàn)數(shù)據(jù)綁定的方法與單項(xiàng)控件的大不相同。這里就不再詳細(xì)介紹了。</p><p>  (5)命令輸入控件,常用的有:</p><p>

58、  1) ContextMenu</p><p>  2) MainMenu</p><p>  3) MenuItem</p><p>  4) ToolBar</p><p>  5) ToolBarButton</p><p>  命令輸入控件允許用戶指定一個(gè)操作以便執(zhí)行,這通常通過(guò)直接在控件上的點(diǎn)擊完成。每個(gè)命

59、令輸入控件具有Text屬性描述這一操作,還有三個(gè)布爾屬性——Visible,Enabled和Checked——來(lái)指示控件的狀態(tài)。當(dāng)被用戶選中時(shí),該控件會(huì)接到一個(gè)Click事件。</p><p>  (6)背景控件,常用的有:</p><p><b>  1) Timer</b></p><p>  2) ImageList</p>

60、<p>  背景控件沒(méi)有圖形界面,因此它們對(duì)用戶是不可見(jiàn)的,而且它們只能被包含在窗體控件中,而不能被放置于容器控件中。</p><p>  Timer控件在一定間隔觸發(fā)Tick事件,這一時(shí)間間隔在Interval屬性中指定(以毫秒為單位)。這一屬性是一個(gè)整型值,因此可接收的范圍從1毫秒到Int32.MaxValue毫秒,也就是大約23天。一旦被啟動(dòng)并且Enabled屬性為真(true),</p&

61、gt;<p>  Timer控件就會(huì)不停的觸發(fā)Tick事件,這使它看起來(lái)有點(diǎn)像一個(gè)鬧鐘。一旦被設(shè)定,它就每過(guò)Interval屬性個(gè)毫秒報(bào)響。你可以通過(guò)將Enabled屬性設(shè)置為假(False)來(lái)關(guān)掉它。計(jì)時(shí)器事件的優(yōu)先級(jí)較低。例如在用戶點(diǎn)擊一個(gè)TextBox控件的同時(shí),一個(gè)Timer控件也觸發(fā)了一個(gè)事件,那么所有點(diǎn)擊觸發(fā)的事件(例如GotFocus, LostFocus,Validating和Validated)都會(huì)在Ti

62、ck事件提交之前被處理。</p><p>  ImageList控件可以存放一組圖像,這通常被用來(lái)支持ToolBar按鈕。和別的控件一樣,你可以在Visual Studio .NET設(shè)計(jì)器中為ImageList控件設(shè)定初始值——一組圖像[10]。Visual Studio .NET支持的文件類型范圍很廣,包括支持位圖(bitmaps)、JPEG、GIF、PNG、Icons和Window圖元文件(Window me

63、tafiles)。</p><p>  2.2 常用單元測(cè)試框架</p><p>  目前,專門(mén)用于WinForm Control的自動(dòng)化測(cè)試框架并不存在,一般的開(kāi)發(fā)WinForm Control的公司都是用常用的單元測(cè)試框架對(duì)WinForm Control的基本屬性、方法及事件進(jìn)行自動(dòng)化測(cè)試,其他大部分對(duì)于WinForm Control的測(cè)試只能依靠測(cè)試人員手動(dòng)完成。目前的最流行的單元測(cè)

64、試框架是XUnit系列框架。常用的有JUnit、CppUnit、NUnit以及XUnit.net[23]。</p><p>  2.2.1 JUnit測(cè)試框架原理</p><p>  JUnit就是為Java程序開(kāi)發(fā)者實(shí)現(xiàn)單元測(cè)試提供一種框架,使得Java單元測(cè)試更規(guī)范有效,并且更有利于測(cè)試的集成[5]。 </p><p>  1 JUnit的優(yōu)點(diǎn)</p>

65、;<p>  (1)可以使測(cè)試代碼與產(chǎn)品代碼分開(kāi)。</p><p>  (2)針對(duì)某一個(gè)類的測(cè)試代碼通過(guò)較少的改動(dòng)便可以應(yīng)用于另一個(gè)類的測(cè)試。</p><p>  (3)易于集成到測(cè)試人員的構(gòu)建過(guò)程中,JUnit和Ant的結(jié)合可以實(shí)施增量開(kāi)發(fā)。</p><p>  (4)JUnit是公開(kāi)源代碼的,可以進(jìn)行二次開(kāi)發(fā)。</p><p&g

66、t;  (5)可以方便地對(duì)JUnit進(jìn)行擴(kuò)展。</p><p>  2 JUnit的編寫(xiě)原則</p><p>  (1)簡(jiǎn)化測(cè)試的編寫(xiě),這種簡(jiǎn)化包括測(cè)試框架的學(xué)習(xí)和實(shí)際測(cè)試單元的編寫(xiě)。</p><p>  (2)是使測(cè)試單元保持持久性。</p><p>  (3)是可以利用既有的測(cè)試來(lái)編寫(xiě)相關(guān)的測(cè)試。</p><p>

67、  3 JUnit的特點(diǎn)</p><p>  (1)使用斷言方法判斷期望值和實(shí)際值差異,返回Boolean值。</p><p>  (2)測(cè)試驅(qū)動(dòng)設(shè)備使用共同的初始化變量或者實(shí)例。</p><p>  (3)測(cè)試包結(jié)構(gòu)便于組織和集成運(yùn)行。</p><p>  (4)支持圖型交互模式和文本交互模式。</p><p>  

68、4 JUnit框架的組成</p><p>  (1)對(duì)測(cè)試目標(biāo)進(jìn)行測(cè)試的方法與過(guò)程集合,可稱為測(cè)試用例(TestCase)。</p><p>  (2)測(cè)試用例的集合,可容納多個(gè)測(cè)試用例(TestCase),將其稱作測(cè)試包(TestSuite)。JUnit框架是一個(gè)典型的Composite模式:TestSuite可以容納任何派生自Test的對(duì)象;當(dāng)調(diào)用TestSuite對(duì)象的run()方法

69、是,會(huì)遍歷自己容納的對(duì)象,逐個(gè)調(diào)用它們的run()方法。</p><p>  (3)測(cè)試結(jié)果的描述與記錄。(TestResult) 。</p><p>  (4)測(cè)試過(guò)程中的事件監(jiān)聽(tīng)者(TestListener)。</p><p>  (5)每一個(gè)測(cè)試方法所發(fā)生的與預(yù)期不一致?tīng)顩r的描述,稱其測(cè)試失敗元素(TestFailure)</p><p&g

70、t;  (6)JUnit Framework中的出錯(cuò)異常(AssertionFailedError)。</p><p>  5 JUnit中常用的接口和類</p><p>  (1)Test接口——運(yùn)行測(cè)試和收集測(cè)試結(jié)果</p><p>  Test接口使用了Composite設(shè)計(jì)模式,是單獨(dú)測(cè)試用例 (TestCase),聚合測(cè)試模式(TestSuite)及測(cè)試擴(kuò)

71、展(TestDecorator)的共同接口。它的public int countTestCases()方法,它來(lái)統(tǒng)計(jì)這次測(cè)試有多少個(gè)TestCase,另外一個(gè)方法就是public void run(TestResult),TestResult是實(shí)例接受測(cè)試結(jié)果,run方法執(zhí)行本次測(cè)試。</p><p>  (2)TestCase抽象類——定義測(cè)試中固定方法</p><p>  TestCa

72、se是Test接口的抽象實(shí)現(xiàn),(不能被實(shí)例化,只能被繼承)其構(gòu)造函數(shù)TestCase(string name)根據(jù)輸入的測(cè)試名稱name創(chuàng)建一個(gè)測(cè)試實(shí)例。由于每一個(gè)TestCase在創(chuàng)建時(shí)都要有一個(gè)名稱,若某測(cè)試失敗了,便可識(shí)別出是哪個(gè)測(cè)試失敗。 TestCase類中包含的setUp()、tearDown()方法。setUp()方法集中初始化測(cè)試所需的所有變量和實(shí)例,并且在依次調(diào)用測(cè)試類中的每個(gè)測(cè)試方法之前再次執(zhí)行setUp(

73、)方法。tearDown()方法則是在每個(gè)測(cè)試方法之后,釋放測(cè)試程序方法中引用的變量和實(shí)例。 開(kāi)發(fā)人員編寫(xiě)測(cè)試用例時(shí),只需繼承TestCase,來(lái)完成run方法即可,然后JUnit獲得測(cè)試用例,執(zhí)行它的run方法,把測(cè)試結(jié)果記錄在TestResult之中。 </p><p>  (3)Assert靜態(tài)類——一系列斷言方法的集合</p><p>  Assert包含了一組靜態(tài)的測(cè)試

74、方法,用于期望值和實(shí)際值比對(duì)是否正確,即測(cè)試失敗,Assert類就會(huì)拋出一個(gè)AssertionFailedError異常,JUnit測(cè)試框架將這種錯(cuò)誤歸入Failes并加以記錄,同時(shí)標(biāo)志為未通過(guò)測(cè)試。如果該類方法中指定一個(gè)String類型的傳參則該參數(shù)將被做為AssertionFailedError異常的標(biāo)識(shí)信息,告訴測(cè)試人員該異常的詳細(xì)信息。 JUnit 提供了6大類31組斷言方法,包括基礎(chǔ)斷言、數(shù)字?jǐn)嘌?、字符斷言、布爾斷言?/p>

75、對(duì)象斷言。其中assertEquals(Object expected,Object actual)內(nèi)部邏輯判斷使用equals()方法,這表明斷言兩個(gè)實(shí)例的內(nèi)部哈希值是否相等時(shí),最好使用該方法對(duì)相應(yīng)類實(shí)例的值進(jìn)行比較。而assertSame(Object expected,Object actual)內(nèi)部邏輯判斷使用了Java運(yùn)算符“==”,這表明該斷言判斷兩個(gè)實(shí)例是否來(lái)自于同一個(gè)引用(Reference),最好使用該方法對(duì)不同類的實(shí)

76、例的值進(jìn)行比對(duì)。assertEquals(String message,String e</p><p>  (4)TestSuite測(cè)試包類——多個(gè)測(cè)試的組合</p><p>  TestSuite類負(fù)責(zé)組裝多個(gè)Test Cases。待測(cè)的類中可能包括了對(duì)被測(cè)類的多個(gè)測(cè)試,而TestSuite負(fù)責(zé)收集這些測(cè)試,使我們可以在一個(gè)測(cè)試中,完成全部的對(duì)被測(cè)類的多個(gè)測(cè)試。 TestSu

77、ite類實(shí)現(xiàn)了Test接口,且可以包含其它的TestSuites。它可以處理加入Test時(shí)的所有拋出的異常。 TestSuite處理測(cè)試用例有6個(gè)規(guī)約(否則會(huì)被拒絕執(zhí)行測(cè)試)        1)測(cè)試用例必須是公有類(Public)</p><p>  2)測(cè)試用例必須繼承與TestCase類 </p><p>

78、;  3)測(cè)試用例的測(cè)試方法必須是公有的(Public)</p><p>  4)測(cè)試用例的測(cè)試方法必須被聲明為Void</p><p>  5)測(cè)試用例中測(cè)試方法的前置名詞必須是test</p><p>  6)測(cè)試用例中測(cè)試方法無(wú)任何傳遞參數(shù)</p><p>  (5)TestResult結(jié)果類和其它類與接口</p><

79、;p>  TestResult結(jié)果類集合了任意測(cè)試?yán)奂咏Y(jié)果,通過(guò)TestResult實(shí)例傳遞每個(gè)測(cè)試的Run()方法。TestResult在執(zhí)行TestCase時(shí)如果失敗會(huì)異常拋出。TestListener接口是個(gè)事件監(jiān)聽(tīng)規(guī)約,可供TestRunner類使用。它通知listener的對(duì)象相關(guān)事件,方法包括測(cè)試開(kāi)始startTest(Test test),測(cè)試結(jié)束endTest(Test test),增加異常addError(Tes

80、t test,Throwable t)和增加失敗addFailure(Test test,AssertionFailedError t) ,TestFailure失敗類是個(gè)“失敗”狀況的收集類,解釋每次測(cè)試執(zhí)行過(guò)程中出現(xiàn)的異常情況。其toString()方法返回“失敗”狀況的簡(jiǎn)要描述。</p><p>  2.2.2 CppUnit測(cè)試框架原理</p><p>  CppUnit 是一個(gè)單

81、元測(cè)試框架,它是從著名的 JUnit 框架為 C++ 而移植過(guò)來(lái)的。 </p><p>  類似于大多數(shù)開(kāi)源項(xiàng)目,CppUnit 下載下來(lái)之后,第一次就是將源代碼進(jìn)行編譯(安裝),在該下載包的目錄中,INSTALL_WIN.txt 詳細(xì)的講解了如何在 Windows 上進(jìn)行編譯。如果機(jī)器中裝有 Visual Studio 6.0 以上,可以在源代碼目錄中直接打開(kāi)項(xiàng)目文件,然后使用該集成環(huán)境直接進(jìn)行編譯即可[14]

82、。</p><p>  在CppUnit的lib目錄下,包括這些文件: </p><p>  1CppUnit運(yùn)行時(shí)庫(kù),用于撰寫(xiě)單元測(cè)試代碼。</p><p>  (1)cppunitd.lib:CppUnit 運(yùn)行時(shí)庫(kù)的靜態(tài)編譯庫(kù)文件。</p><p>  (2)cppunitd_dll.dll:CppUnit 運(yùn)行時(shí)庫(kù)編譯的動(dòng)態(tài)鏈接庫(kù)文件

83、。 </p><p>  (3)cppunitd_dll.lib:CppUnit 運(yùn)行時(shí)庫(kù)動(dòng)態(tài)鏈接庫(kù)的導(dǎo)入庫(kù)文件。</p><p>  2執(zhí)行單元測(cè)試的程序文件,用于執(zhí)行撰寫(xiě)的單元測(cè)試代碼。</p><p>  (1)DllPluginTesterd_dll.exe:命令行可執(zhí)行文件,指定編譯的單元測(cè)試代碼動(dòng)態(tài)鏈接庫(kù),然后運(yùn)行并輸出。典型的用法:TestPlugIn

84、Runnerd_dll a.dll-t。</p><p>  (2)TestPlugInRunnerd.exe:GUI可執(zhí)行文件,可以打開(kāi)任何編譯的單元測(cè)試代碼動(dòng)態(tài)鏈接庫(kù),指定需要測(cè)試的case, 進(jìn)行測(cè)試并檢測(cè)測(cè)試結(jié)果,如果沒(méi)問(wèn)題,進(jìn)度條為綠色,如果有問(wèn)題,進(jìn)度條為紅色。</p><p>  在CppUnit中,每一個(gè)測(cè)試用例用一個(gè)類表示,該類通常用于測(cè)試一個(gè)模塊,如果該模塊是一個(gè)類,正

85、好對(duì)應(yīng)這個(gè)測(cè)試用例。</p><p><b>  1定義類</b></p><p>  每個(gè)測(cè)試用例類都必須要繼承自CPPUNIT_NS::TestFixture。如:class SampleTestCase:public CPPUNIT_NS::TestFixture </p><p>  并且,這個(gè)類還需要定義一對(duì)宏:</p>

86、<p>  CPPUNIT_TEST_SUITE (SampleTestCase);</p><p>  CPPUNIT_TEST_SUITE_END();</p><p>  這對(duì)宏里面用于定義這個(gè)測(cè)試類所包含的測(cè)試方法。而且,在實(shí)現(xiàn)的源程序中也需要定義一個(gè)宏來(lái)標(biāo)識(shí)該測(cè)試類:</p><p>  CPPUNIT_TEST_SUITE_REGISTRAT

87、ION (SampleTestCase);</p><p>  除此之外,每個(gè)類還可以實(shí)現(xiàn)兩個(gè)方法:setUp(),tearDown()。第一個(gè)方法在運(yùn)行這個(gè)類的測(cè)試方法之前被調(diào)用,而第二個(gè)方法則是在運(yùn)行完這個(gè)類的測(cè)試方法之后被調(diào)用。例如,如果這個(gè)測(cè)試類需要操作一個(gè)文件里的信息,通常在運(yùn)行測(cè)試方法之前,需要打開(kāi)指定的文件,這些處理則可以放在setUp()中實(shí)現(xiàn)。而完成測(cè)試之后,又需要將打開(kāi)的文件關(guān)閉,這些操作可以

88、在TearDown()中實(shí)現(xiàn)。這兩個(gè)方法的原型是:</p><p>  void setUp();</p><p>  void TearDown();</p><p><b>  2定義測(cè)試方法</b></p><p>  每個(gè)測(cè)試方法用于測(cè)試一段功能,通常對(duì)應(yīng)于被測(cè)試類的某公開(kāi)方法。例如,在Sample類中有一個(gè)fo

89、o()方法,在測(cè)試類SampleTestCase中也可以聲明一個(gè)foo()方法。注意,強(qiáng)烈建議使用相同的名稱,這樣便于維護(hù)。</p><p>  每一個(gè)測(cè)試方法需要在類的CPPUNIT_TEST_SUITE 宏中添加一個(gè)定義,以便 CppUnit 能夠發(fā)現(xiàn)該測(cè)試方法,如:</p><p>  CPPUNIT_TEST (foo);</p><p>  在定義測(cè)試方法

90、之后,就可以在該方法內(nèi)編寫(xiě)單元測(cè)試代碼了。單元測(cè)試框架都采用斷言式的測(cè)試方式,即編寫(xiě)一個(gè)表達(dá)式,檢查其結(jié)果是否為真,真則表示通過(guò)。在CppUnit中,用于檢驗(yàn)測(cè)試是否通過(guò)的宏包括:</p><p>  CPPUNIT_ASSERT (expr):檢查表達(dá)式expr是否為真,真則通過(guò),假則錯(cuò)誤。</p><p>  CPPUNIT_ASSERT_TRHOW (expr, exception)

91、:檢查表達(dá)式expr是否拋出異常類型exception,如果拋出了指定類型的異常,則通過(guò)測(cè)試。</p><p>  CPPUNIT_ASSERT_MESSAGE (message, expr):類似于CPPUNIT_ASSERT, 但在沒(méi)有通過(guò)時(shí)輸出消息 message。</p><p>  CPPUNIT_FAIL (message):強(qiáng)制性不通過(guò)測(cè)試,并輸出消息message。<

92、/p><p>  2.2.3 NUnit測(cè)試框架原理</p><p>  NUnit是一個(gè)單元測(cè)試框架,專門(mén)針對(duì)于.NET來(lái)寫(xiě)的。NUnit最初是由James W. Newkirk,Alexei A. Vorontsov和Philip A. Craig,后來(lái)開(kāi)發(fā)團(tuán)隊(duì)逐漸龐大起來(lái),在開(kāi)發(fā)過(guò)程中,KentBeck和ErichGamma兩位也提供了許多幫助。</p><p>

93、  NUnit是xUnit家族中的第四個(gè)主打產(chǎn)品,完全由C#語(yǔ)言來(lái)編寫(xiě),并且編寫(xiě)時(shí)充分利用了許多.NET的特性,比如反射,客戶屬性等等。最重要的一點(diǎn)是它適合于所有.NET語(yǔ)言。</p><p>  在使用NUnit框架時(shí),有很多有用的特性。靈活使用這些特性,將有助于提高測(cè)試代碼開(kāi)發(fā)的效率[3]。</p><p>  1 Per-method的Setup和Teardown</p>

94、<p>  (1)Setup:用此Attribute指定的方法用于環(huán)境的建立,NUnit在調(diào)用每個(gè)Test方法之前,將調(diào)用此特性標(biāo)記的方法。 (2)Teardown:和Setup一樣,只是調(diào)用的時(shí)機(jī)是在每個(gè)Test方法完成后, 用于環(huán)境的清理。</p><p>  2 Per-class Setup和Per-class Teardown</p>&l

95、t;p>  TestFixtureSetup以及TestFixtureTearDown特性和上述的Setup以及Teardown類似,只是其作用于整個(gè)TestFixture類而已??梢允褂眠@兩個(gè)特性標(biāo)記的方法對(duì)整個(gè)test class設(shè)置和清理環(huán)境。</p><p>  3使用Categories分類</p><p>  [Category(“分類名”)]用于指定某個(gè)測(cè)試方法所屬的“

96、類型”。用此特性將各個(gè)測(cè)試方法分類后,可以在NUnit環(huán)境中指定需要執(zhí)行的類型。可以將此特性寫(xiě)在[Test]特性一起,如:[Test, Category(“test_0001”)]。也可以分開(kāi)兩行:   [Test]   [Category(“test_0001”)]   Category還有一個(gè)Explicit屬性,可以顯式排除該Category的運(yùn)行(除非在NU

97、nit GUI中指定),寫(xiě)法如:[Category(“test_0001”, Explicit=true)]</p><p>  4測(cè)試預(yù)期的異常:ExpectedException</p><p>  對(duì)測(cè)試而言有兩種異常:從測(cè)試代碼拋出的異常;由于某個(gè)模塊錯(cuò)誤而引發(fā)的異常。第二種異常會(huì)在NUnit中捕獲并作測(cè)試失敗處理。而有時(shí)我們需要測(cè)試被測(cè)試方法是否拋出了期望的異常(例如,特意傳入的

98、錯(cuò)誤參數(shù)),就可以用以下方法:</p><p>  [ExpectedException(typeof(SomeException))] [Test,ExpectedException(typeof(SomeException))]注意,一旦期望的異常拋出了,剩余的代碼就會(huì)被跳過(guò)。</p><p>  5臨時(shí)忽略一些測(cè)試:Ignore</p><p>  當(dāng)你寫(xiě)了

99、一些測(cè)試代碼,但并不打算馬上執(zhí)行時(shí),可以使用Ignore特性。  [Test,Ignore(“message”)] 這個(gè)測(cè)試將被跳過(guò),并且在NUnit GUI中給出黃色的狀態(tài)欄。</p><p>  6 NUint中的斷言Assert類的靜態(tài)方法:</p><p>  1) AreEquals:</p><p>  Assert.Ar

100、eEqual(expected, actual[, string message])</p><p>  expected:期望值(通常是硬編碼的);actual:實(shí)際值(通常是硬編碼的);message:一個(gè)可選消息,將會(huì)在發(fā)生錯(cuò)誤時(shí)報(bào)告這個(gè)消息。</p><p>  因計(jì)算機(jī)并不能精確地表示所有的浮點(diǎn)數(shù),所以在比較浮點(diǎn)數(shù)時(shí)(float或double),需要指定一個(gè)額

101、外的誤差參數(shù)。</p><p>  Assert.AreEqual(expected, actual, tolerance[, string message])</p><p>  tolerance:指定的誤差,即只要精確到小數(shù)點(diǎn)后X位就足夠了。</p><p><b>  2) IsNull</b>&

102、lt;/p><p>  Assert.IsNull(object[, string message])</p><p>  Assert.IsNotNull(object[, string message])</p><p>  3) AreSame</p><p>  Assert.AreSame(exp

103、ected, actual[, string message])</p><p>  驗(yàn)證expected和actual兩個(gè)參數(shù)是否引用一個(gè)相同的對(duì)象。</p><p><b>  4) IsTrue</b></p><p>  Assert.IsTrue(bool condition [,&#

104、160;string message])</p><p>  Assert.IsFalse(bool condition [, string message])</p><p><b>  5) Fail</b></p><p>  Assert.Fail([string messag

105、e])</p><p>  使測(cè)試立即失??;這種斷言通常被用于標(biāo)記某個(gè)不應(yīng)該被到達(dá)的分支,但實(shí)際中不常用。</p><p>  7當(dāng)有測(cè)試失敗時(shí),無(wú)論如何都不能給原有代碼添加任何的新特性。</p><p>  2.2.4 XUnit.net測(cè)試框架原理</p><p>  Jim Newkirk和Brad Wilson這兩位XUnit.net

106、的創(chuàng)造者,從NUnit和其他單元測(cè)試框架的經(jīng)驗(yàn)中總結(jié)出來(lái)以下改進(jìn):</p><p>  1為每個(gè)測(cè)試方法產(chǎn)生一個(gè)對(duì)象實(shí)例</p><p>  2取消了[SetUp]和[TearDown] </p><p>  3取消了[ExpectedException]</p><p>  4類似于Aspect的功能</p><p>

107、;  5減少了自定義屬性(Attribute)的數(shù)目</p><p><b>  6采用泛型 </b></p><p><b>  7匿名委托</b></p><p>  8可擴(kuò)展的斷言、測(cè)試方法以及測(cè)試類 </p><p>  XUnit.net減少了屬性(Attributes)的數(shù)量,屬性被用來(lái)

108、控制測(cè)試和測(cè)試的執(zhí)行過(guò)程。其中有個(gè) [Test]屬性用來(lái)標(biāo)出測(cè)試方法。跟NUnit不同,測(cè)試類并沒(méi)有任何標(biāo)志。XUnit.net直接在程序集中查找所有公開(kāi)類的全部公開(kāi)測(cè)試方法。</p><p>  XUnit.net團(tuán)隊(duì)覺(jué)得每項(xiàng)測(cè)試分別執(zhí)行setup和teardown會(huì)產(chǎn)生難以理解與除錯(cuò)的測(cè)試代碼,并且常常導(dǎo)致每一項(xiàng)測(cè)試執(zhí)行之前都要運(yùn)行一些不必要的代碼。因此[SetUp]和[TearDown]被拋棄。</p

109、><p>  原先[ExpectedException]屬性被用來(lái)聲明希望測(cè)試代碼拋出的異常,它已被Assert.Throws斷言取代。測(cè)試集(TestFixture)由ITestFixture接口標(biāo)出,接口里面有兩個(gè)方法:BeforeAllTests()和AfterAllTests()。測(cè)試超時(shí)和暫時(shí)跳過(guò)某些測(cè)試是通過(guò)[Test]屬性的參數(shù)來(lái)實(shí)現(xiàn)的,并沒(méi)有單獨(dú)為此定義屬性。MbUnit里面非常受歡迎的[RowTes

110、t]和[Row]測(cè)試模式也被包括了進(jìn)來(lái),由[Theory]和[DataViaXxx]實(shí)現(xiàn):xunit.extensions.dll里附帶了對(duì)數(shù)據(jù)驅(qū)動(dòng)測(cè)試的支持,被稱為T(mén)heory。用[Theory](代替[Test])來(lái)標(biāo)記測(cè)試,再標(biāo)記上其中一個(gè)[DataVia...]屬性,用來(lái)指出數(shù)據(jù)的來(lái)源。</p><p>  XUnit.net中的斷言的數(shù)量也減少了。任何可用基本斷言實(shí)現(xiàn)其功能的斷言都被放棄。另外“is”和

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論