我們的想法是任意一個開發(fā)者都應(yīng)該有能力修改和運(yùn)行一些不需要設(shè)置特殊的配置的測試進(jìn)行測試。如果這有一些測試需要在運(yùn)行前有特殊的關(guān)注,開發(fā)者應(yīng)該知道他們,然后他可以花一些時間學(xué)習(xí)這些測試的方法。因?yàn)楹芏嗟拈_發(fā)者比較的懶(當(dāng)然,不是你),你可以設(shè)想,他們不會去做那些特殊的設(shè)置,相反,他們會讓測試失敗因?yàn)樗麄冇懈玫氖虑槿プ觥?/P>
當(dāng)用戶讓測試失敗時,他們開始考慮他們不能夠信任這些測試了。很難說是否測試可以在一個中找到一個正式的bug或者只是一個錯誤的定位。開發(fā)者可能不明白為什么測試者會在一開始就執(zhí)行失敗。一旦他們不再信任你的測試,開發(fā)者將會停止運(yùn)行它們,那么bug就會駐留在程序中,之后一連串的麻煩就來了。。。
為了避免這件事情,確認(rèn)你總是有一個組準(zhǔn)備好了去測試,測試程序則是可以安全運(yùn)行,可信任的。把那些屬于配置挑戰(zhàn)組的測試放到不同的文件夾,樹或者工程中,同時標(biāo)記特殊的說明指明他們在運(yùn)行前需要做什么。完成這些后,開發(fā)者可以不投入時間去配置就開始測試工作。當(dāng)他們有時間和需要時,他們也可以配置,運(yùn)行更多的測試環(huán)節(jié)。
創(chuàng)建維護(hù)測試
我們應(yīng)該試著避免測試私有或保護(hù)成員。這篇文章也許能夠幫助一些人解決一部分問題,但是我很堅(jiān)決相信百分之九十九的時間,你可以全面的測試一個類,通過編寫一些與它的獨(dú)立公共接口相反的單元測試。測試私有成員可以使你的測試更加脆弱,如果這個需要被測試的類的一些內(nèi)在方面略有改動的話。你應(yīng)該使用通過調(diào)用一些代碼里別處的公共功能這一方法去測試私有功能。當(dāng)你依然能夠確定全部功能并沒有改變的時候,僅僅測試公共成員會導(dǎo)致測試遭受常量代碼的因式分解以及內(nèi)部的執(zhí)行情況改變。
在可能的時候,應(yīng)該重新使用你的創(chuàng)造物,處理過程,和聲明代碼。不要在一個單元測試中直接的創(chuàng)建類的實(shí)例。如果你在任何并不包含在此單元測試框架中的類前面看到這個單詞“new”,你應(yīng)該考慮一下將你創(chuàng)造的代碼放在一個特殊的整體方法之中,它可以為你創(chuàng)建一個對象實(shí)例。你可以到時再重新使用這個方法來獲得你的測試在其他測試之中的最新實(shí)例。這樣可以幫助你來保持這個測試維護(hù)所需的時間,然后在測試進(jìn)行的時候,從對代碼無法預(yù)料的改變之中保護(hù)你的測試。作為一個例子,F(xiàn)igure 1展示了一對簡單的測試,它使用了一個Calc類。
假設(shè)你有20,或者你甚至有100,與Calc類做相反測試,所有這些看起來令人吃驚的相似。現(xiàn)在一個計劃的改變迫使你不得不刪除默認(rèn)的Calc構(gòu)造器并且使用一個含有一些參數(shù)的不同的構(gòu)造器。馬上,你所有的測試就被暫停了。你可能可以很輕易的發(fā)現(xiàn)問題的關(guān)鍵并修復(fù)它,但你也可能做不到。最主要的問題是你將會浪費(fèi)很多寶貴時間在修理你的測試上面。如果你在你的測試類之中使用一個整體的方法去創(chuàng)建Calc 實(shí)例,就像Figure 2所顯示的那樣,這些就并不是個問題。
我已經(jīng)對測試做了一些改變已使它們能夠具有更多可維護(hù)性。首先,我將新創(chuàng)建的代碼遷移至可以再度使用的整體方法之中。這就意味著我只需僅僅改變一個簡單的方法以使得在這個測試類中的所有測試在一個新的構(gòu)造器中的能夠正常的工作。另外一個為創(chuàng)造問題而設(shè)的簡單解決方法是把創(chuàng)作物遷移到測試類的<TestInitialize()>方法之中。不幸運(yùn)的是,這個能夠很好的工作僅僅在你重新使用一個對象并在一些測試中把它當(dāng)作一個局部類變量。如果你僅僅為一些測試使用它(部分相關(guān)成員),你倒不如在測試中將它們實(shí)例化,并且使它們更具易讀性。
順便一提的是,請注意,我已經(jīng)將方法命名為Factory_CreateDefaultCalc 。我很喜歡將我測試中的任何幫助方法用特殊的前綴來命名,這樣我就能很輕易的掌握它是做什么用的。這樣對易讀性也是非常有幫助的。
我的第二個改變是重新使用測試中的聲明代碼,并將這段代碼遷移到一個確認(rèn)方法之中。所謂確認(rèn)方法是你測試中的一個可再度使用的方法, 這個方法包含了一個聲明語句但是它可以接受不同輸入和在輸入的基礎(chǔ)上進(jìn)行校驗(yàn)。當(dāng)你在不同輸入或者不同的初始狀態(tài)下一次又一次的聲明同一事物時,你可以使用確認(rèn)方法。這一方法的優(yōu)點(diǎn)是既使在一個不同的方法里面聲明,如果這個聲明失敗了你將可以繼續(xù)保有一個異常處理,而且原始調(diào)用測試將會顯示在測試失敗輸出窗口之中。
我也在Calc 中傳遞實(shí)例而不是使用一個局部變量,因此我知道我經(jīng)常傳遞一個實(shí)例,而且這個實(shí)例是調(diào)用測試將其初始化的。當(dāng)你想要改變對象狀態(tài)時你可能想要做同樣的事情,舉個例子來說,當(dāng)在測試下或者在將會傳遞給測試的對象下配置特殊對象時,可以使用特殊的Configure_XX方法。這些方法應(yīng)該能夠解釋他們配置一個對象將會用來做什么用。Figure 3之中的代碼就是以上方法的實(shí)例。
這個測試擁有很多設(shè)置代碼可以用來處理向注冊管理器對象中添加初始狀態(tài),它是這個測試類之中的成員。在此的確也有一些重復(fù)。Figure 4顯示了在初始代碼之外這些事例在因式分解之后將會如何變化。
更多軟考資料請?jiān)L問:考試吧軟件水平考試欄目
希望與更多網(wǎng)友交流,請進(jìn)入考試吧軟件水平考試論壇
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |