1. 程式人生 > >大話重構連載13:自動化測試——想說愛你不容易

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

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

你可能立即就想到自動化測試了。是的,在許多重構的書籍中,大師們都建議我們在重構開始前,首先建立自動化測試機制。但遺憾的是,我經過多年的實踐總結出來的經驗是,這幾乎不可能實現。每次重構,我們面臨的都是一個個遺留系統。大多數遺留系統都有一些共同的特徵:程式碼凌亂,沒有清晰的介面;程式碼間耦合度高,相互依賴嚴重;web層、業務層、資料訪問層往往沒有清晰的界限,程式碼相互參雜其中。在這樣的情況下,編寫自動化測試程式碼是幾乎不可完成的任務。當然,這裡所說的自動化測試程式碼,是指那些基於JUnit編寫的自動化測試程式

舉一個簡單的例子:假如你現在要測試一個開票類,想編寫它的測試程式碼。本來這個開票類並不複雜,業務也很清晰。但是在函式傳遞引數時,其中一個引數是Web容器中的Request、Response或Session。這下麻煩了,為了測試一個簡單的函式,我們必須啟動整個Web應用,這是我們不可接受的。

隨後你可能會說了,我們為什麼非要傳遞一個真正地Request、Response或Session呢?我們Mock一個假的嘛!想法不錯,但你真正去嘗試Mock時你會發現這也是一個不可完成的任務。Request、Response或Session有許多的狀態,屬性變數中又有物件,又有屬性變數。除此還有大量集合變數,集合變數裡都有什麼物件,天才知道。因此,即使你費盡千辛萬苦Mock出來,也可能因某些屬性不對而使得測試失敗。

另一個寫自動化測試程式比較忌諱的就是訪問資料庫。比如你這次執行的插入操作成功了,並不意味著下次執行就可以成功。下次執行會報“主鍵衝突”錯誤,出現這個錯誤並不是被測程式錯了,而是測試程式錯了。上次執行一個查詢產生的結果集,不一定就是下一次執行同樣一個查詢產生的結果。查詢結果變了,並不意味著被測程式錯了,而是測試程式不對。自動化測試程式之所以能夠自動化執行,必須要保證測試過程是可以反覆執行的,並且不論什麼時候執行都有一個確定的結果。

總之,自動化測試不是銀彈,並不是所有程式碼都適合自動化測試。與Web容器或其它裝置驅動相關的程式碼是不適合自動化測試的,因為我們在測試的時候不希望去啟動Web容器或其它裝置。因此,我們在做自動化測試程式前,首先應當確保要測試的程式已經與Web容器或其它裝置驅動相關的程式碼充分解耦。一個比較好的辦法就是分離出Web層與BUS層,Web層負責從Web容器中獲取資料,並打包傳遞給BUS層,而BUS層則完成真正需要測試的業務邏輯。

另一個不適合自動化測試的就是要訪問資料庫的程式,因為它們執行的結果總是與資料庫狀態有關,無法獲得穩定而可以不斷復現的結果。所以,我們解決它的最好辦法就是將訪問資料庫的部分Mock掉。如何Mock呢?你不能Mock一個JDBC,也不能Mock一個Hibernate,因為那都過於複雜了,你唯一可以做的就是將DAO層Mock掉。這就要求我們對系統重構的時候,要將資料庫訪問的程式碼從業務程式碼中脫離出來,寫入到DAO層。最後,被Mock的DAO層程式碼並不真正去訪問資料庫。每當客戶程式傳入一個引數時,它首先作為測試程式去驗證這個引數是否與預期一致,然後返回一個確定的結果。

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

相關推薦

大話重構連載13自動化測試——容易

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

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

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

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

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

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

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

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

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

程序猿悲喜錄魔都,容易

求職 輔助 開發項目 想法 小天 計算機專業 簡單 用不了 上下 程序猿悲喜錄:魔都,想說愛你不容易 初入魔都男怕入錯行,女怕嫁錯郎,真是一語中的,想當初為了贏取白富美,走上人生巔峰,腦袋一抽便進入了開發行業,坎坎坷坷,如今頭發都禿了。 從學校出來,便留在了上海,想要創出一

程式猿悲喜錄魔都,容易

  初入魔都 男怕入錯行,女怕嫁錯郎,真是一語中的,想當初為了贏取白富美,走上人生巔峰,腦袋一抽便進入了開發行業,坎坎坷坷,如今頭髮都禿了。   從學校出來,便留在了上海,想要創出一番事業,像模像樣的規劃著自己的未來,一時間機會多、工資高等種種美好的憧憬閃耀在眼前

Django ORM模型容易

作者:Vamei 出處:http://www.cnblogs.com/vamei 嚴禁轉載。 使用Python的Django模型的話,一般都會用它自帶的ORM(Object-relational mapping)模型。這個ORM模型的設計比較簡單,學起來不會特別花時間。不過,Django的ORM模型有自

WebView 容易

cati tint line tex ext web show 開發 原生 為什麽要使用WebView 隨著app業務的不斷深入發展,只靠著原生代碼來堆砌功能是不現實,畢竟開發的時長會增加,而且同時需要開發iOS和Android兩套,並且,如果在UI上改變了一丁點,都需要提

大資料,容易

不論是在過去還是現在,人的生活沒法離開資料。作為科學工作者,尤其是系統學過統計學後,對於資料有了更為理性的認知。如今進入了大資料時代,大到國家政策決策 ,小到企業或醫院管理,都離不開資料分析。最近就遇到一個地方部門拋棄傳統的調查,直接使用網路系統大資料定性事關企業是否合法經營的事,讓人哭笑

RabbitMQ,容易(附詳細安裝教程)

# 前言 本文講述的只是主要是 `RabbitMQ` 的入門知識,學習本文主要可以掌握以下知識點: - MQ 的發展史 - AMQP 協議 - Rabbit MQ 的安裝 - Rabbit MQ 在 Java API 中的使用 - RabbitMQ 與 SpringBoot 的整合 # MQ 的誕生歷史

大話重構連載首頁

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

SoapUI實踐自動化測試、壓力測試、持續集成

soapui 因為項目的原因,前段時間研究並使用了 SoapUI 測試工具進行自測開發的 api。下面將研究的成果展示給大家,希望對需要的人有所幫助。SoapUI 是什麽?SoapUI 是一個開源測試工具,通過 soap/http 來檢查、調用、實現 Web Service 的功能/負載/符合性測試。該工具既

測試小故事86自動化測試

  記得很早之前的一件事:一起合作的一名手工測試轉向自動化測試,一個不錯的轉變,新的領域和開始。   過了段時間再次相遇聊到,卻有了一些無耐和迷茫:做的自動化要求全部通過,問之原因是因為要求給客戶看到一切正常的表現;每天在編碼,只是在定位元素,最初設想的從底層的測試提升質

數十位行業高管講述自動化測試優勢及解決的現實問題

眾所周知,測試的技能要求不再簡單,自動化測試作為軟體測試的主流發展方向。為了收集當前和未來自動化測試狀態的見解,我們詢問了來自27家公司的31位高管,“自動化測試解決了哪些現實問題?” 這是他們告訴我們的: 受訪者 公關公司執行長Gil Sever和 Applitools首席營銷官&

第二章自動化測試框架Cucumber,Ruby實戰----環境搭建

1.配置Ruby環境 1.安裝JDK,並配置環境變數 2.Jruby-9.1.2.0 下載地址:https://pan.baidu.com/s/1kiDe_pkeVzqmViKihwx91A 將壓縮包下載到本地,並解壓。 配置環境變數: PATH=c:\jruby-9.1.2

《程式設計珠璣》程式碼之路8自動化測試

這次的內容會比較輕鬆,一段程式碼寫好了,如何保證它是正確的? 比如就寫好了一個二分查詢吧,確定它正確?手動的話,估計是個正常人10次就哭了。所以如果能自動執行的話,那就很開心了。 為了做到自動化測試,我們需要用到下面語句: assert(i >= 0):在i大於或者等於0的時候正常

【 專欄 】- DevOps系列之自動化測試

DevOps系列之:自動化測試 測試在整個軟體生命週期中佔據及其重要的地位,在DevOps實踐中如何更好的整合相關的工具和經驗也一直是一個重要課題。

自動化測試自動化測試的策略的注意點

制定自動化測試的策略時,需要考慮以下幾點:      1. 確定被測的軟體適合做自動化測試 適合做自動化測試的系統,通常是一些生命週期比較長、且系統功能實現自動化測試也較為容易的專案或產品。      2. 確定自動化測試的風險 根據所屬系統的開發平臺、介面特性、測試

SoapUI實踐自動化測試、壓力測試、持續整合

 因為專案的原因,前段時間研究並使用了 SoapUI 測試工具進行自測開發的 api。下面將研究的成果展示給大家,希望對需要的人有所幫助。SoapUI 是什麼?SoapUI 是一個開源測試工具,通過 soap/http 來檢查、呼叫、實現 Web Service 的功能/負載