1. 程式人生 > >大話重構連載12:你不能沒有保險索

大話重構連載12:你不能沒有保險索

通過前面的描述你已經對重構中“小步快跑”的開發模式有了一個清楚的認識。學會和習慣小步快跑的開發模式,對於重構工作極其重要,因為它讓這種大範圍、大幅度修改程式碼的重構工作變得不再像以往那樣讓人膽戰心驚。究其原因,雖然從結果上是在大範圍、大幅度調整,但每一步卻是小範圍、小福度調整,並且能保證每一步都是正確的。

然而,這裡有一個非常重要的假設條件,那就是“保證每一步都是正確的”,這是怎麼保證的呢?就這個問題,我們需要展開來認真討論討論。

毫無疑問,系統重構就其結果來看,是在對軟體系統進行大範圍、大幅度的改動,而這種改動過去我們是無法想象的,因為它實在是改動太大了,一不小心就會產生一個毀滅性的結果。這就是許多人不敢輕易嘗試系統重構的重要原因。

是的,這就是真相,如果你不能正確地驗證每一步系統重構是否正確,或者你的驗證方式存在缺陷,即使小步快跑也不能解決重構帶來的風險。所以我們說,系統重構,你不能沒有保險索。這個保險索就是每次重構後正確的測試方法。

什麼是程式程式碼正確的測試方法,其在不同的場景中標準是不一樣的。但與其它測試不同,系統重構在測試程式碼正確性方面卻有自己獨特的方法。系統重構,從自身的定義上就把其程式碼正確性的驗證方式描述得十分明白,那就是“不改變軟體外部行為”。

“不改變軟體外部行為”,我們可以從多個層面上看待這個問題。首先從功能層面上看,重構前系統提供給使用者什麼樣的功能,重構後也應當提供同樣的功能。說得更加具體一些,重構前,使用者從介面上輸入什麼內容,發出什麼請求,得到什麼結果,那麼重構後用戶應當得到同樣的結果。這種結果可能體現在前端介面所展現的結果中,也可能體現在此處操作後存入資料庫的資料中,即重構前後系統存入資料庫的資料也應當是一致的。存入資料庫的資料同樣是測試中系統輸出的一種。

從功能層面再往下鑽就到了程式碼層面。開啟我們的軟體系統,有各個層次、各項介面和各種函式。我們進行系統重構往往是在某個層次、某項介面或某個函式上進行的重構。比如,我們對某項介面進行重構,那麼我們可能會修改這個介面的實現類、方法函式、底層呼叫類,但不論怎麼修改,這個介面必須保持不變。也就是說,我們程式碼層面的重構,“不改變軟體外部行為”是針對的這個介面。你可以重構介面內部,但必須保證介面外部是不變的。

所以,系統重構的測試可以從兩個層面來進行:系統測試與單元測試。系統測試往往是一種手工測試,當然也可以使用QTP等工具進行一些簡單的錄製。重構前我們首先通過需求文件確認系統現有功能,根據現有功能設計測試用例。然後進入系統,確保每個測試通過,並錄製成QTP指令碼。這樣,我們對重構的準備工作就完成了。在整個測試過程中,我們每完成一次重構就去手工執行這些測試,或者執行QTP指令碼,保證每個測試通過。如果測試不通過,則要麼尋找問題原因並解決,要麼就恢復到上次測試的版本,此次重構宣佈失敗。

反覆地手工進行同樣的測試是一件比較煩人的事,因此你可以有兩個選擇:錄製QTP指令碼,以及在介面層面建立自動化測試程式。這裡所說的自動化測試程式是指那些基於JUnit編寫的自動化測試程式,它實際上是在程式碼層面進行的單元測試。建立自動化測試的關鍵在於我們在哪個層面建立測試。程式碼有許多層次,有函式級別、有類級別、有介面或抽象類級別,從系統分層結構來說有底層、DAO層、BUS層、Web層。每次重構都是站在某個層次進行重構,因此自動化測試程式碼也應當在這個層次上寫。比如最初的重構是在函式層次上進行的,就應當對函式寫測試程式碼;後來在物件層次上進行重構,就對物件寫測試程式碼;再到介面層次……

與手工測試一樣,在系統重構前,我們首先保證原有程式碼自動化測試通過。然後執行重構,保證每次重構都能夠測試通過,如此往復。但重構中的自動化測試有一個問題就是,測試介面不太穩定。起初是在函式級別進行的重構,我們寫了針對函式的測試程式碼。但隨著重構的深入,我們開始在物件層面進行重構了,我們可能要調整原有的函式。這時將意味著原有的針對函式編寫的測試程式碼將失效而必須要遺棄,這不得不說是一種浪費。因此我給大家的建議是,不要過早編寫自動化測試程式碼,它不一定能節省我們的時間,甚至可能花費更多。最初的重構可以採用手工測試或QTP測試的方式進行。

特別說明:希望網友們在轉載本文時,應當註明作者或出處,以示對作者的尊重,謝謝!

相關推薦

大話重構連載12不能沒有保險

通過前面的描述你已經對重構中“小步快跑”的開發模式有了一個清楚的認識。學會和習慣小步快跑的開發模式,對於重構工作極其重要,因為它讓這種大範圍、大幅度修改程式碼的重構工作變得不再像以往那樣讓人膽戰心驚。究其原因,雖然從結果上是在大範圍、大幅度調整,但每一步卻是小範圍、小福度調整,並且能保證每一步都是正確的。

大話重構連載13自動化測試——想說愛不容易

正如許多事情都有其兩面性一樣,測試方法也是這樣。要保證測試方法正確,最簡單、最直觀地想法就是多寫些測試用例,從更多地角度去測試,但這必然增加我們的測試成本。小步快跑要求我們頻繁進行測試,假如我們重構的週期是20分鐘,但測試卻要花掉10分鐘,那麼這樣的成本就實在太大了。假如這種測試還是開發人員手工測試,每天都有

大話重構連載19大物件的演化過程

很好,我們終於邁出了重構的第一步,而這第一步我們瞄準了程式碼問題的重災區——超級大函式。超級大函式之所以是程式碼問題的重災區,就是因為它們往往難於閱讀、難於維護。面對大函式我們採取的辦法是拆分,以功能為核心將其拆分成一個一個獨立的函式。拆分後的程式變得易於閱讀了,因為要讀懂程式你不再需要讀完所有程式碼,選擇性

大話重構連載10小設計而不是大布局

開車的朋友一定深有體會,駕駛汽車其實就是在不斷矯正汽車行駛方向的一個過程。在整個駕駛過程中,你必須全神貫注地緊盯前方,通過方向盤不斷矯正方向,否則即使行駛在直線路段也可能偏離車道。那些疲勞駕駛的司機,因為進入睡眠狀態,無法再矯正方向,車輛就會越來越偏離航向。這種情況下,即使數秒鐘的小盹,也能造成車毀人亡的嚴重

大話重構連載16超級大函式

事情總是這樣的:當我們對一個遺留系統一忍再忍,再忍,忍,還要忍……終於積攢到某一天,實在忍無可忍了,拍案而起,不能再忍了,重構!!!事情就這樣發生了。然而,在這時你突然發現,重構的工作千頭萬緒,真不知從何開始。堆積如山的問題此起彼伏,期望修改的設計思緒萬千。這裡有個想法,那裡有個思路,什麼都想做,卻什麼都做不

大話重構連載首頁

ooo 我們 family 不能 blank 順序 關系 trac 工廠 《大話重構》這本書是我寫的第一本書,從今天起我將通過連載的形式逐漸跟大家分享。 這本書讓你: 告別遊擊隊轉變為正規軍。 遠離劣質代碼走向精妙設計 真正明確專業級的軟件開發是如

騰訊我火了,新浪沒有

作者 | 景歲 本文經授權轉自公眾號“西二旗生活指北” 西二旗救火哪家強?西北旺中路找新浪! 昨天,新浪又一次證明了自己在後廠村上,碾壓群雄的滅火實力。 眾所周知,雖然作為一個嚴肅的生活服務號,但是我平時都是做的精神指北的工作,一般不跟西二旗的熱點,但是

《iOS移動開發從入門到精通》圖書連載12元組型別、一元、二元和三元運算子、 比較運算子

3.2.5 元組型別元組是一個包含了若干個相關聯變數的物件。1 let people = ("John",33)由於Swift的型別推導,people被推導為(String, Int)型別的常量。元組作為一個臨時複合值,元組在某些時候是非常有用的。它經常被用作函

.相親過程有房子麽?有錢麽?有能力麽? 【結婚吧】【先買房子在結婚】【先賺錢再買房子再結婚】都沒有【拜拜~~】 利用if嵌套做相親過程

javascrip text scrip script ext type ava 能力 != <script type="text/javascript"> var a = prompt("你有房子麽?"); if(a!=null) { if(a

百裏玄策‘我有哥哥(大數據),沒有,這就是任性的理由’

大數據這兩年大數據發展越來越好,身處互聯網的環境中,突然發現,周圍的人經常談的話題變了,很多人都在談論大數據、人工智能、智慧城市,大數據中心等大數據相關的內容,看來大數據是真的火起來了, 人類已經進入到了一個無商不利用數據,無領域(包括政府)不利用數據的時代。無論你利用數據賺錢也好,還是希望改善公共服務和社會

程式設計師吐槽年薪170w沒有上升空間,網友知道窮是什麼感覺嗎?

現在國內的網際網路行業對於大齡程式設計師不太友好,於是很多邁過30歲的大齡程式設計師往往會惴惴不安,認為自己就是那個被辭退的,所謂的“拔x無情”大概就是這樣的吧,用完就丟,沒什麼情面好講。 中年危機確實成為程式設計師們關注的一個熱點問題: 如果有想學習java的程式設計師,可來我們的java

IT行業年薪首次超過金融行業排第一平均12拖後腿了嗎?

5月27日,國家統計局釋出2016年平均工資主要資料,國家統計局人口和就業司首席統計師孟燦文進行解讀。資料顯示,2016年城鎮單位就業人員平均工資繼續保持增長,資訊傳輸軟體和資訊科技服務業平均工資水平首次超過金融業排名各行業門類首位。 工資增長與勞動生產率提高基本同步 在經濟執行緩中趨穩、穩中向好

小鯨戀愛班肯定沒有性生活!”

幾天前,何潔一條微博刷爆全網。在微博中,何潔否認了自己“婚內出軌”的事實,並指出,自己之所以一忍再忍,就是為了不想讓孩子受到傷害。同時,何潔也指出,赫子銘之所以懷疑她出軌,就是因為她沒有“伺候”對方瘋狂的慾望。 一句話總結:性生活不和諧是所有矛盾的導火索。 性生活在愛情裡到底有多重要

沒有女生跟暗示跟交往,但卻SB的錯過了?

我們的目標是 沒有最SB 只有更SB!!! MM夜裡跟我說沒地方睡覺... 我於是很興奮的說去打通宵CS吧 結果她在網咖趴了一夜 若干年後才明白她幽怨的眼神 ... 伊是隔壁班的美女。上大課的時候要到的手機號。某次約出來了,晚秋,夜晚,小樹林邊。美女說:我冷。俺說:

程式設計師半夜12點沒加班,領導來我公司養生呢?網友憑什麼?

每次阿里騰訊的朋友聊天問候對方的第一句話就是,你們加班多嗎?每次阿里騰訊的朋友想要轉崗到另一個部門問最多的就是,那邊加班多嗎?每次阿里騰訊的朋友跳槽最關心的問題就是,他們加班多嗎? 請注意以上三段話所隱藏的意思,一是阿里騰訊的加班成為一種常態,多數人預設加班;二是阿里騰

提前認識軟體開發(12)配置檔案讀取及檔案操作

第1部分 重新認識C語言配置檔案讀取及檔案操作【文章摘要】        在通訊領域的軟體開發專案中,C語言是主流的程式語言,而檔案操作在其中又佔有很重要的地位。此外,為了體現產品的靈活性,可新增配置檔

重構可能不知道的重構場景

什麼是重構? “重構”一詞想必你已經聽膩了,就是整理程式碼唄,不不不,重構旨在不改變呼叫者行為的前提下,對內部邏輯進行調整優化,提高其理解性,降低其修改成本,它是一門藝術,是程式設計師至高無上的榮耀…… 何時重構?怎麼重構? 經常聽到周邊的人抱怨沒有時間重構,重構並不是單獨抽出時間集中處理的,而是當你想要做某

C++筆記(12)動態內存和智能指針

style round 運算 span tro 運算符 delet 庫函數 針對                           動態內存和智能指針 動態內存:   1.針對堆裏面存放的對象   2.使用new delete運算符   3.智能指針:shared_ptr

勒索病毒的ATM和POS機還好嗎?

數據恢復 勒索病毒 這幾天,勒索病毒在全球範圍內肆虐,仿佛是IT界的黑死病,所到之處無不烏雲密布血流成河哀鴻遍野。或許你會覺得這樣的描述過於誇張甚至還覺得勒索病毒離你很遠。但是,想象一下,如果你是一位ATM或者POS機的管理員,你的客戶想要取點錢卻看到這個畫面大概是一臉蒙圈的吧?

重構機房收費系統要用的——異常處理和拋出異常(try catch finally)——(vb.net)

style post blue 通過 alt list bcm round 導致 你能保證你的程序不會出問題嗎? 不能 當你的程序執行到某個地方發生了你不想要的結果。你是否想讓它一錯再錯? 不想 你是否想讓你的程序占著茅坑不拉屎? 不想 你是否想知道你的程序出錯的原因?