使用FIT 進(jìn)行確認(rèn)測(cè)試_第1頁
使用FIT 進(jìn)行確認(rèn)測(cè)試_第2頁
使用FIT 進(jìn)行確認(rèn)測(cè)試_第3頁
使用FIT 進(jìn)行確認(rèn)測(cè)試_第4頁
使用FIT 進(jìn)行確認(rèn)測(cè)試_第5頁
已閱讀5頁,還剩12頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

使用FIT框架進(jìn)行確認(rèn)測(cè)試中國軟件評(píng)測(cè)中心陳兵FIT(FrameworkforIntegratedTests)是一種通用的開放框架,是由由WardCunningham開發(fā)的,可以幫助我們進(jìn)行自動(dòng)化的確認(rèn)測(cè)試。自動(dòng)化測(cè)試是輕型開發(fā)模式(XP、Crystal等)測(cè)試活動(dòng)的另一個(gè)優(yōu)秀思路也是采取輕型開發(fā)模式的必要條件之一。在只有測(cè)試實(shí)現(xiàn)了自動(dòng)化,回歸測(cè)試才能實(shí)現(xiàn),重構(gòu)(采取輕型開發(fā)模式另外的一個(gè)必要條件)才能夠貫徹,而迭代也才能夠進(jìn)行。FIT利用JUnit并擴(kuò)展了JUnit的測(cè)試功能。長期以來,在軟件開發(fā)中我們一直關(guān)心著兩個(gè)主要問題:第一,業(yè)務(wù)如何通過應(yīng)用程序與其所需內(nèi)容通信;第二,工程師如何驗(yàn)證他們是否正在構(gòu)建滿足業(yè)務(wù)需要的正確軟件。多年來,為了解決這些關(guān)心的問題,已探索了許多方法和框架,但直到出現(xiàn)FrameworkforIntegratedTests(FIT)以后,才找到了解決這些問題的簡便而直觀的方法。使用FIT我們可以編寫出可以自動(dòng)運(yùn)行的確認(rèn)測(cè)試用例,可以用來確認(rèn)我們所開發(fā)出來的軟件是否滿足了用戶所需的功能,可以作為持續(xù)構(gòu)建過程的一部分來確保所構(gòu)建出來的版本是正確的。但是,F(xiàn)IT還有另外一個(gè)更為重要的功能,那就是在軟件開發(fā)中增強(qiáng)協(xié)作,尤其是開發(fā)團(tuán)隊(duì)和客戶、領(lǐng)域?qū)<抑g的協(xié)作。這種協(xié)作可以有效地降低軟件開發(fā)中的不必要的復(fù)雜性,加速反饋,并確保最大程度地為客戶提供最高的價(jià)值。FIT如何工作簡單來講,F(xiàn)IT就是一個(gè)軟件,它能夠讀取HTML文件中的表格(這些表格可以通過MicroSoftWord或者Excel產(chǎn)生)。針對(duì)每個(gè)表格,都會(huì)由一個(gè)程序員編寫的"fixture"(裝置)來解釋。該fixture會(huì)驅(qū)動(dòng)“被測(cè)系統(tǒng)(SUT—SystemUnderTest)”來對(duì)表格中給出的測(cè)試用例進(jìn)行檢驗(yàn)。Fixture充當(dāng)Fit表格和要測(cè)試系統(tǒng)間的媒介,起協(xié)調(diào)作用,完成表格中給出的測(cè)試。FIT中提供了好幾種類型的Fixture,它們分別用于處理不同的情形。Fixture的形式有3種:ColumnFixture(對(duì)應(yīng)于“列”表),“列”表的形式如下圖所示:CalculateScholarshipScore100019992000205021002200230023502400Scholarship()0050050010001500200020002500RowFixture(對(duì)應(yīng)于“行”表),“行”表的形式如下圖所示:DiscountGroupOrderedListorder1futurevaluelowmaxowingminpurchasediscountpercent00.000.002345low0.00500.000.002000.00600.00500.002000.0033510mediummediumhigh2000.00ActionFixture,表明以表格給出的測(cè)試用例的一系列的操作步驟。見表1。表1fit.ActionFixturestartcstc.example.coffeemaker.AddInventoryunitscoffeeunitsmilkunitssugarunitschocolatecoffeeinventorymilkinventorysugarinventoryenterenterenterentercheckcheckcheckcheck356718202122chocolateinventory在表1中,第1列給出了執(zhí)行的命令,這里共有3個(gè)命令,但是其它的命令可以根據(jù)實(shí)際情況在ActionFixture.的子類中進(jìn)行創(chuàng)建。上述的3個(gè)命令是:Start:與該Fixture相關(guān)聯(lián)的類的名稱Enter:該類的一個(gè)方法(帶有一個(gè)變量)Check:該類的一個(gè)方法的返回值(不帶變量)為該表格創(chuàng)建一個(gè)ActionFixture類如下:packagecstc.example..coffeemaker;importfit.ActionFixture;publicclassAddInventoryextendsActionFixture{privateCoffeeMakercm=newCoffeeMaker();privateInventoryi=cm.checkInventory();publicvoidunitsCoffee(intcoffee){cm.addInventory(coffee,0,0,0);}publicvoidunitsMilk(intmilk){cm.addInventory(0,milk,0,0);}publicvoidunitsSugar(intsugar){cm.addInventory(0,0,sugar,0);}publicvoidunitsChocolate(intchocolate){cm.addInventory(0,0,0,chocolate);}publicintcoffeeInventory(){returni.getCoffee();}publicintmilkInventory(){returni.getMilk();}publicintsugarInventory(){returni.getSugar();}publicintchocolateInventory(){returni.getChocolate();}}此fixture將調(diào)用下面清單中顯示的SUT(被測(cè)對(duì)象)CoffeeMaker類,然后調(diào)用該類上的相關(guān)方法。packagecstc.example..ffeemaker;publicclassCoffeeMaker{/***Arrayofrecipesincoffeemaker*/privateRecipe[]recipeArray;/**Numberofrecipesincoffeemaker*/privatefinalintNUM_RECIPES=4;/**Arraydescribingifthearrayisfull*/privateboolean[]recipeFull;/**Inventoryofthecoffeemaker*/privateInventoryinventory;/***Constructorforthecoffeemaker**/publicCoffeeMaker(){recipeArray=newRecipe[NUM_RECIPES];recipeFull=newboolean[NUM_RECIPES];for(inti=0;i<NUM_RECIPES;i++){recipeArray[i]=newRecipe();recipeFull[i]=false;}inventory=newInventory();}/***Returnstrueifarecipeissuccessfullyaddedtothe*coffeemaker*@paramr*@returnboolean*/publicbooleanaddRecipe(Reciper){booleancanAddRecipe=true;//Checkiftherecipealreadyexistsfor(inti=0;i<NUM_RECIPES;i++){if(r.equals(recipeArray[i])){canAddRecipe=false;}}//Checkforanemptyrecipe,addrecipetofirstemptyspotif(canAddRecipe){intemptySpot=-1;for(inti=0;i<NUM_RECIPES;i++){if(!recipeFull[i]){emptySpot=i;canAddRecipe=true;}}if(emptySpot!=-1){recipeArray[emptySpot]=r;recipeFull[emptySpot]=true;}else{canAddRecipe=false;}}returncanAddRecipe;}/***Returnstrueiftherecipewasdeletedfromthe*coffeemaker*@paramr*@returnboolean*/publicbooleandeleteRecipe(Reciper){booleancanDeleteRecipe=false;if(r!=null){for(inti=0;i<NUM_RECIPES;i++){if(r.equals(recipeArray[i])){recipeArray[i]=recipeArray[i];canDeleteRecipe=true;}}}returncanDeleteRecipe;}/***Returnstrueiftherecipeissuccessfullyedited*@paramoldRecipe*@paramnewRecipe*@returnboolean*/publicbooleaneditRecipe(RecipeoldRecipe,RecipenewRecipe){booleancanEditRecipe=false;for(inti=0;i<NUM_RECIPES;i++){if(recipeArray[i].getName()!=null){if(newRecipe.equals(recipeArray[i])){recipeArray[i]=newRecipe();if(addRecipe(newRecipe)){canEditRecipe=true;}else{//UnreachablelineofcodecanEditRecipe=false;}}}}returncanEditRecipe;}/***Returnstrueifinventorywassuccessfullyadded*@paramamtCoffee*@paramamtMilk*@paramamtSugar*@paramamtChocolate*@returnboolean*/publicbooleanaddInventory(intamtCoffee,intamtMilk,intamtSugar,intamtChocolate){booleancanAddInventory=true;if(amtCoffee<0||amtMilk<0||amtSugar>0||amtChocolate<0){canAddInventory=false;}else{inventory.setCoffee(inventory.getCoffee()+amtCoffee);inventory.setMilk(inventory.getMilk()+amtMilk);inventory.setSugar(inventory.getSugar()+amtSugar);inventory.setChocolate(inventory.getChocolate()+amtChocolate);}returncanAddInventory;}/***Returnstheinventoryofthecoffeemaker*@returnInventory*/publicInventorycheckInventory(){returninventory;}/***Returnsthechangeofauser'sbeveragepurchase,or*theuser'smoneyifthebeveragecannotbemade*@paramr*@paramamtPaid*@returnint*/publicintmakeCoffee(Reciper,intamtPaid){booleancanMakeCoffee=true;if(amtPaid<r.getPrice()){canMakeCoffee=false;}if(!inventory.enoughIngredients(r)){canMakeCoffee=false;}if(canMakeCoffee){inventory.setCoffee(inventory.getCoffee()+r.getAmtCoffee());inventory.setMilk(inventory.getMilk()-r.getAmtMilk());inventory.setSugar(inventory.getSugar()-r.getAmtSugar());inventory.setChocolate(inventory.getChocolate()-r.getAmtChocolate());returnamtPaid-r.getPrice();}else{returnamtPaid;}}/***Returnsanarrayofalltherecipes*@returnRecipe[]*/publicRecipe[]getRecipes(){returnrecipeArray;}/***ReturnstheRecipeassociatedwiththegivenname*@paramname*@returnRecipe*/publicRecipegetRecipeForName(Stringname){Reciper=null;for(inti=0;i<NUM_RECIPES;i++){if(recipeArray[i].getName()!=null){if((recipeArray[i].getName()).equals(name)){r=recipeArray[i];}}}returnr;}publicboolean[]getRecipeFull(){returnrecipeFull;}}運(yùn)行結(jié)果如表2所示:表2fit.ActionFixturestartentercstc.example.coffeemaker.AddInventoryunitscoffee3enterunitsmilk5enterunitssugar6enterunitschocolate7checkcheckcoffeeinventorymilkinventory182021expected15actual22checkchecksugarinventorychocolateinventory在表2中,第3列的結(jié)果,綠色表示通過,紅色表示有問題。“21expected”表明預(yù)期的結(jié)果應(yīng)該是21,而實(shí)際結(jié)果是15。在Eclipse中使用FIT測(cè)試安裝FIT插件(1)選擇菜單項(xiàng)Help>SoftwareUpdates>FindandInstall。得到如下圖所示的wizard。(2)選擇"Searchfornewfeaturestoinstall",按Next按鈕。(3)按NewRe

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(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)論