寫單元測試的好處(轉)

許多開發者都有個習慣,常常不樂意去寫個簡單的單元測試程序來驗證自己的代碼。對自己的程序一直非常有自信,或存在僥幸心理每次運行通過后就直接扔給測試組測試了。然而每次測試組的BUG提交過來后就會發現自己的程序還存在許多沒有想到的漏洞。但是每次修改好BUG以后還是懷著僥幸心理,認為這次不會有bug了。然后又一次自信地提交,結果又敗了。因為這樣反復幾次后。開發者花在找BUG和修復BUG的這些時間加起來已經比他開發這個模塊花的時間還要多了。雖然項目經理已經預留了修改BUG和單元測試的時間。但是開發者卻習慣性地在寫好代碼后就認為任務完成了。然后等問題出來了bug改了很多次還是修復不了的時候才和項目經理說“我碰到預想不到的問題,可能要延期發布我的代碼“。如果這個項目不可延期,痛苦的加班就無法避免了。

????為什么有這么多的BUG開發者卻沒發現呢。其實開發者是人又不是機器。人非圣賢孰能無過。BUG是不可避免的,只是每次在修復一個BUG之前基本上無法知道這個BUG是哪段代碼引起。每次定位BUG可能會耗去你一個小時還是一天,這還要取決于你的水平了。但是如果你的每段核心程序都有單元測試代碼。你將不需要靠你的經驗去判斷或猜測BUG是由哪段程序引起。你只要運行你的單元測試方法。通過簡單判斷測試方法的結果就可以輕松定位BUG了。所以從表面上看,為每個單元程序都編寫測試代碼似乎是增加了工作量,但是其實這些代碼不僅為你織起了一張保護網,而且還可以幫助你快速定位錯誤從而使你大大減少修復BUG的時間。而且這還有利你的身體健康,你將不會因為找不出BUG而痛苦不已,也將不用廢寢忘食地加班了。而且項目的進度也將盡在掌握。

其實單元測試不僅能保證項目進度還能優化你的設計。有些開發者會說,寫單元測試代碼太費勁了,比寫業務代碼還麻煩。可是如果強迫開發者必須寫單元測試代碼的時候。聰明且又想‘偷懶’的開發人員為了將來可以更方便地編寫測試代碼。唯一的辦法就是通過優化設計,盡可能得將業務代碼設計成更容易測試的代碼。慢慢地開發者就會發現。自己設計的程序耦合度也越來越低。每個單元程序的輸入輸出,業務內容和異常情況都會盡可能變得簡單。最后發現自己的編程習慣和設計能力也越來越老練了。

其實容易測試的代碼基本上可以和設計良好的代碼劃等號。因為一個單元測試用例其實就是一個單元的最早用戶。容易使用顯然意味著良好的設計。

有著良好設計的項目一直是很注重代碼重用的。代碼重用的好處在這里就不多說了。但是要做到代碼重用首先要保證被重用的單元程序必須是個非常優秀的程序,除了良好的設計,還要有詳細的文檔。另外最重要的其實是單元測試代碼。不知道大家有沒有這樣的經歷?當大家不清楚一個API 函數如何使用而去尋找文檔的幫助時,往往會跳過大段的英文說明而去直接看文檔中提供的樣例程序,然后在自己的程序中依葫蘆畫瓢調用這個函數。那么,您有沒有意識到,被重用的代碼如果有了單元測試代碼。你的測試代碼就可以成為這個函數最好的API 了。

單元測試代碼還可以通過簡單的事務回滾功能在生產環境上做基于真實數據的測試而不用擔心會產生不必要的數據。利用這樣的測試代碼我們可以在發布程序后check 剛才的發布是否成功。以往發布的時候我們經常會碰到一種比較尷尬的情況,當我們將程序發布到正式環境上后,我們每個人心里一直還是有點后顧之憂。因為我們不能在正式環境上運行我們的程序,只能被動地等待客戶操作過后才知道發布的程序是否正常。這種情況讓我們非常被動,如果運氣好可能不出什么問題,可是一旦客戶在正式環境上發現報了個系統異常之類的錯誤或者出現錯誤數據,那就后果很嚴重了,這將影響到產品的聲譽,顯然這樣也是很沒面子事。如果我們運行過單元測試代碼,萬一有問題我們就可以主動的發現并且修改后重新發布。而其有時候就算有問題也可能是一些比較低級的錯誤,或者可能是發布問題造成。基本上很快就能解決掉!這樣我們不就高枕無憂了嗎!

????很多研究結果表明,bug發現的越晚,修改它所需要的成本就越高,因此從成本角度來看,應該盡可能早地查找和修改bug。或許有人會有異議?程序員把bug全找出來了,測試組干嘛?其實測試組進行的是集成測試,這樣的測試無法全面的考慮到每個單元被調用時用的各種輸入參數。就像一輛汽車,對每個零件進行測試是必須的。對組裝好的汽車進行測試是無法代替每個零件的單獨測試。或許對組裝好的汽車進行測試可以發現某些零部件的問題。但是這個時候發現了問題就需要把汽車拆了換零件再裝上。造成的成本可想而知。

????重視單元測試后你將會發現單元測試帶來的好處遠遠不止這些。目前java下的team 開發采用cvs(版本控制) + ant(項目管理) + junit(集成測試) 的模式時,通過對ant的配置,可以很簡單地實現測試自動化。在所有的敏捷軟件開發方法中,XP(Extreme Programming極限編程,一種輕量級的、靈巧的軟件開發方法)是目前應用最為廣泛的一種, 在 XP 中推崇的Test First Design的實現已經有了現成的開發手段:“ 用Junit寫測試代碼,寫實現代碼,運行測試,測試失敗,修改實現代碼,再運行測試,直到測試成功。以后對代碼的修改和優化,運行測試成功,則修改成功。” 等到開發者習慣了這樣的開發手段后,帶給開發者將是一種享受!

轉載于:https://www.cnblogs.com/sandea/p/9099350.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/277937.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/277937.shtml
英文地址,請注明出處:http://en.pswp.cn/news/277937.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux下搭建go環境--問題記錄

記錄自己在linux上搭建go環境的經歷。(因為各種版本,linux系統問題掙扎了幾天) 安裝vmware-tools,把我要運行代碼拷進來。這個網上方法很多,我的電腦抽風不能安裝,后面重裝的虛擬機確定Ubuntu版本、位數。很重要&#…

Teams Bot開發系列:Teams的Activity處理

上一篇文章講了activity處理的流程,我們bot的核心處理邏輯放在ActivityHandler的子類里,通過重載OnMessageActivityAsync()方法來實現。 這篇文章我來講一下對于Teams的bot來說,整個處理的邏輯會有哪些不同點。 通過之前的文章,…

取球博弈

兩個人玩取球的游戲。一共有N個球,每人輪流取球,每次可取集合{n1,n2,n3}中的任何一個數目。 如果無法繼續取球,則游戲結束。 此時,持有奇數個球的一方獲勝。 如果兩人都是奇數,則為平局。 假設雙方都采用最聰明的取法…

MySQL修改字符集

MySQL數據庫修改字符集,介紹一下修改的方法 1)系統工具iconv #file filename #mysqldump --default-character-setutf8 >20180523xxx.sql #file 20180523xxx.sql #iconv -t utf8mb4 -c 20180523xxx.sql>20180523xxxutf8mb4.sql #file 20180523xxxutf8mb4.sql…

Teams Bot開發系列:Bot驗證

我們今天來說一下authentication,authentication一直是一個復雜的問題。bot里的authentication也不簡單。我們先來看一個概念:Bot Framework Token Service,根據官方定義,這個token service主要是: Facilitating the u…

堆排序

目錄 一、定義二、算法分析三、代碼地址一、定義 1.1 堆 ? 此處的堆,指數據結構中的堆。而不是內存中的那種內存堆,內存堆是基于數據結構的一種實現。堆的數據結構是一棵完全二叉樹,它有如下特點:(具體參考下文鏈接&a…

Teams Bot開發系列:Middleware

middleware是目前一些framework比較流行的概念,通常一個開發框架需要提供一些可擴展可定制化的功能。所以middleware這種pattern就很實用。 熟悉asp.net core的開發可能第一個想到的就是asp.net core的middleware,如下圖: 當一個http reques…

如何獲取租戶中所有的Team

大家在使用Graph API開發Teams App的時候,有時候會需要獲取某個租戶Tenant的所有team,在寫這篇文章的時候Graph API并沒有提供這么一個功能,沒有一個類似于”GET /teams”的api。 在Micorsoft Graph官方文檔的已知問題中,也提到了…

mysql常用快速查詢修改操作

mysql常用快速查詢修改操作 一、查找并修改非innodb引擎為innodb引擎 # 通用操作 mysql> select concat(alter table ,table_schema,.,table_name, engineinnodb;) from information_schema.tables where table_schema not in (information_schema,mysql,performance_schem…

ElasticSearch教程——自定義分詞器(轉學習使用)

一、分詞器 Elasticsearch中,內置了很多分詞器(analyzers),例如standard(標準分詞器)、english(英文分詞)和chinese(中文分詞),默認是standard. s…

使用Azure Serverless來開發Teams App

Azure Function可以說比較早期的一個serverless服務,隨著這些年云服務的大行其道,Serverless在概念越來越火,什么叫serverless? Serverless computing (or serverless for short), is an execution model where the cloud provide…

Angular之RouterModule的forRoot與forChild

Angular 提供了一種方式來把服務提供商從模塊中分離出來,以便模塊既可以帶著 providers 被根模塊導入,也可以不帶 providers 被子模塊導入。 區別: forRoot creates a module that contains all the directives, the given routes, and the r…

關于 someone could be eavesdropping on you right now (man-in-the-middle attack) ssh的解決辦法

關于 someone could be eavesdropping on you right now (man-in-the-middle attack) ssh的解決辦法 記錄工作中遇到的問題 someone could be eavesdropping on you right now (man-in-the-middle attack) ssh  由于遠程機器或者重組或者更新了ssh server導致本地記錄的驗證信…

使用AzureFunction開發最簡單的Teams Outgoing Webhook

上篇文章講了teams app的serverless架構,這篇主要講如何真正使用Azure Function來開發一個最最簡單的Teams Outgoing Webhook。 我們先登入azure的portal,創建一個azure function。我這里創建了一個名字叫outgoing-webhook的azure function。完成后如下…

Java 基礎 之 標識符

www.verejava.com/?id1699254… /* 標識符的命名規則: 1. 是以字母,數字,下滑線_和美元符號$ 組成 2. 不能以數字開頭 3. 區分大小寫 4. 不能是java的保留關鍵字 5. 最好是見名思意 */ public class Identifier {public static void main(String[] args…

Ubuntu宿主機與VMware中其他系統虛擬機的互通

Ubuntu做宿主機,VMware中創建Windows10,并且通過三種模式實現兩系統互通,其實并非是件難事。在有線網卡未接網線的環境下,關閉兩系統防火墻,基本遵從下文便可實現。 轉載:https://note.youdao.com/ynotesha…

使用Azure輕松實現Teams App的全球合規性

我在之前的一篇博客里面講了合規性對于我們Teams app是非常重要的,因為office365平臺就是面向全世界用戶的,我們開發的teams app一旦發布后,立刻就會有各國各地區的用戶來進行安裝使用,所以符合用戶所在地區的要求是非常重要的。 …

【php復習之】php創建數組的幾種方式

1、array()函數 1.1無key值 $arrarray(1,2,3,4); 1.2鍵值對 $arrarray( name>myj,age>18,phone>1888888888);1.3空數組 $arrarray(); 2、compact()函數 compact函數可以把變量轉換為數組。 $a aaa;$b bbb;$c ccc;$arr3 compact(a,b,c);輸出:{"a&q…

ADC知識(2)——直流參數(輸入電壓參考,參考電流輸入,積分非線性誤差,差分非線性誤差)...

目錄 四、 輸入參考電壓范圍 五、 參考電流 六、 非線性問題 差分非線性誤差 積分非線性 四、 輸入參考電壓范圍 大多數數據手冊中,將它定義為一個特定的參考電壓值,通常這個電壓作為 此轉換器最常用的參考電壓。在參考輸入電壓…

LuckyDraw app使用CosmosDB的成本分析

我在以前的博客里說過我的LuckyDraw app在數據存儲方面使用的是 Azure Table Storage,當時選擇這個的原因是成本考慮,因為它實在是便宜,對于我這種個人開發維護的免費的teams app來說,成本是一個很重要的考量點。 當然&#xff0…