<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    John Jiang

    a cup of Java, cheers!
    https://github.com/johnshajiang/blog

       :: 首頁 ::  :: 聯系 :: 聚合  :: 管理 ::
      131 隨筆 :: 1 文章 :: 530 評論 :: 0 Trackbacks
    何時編寫單元測試?
        是在編寫一個方法之前就編寫它的單元測試,還是在寫完這個方法,甚至是整個類之后才編寫單元測試呢?John Ferguson Smart[1]在他的blog中再次提出了這個問題,并根據自己的經驗給出了一些建議。(2008.06.10最后更新)

        都別書生意氣了。在你編寫一個方法之前或是之后編寫單元測試--根據我的經驗,只要你在編寫代碼的幾乎同時就考慮并編寫單元測試程序,那么這就無關緊要了。過后再返回去(或者根本就不回去)寫測試程序將導致問題。就我個人而言,我喜歡在編寫少量代碼之前或緊接著的之后就編寫單元測試--這不會打破工作流程,因為它就是流程的一部分
        這需要一點兒實踐經驗--缺乏經驗的開發者經常為要寫什么樣的測試程序而煩惱。但這可能也反映出一個事實:他們同樣也不知道要寫什么樣的代碼。一些人評說TDD能夠鼓勵進行微設計--一種非常底層的設計,它不需要考慮較大的場景。這會發生在缺乏經驗的開發者身上;如果你教條般地應用這種方法,同樣也會遇上。像行為驅動開發這樣的方法在此處就會很酷。當你在寫getter方法之前,你會寫一個針對這個getter方法的單元測試嗎?如果是的話,那么你的單元測試專注的層次就較高了,也會更接近于用戶(或系統)的需求。
        回到問題的本質,為什么我喜歡把單元測試放在最開始的位置?很簡單!我的實踐經驗告訴我,那樣可以幫助提高代碼的質量,并且節約調試時間。在開始時寫十個小的單元測試所花的時間比在以后修復Bug所花的時間要少,如果代碼經過了正確的單元測試,那就不會有Bug了。
        事實上,我屢屢見到,如果某些代碼經過了適當的單元測試,那么就不會有編碼問題。最近就有一個例子:花了一個小時的時間去搜尋Web應用中的一個問題,該問題出現在一個編寫正確的Spring-MVC程序中。結果是由于一個檢驗器類忽略了一個異常。很容易就發現了這個問題,實際上,在看了代碼(代碼檢查(Code Review)也很有效)之后立刻就發現了。但關鍵是,我們花了一個小時甚至更多的時間去找這個需要進行檢查的類。如果這些代碼經過了適當的測試,那么就能很快地發現并解決這個問題。
        根據我的經驗,當人們在編寫完程序之后才開始編寫單元測試,就如同事后才有這樣的想法,他們很難寫出這些測試了 ("我已經完成了所有的代碼,此時我還得去寫單元測試")。或者根本就不去做。在這種情況下,代碼是否完成了呢?如果代碼運行地很好,那就算是完成了。這樣的話,再寫單元測試就大大地喪失了它的價值。還不僅如此,事后編寫的單元測試將是膚淺的,不會對代碼進行良好地測試。或者,開發者已經耗完了時間,他們根本就不想再為單元測試傷神了。
        TDD與任何其它的編碼實踐一樣。當你正在學習某個新的技術時,你會傾向于對學習指導亦步亦趨。類似地,當你學習一項武術時,你也會試著一步步地模仿大師的動作,而不必去理解其中的邏輯。一旦你熟悉了某個技術,能夠熟練地使用它,并對它有了更深入地理解,然后,你就能改進它,并與你之前掌握的其它技術進行溶合了。

    譯注
    [1]John是Java Power Tools一書的主作者,也是java.net中一位活躍的Blogger

    譯后
        上周在java.net上看到這篇Blog,再聯想到自己在平時工作中的單元測試實踐,有些感觸,故將其翻譯了出來,與大家共享。
        事先就編寫單元測試,還是事后才編寫單元測試?這是一個老問題。按照TDD的思想,自然是要先編寫單元測試,然后再編寫能夠通過該單元測試的方法。
        但,單元測試并不是TDD的專屬領地,很多不實踐TDD的項目也在應用著單元測試。
        我認為,在不實踐TDD的項目中(我自己所處的環境就是如此),事后編寫單元測試仍有著其合理性:
        1. 以消極的態度來看,既然項目本身不嚴格要求事先編寫單元測試,那么就可以在事后去做了。這至少比不去做要好,聊勝于無嘛。(嘿嘿,是夠消極的,但也拿你沒辦法)
        2. 事后編寫單元測試至少也是一種檢驗手段,當然,肯定比不上事先編寫的單元測試。因為,事后編寫的單元測試很可能會"將就"已經寫好的應用程序,正如John所說"事后編寫的單元測試將是膚淺的,不會對代碼進行良好地測試"。但...仍然是聊勝于無嘛 :-D (哈哈,有完沒完了)
        3. 可以把單元測試,其中就包含事后單元測試,作為"后來者"了解、學習應用程序的手段。因為單元測試程序就是應用程序的"客戶",所以無論它是事先寫的,還是事后寫的,都能夠表現出應用程序的行為。
        4. 事后單元測試,也可能轉化為事先單元測試。在應用程序的整個生命周期中,維護階段是最長的。在"漫長"的維護過程中,"之前"所寫的"事后"單元測試將會成為"后來者"(包括原始作者本人)的"事先"單元測試。在改進程序的過程中,這些單元測試仍然能起到監督的作用。(orz,有點兒詭辯)
        雖然,事后單元測試明顯不如事先單元測試,但它的作用仍然不可低估。只要編寫了優秀的單元測試程序,無論是在哪個階段,它都會對改進應用程序有莫大的幫助。(這可不是"聊勝于無"能夠表達的)

    posted on 2008-06-09 20:55 John Jiang 閱讀(2716) 評論(2)  編輯  收藏 所屬分類: OthersJava翻譯UnitTestJUnitMethodology

    評論

    # re: 何時編寫單元測試?(譯) 2008-06-11 14:04 于翔
    單元測試程序就是應用程序的"客戶",這句話我喜歡!^_^  回復  更多評論
      

    # re: 何時編寫單元測試?(譯) 2008-06-11 16:07 Sha Jiang
    嘿嘿,謝謝!
    但我不敢以這句話的原創者自居*_* 它實際上是我在學習JUnit in Action時記下來的。
    當時也與你一樣,認為它說得很好,所以一直記在心頭。  回復  更多評論
      

    主站蜘蛛池模板: 乱爱性全过程免费视频| 亚洲精品不卡视频| MM1313亚洲精品无码久久| 97视频免费在线| 亚洲福利一区二区精品秒拍| 免费A级毛片无码A∨中文字幕下载| 中文字幕精品亚洲无线码一区| 亚洲免费视频一区二区三区| 亚洲 国产 图片| 亚洲国产免费综合| 国产亚洲精品无码成人| 国产精品区免费视频| 亚洲激情在线视频| 亚洲性线免费观看视频成熟| 亚洲一卡一卡二新区无人区| 日本免费人成视频播放| 污视频网站在线观看免费| 亚洲午夜激情视频| 免费精品无码AV片在线观看| 亚洲国产精品久久丫| 成人免费网站在线观看| 精品在线视频免费| 亚洲精品无码不卡在线播HE| 99热这里有免费国产精品| 亚洲一级高清在线中文字幕| 国产成人免费网站在线观看| 久久久受www免费人成| 91嫩草私人成人亚洲影院| 最近中文字幕免费mv视频7| 免费无码专区毛片高潮喷水| 亚洲人成色7777在线观看| 最近免费最新高清中文字幕韩国| 亚洲国产激情在线一区| 亚洲成人国产精品| 三年片在线观看免费观看大全动漫 | 亚洲av综合av一区| 97视频免费在线| 一本久久A久久免费精品不卡| 亚洲国产高清视频| 国产成人免费a在线视频app| 精品视频在线免费观看|