隨筆-124  評論-194  文章-0  trackbacks-0

          ASSERT是在調試與測試環境,讓程序員和測試者及時發現運行時錯誤的極簡極佳之方法。

          其語法如下:

          在語法上,為了支持assertion,Java增加了一個關鍵字assert。它包括兩種表達式,分別如下:

          1. assert expression1;
          2. assert expression1: expression2;

          在兩種表達式中,expression1表示一個boolean表達式,expression2表示一個基本類型或者是一個對象(Object) ,基本類型包括boolean,char,double,float,int和long。由于所有類都為Object的子類,因此這個參數可以用于所有對象。

          在運行時,如果關閉了assertion功能,這些語句將不起任何作用。如果打開了assertion功能,那么expression1的值將被計算,如果它的值為false,該語句強拋出一個AssertionError對象。如果assertion語句包括expression2參數,程序將計算出 expression2的結果,然后將這個結果作為AssertionError的構造函數的參數,來創建AssertionError對象,并拋出該對象;如果expression1值為true,expression2將不被計算。

          詳盡說明(點這里)。

          它的語法因為簡單所以美麗。

          注意它絕對不應用于發布和用戶使用環境,ASSERT就像蓋房子時的綠罩子、絞手架,在施工期間,防止石塊跌落,同時也有協助施工的作用。

          JAVA源自C++,后者中被大力推廣的ASSERT,在JAVA里應該有十分的存在理由。ASSERT更象是一種編程方法和習慣,而不應該受到語言的局限。

          做為JAVA程序員,應該非常慶幸:C++的ASSERT幾乎就真是一句“斷言”,單憑它,你只能知道錯了,而不知錯在何處。要在實際項目中使用它,幾乎都要用宏去重新定義,讓它帶有更多的調試信息,甚至是堆棧信息,做到這點還是需要些技巧的。而JAVA的ASSERT天生語法就可帶有可讀信息,并且自動拋出異常,我們可以方便看到堆棧。

          有的文章攻擊ASSERT(點這里),是混淆了其使用目的的結果。

          現在的IDE及WEB調試環境都可以方便的控制VM參數,雖然JAVA可以選擇在發布版本也使用ASSERT,但JAVA本身也和C++一樣遵循默認不開啟它。你只需要在調試和測試的時候加上-ea(enable assertion)即可。

          UNIT TEST并不能替代ASSERT。ASSERT是在真真正正實在的運行中產生作用,不同于單元測試中的MOCK框架或者函數級別的“驗證”測試。它著重于在整個系統運行時就將錯誤揪出來,試問單元測試能做到模擬整套系統運行嗎?

          總之,ASSERT是前人多年編程過程中積累的工具和經驗,我們應該多用它。以幾條摘自《高質量C/C++編程指南》使用規則結束本文:

          【規則6-5-1】使用斷言捕捉不應該發生的非法情況。不要混淆非法情況與錯誤情況之間的區別,后者是必然存在的并且是一定要作出處理的。
          【規則6-5-2】在函數的入口處,使用斷言檢查參數的有效性(合法性)。
          【建議6-5-1】在編寫函數時,要進行反復的考查,并且自問:“我打算做哪些假定?”一旦確定了的假定,就要使用斷言對假定進行檢查。
          【建議6-5-2】一般教科書都鼓勵程序員們進行防錯設計,但要記住這種編程風格可能會隱瞞錯誤。當進行防錯設計時,如果“不可能發生”的事情的確發生了,則要使用斷言進行報警。

          posted on 2008-05-30 11:54 我愛佳娃 閱讀(2087) 評論(3)  編輯  收藏 所屬分類: JAVA基礎

          評論:
          # re: 被程序員和測試員遺忘的好朋友--ASSERT 2008-05-30 14:42 | Edward's
          我覺得測試和代碼還是應該分開  回復  更多評論
            
          # re: 被程序員和測試員遺忘的好朋友--ASSERT 2008-05-30 15:57 | 我愛佳娃
          ASSERT只是一種斷言不可能的情況,應該不算是真正的測試,只是能夠在運行時及時提供信息給程序員和測試員的工具。它和UT并不沖突,適用場合不同。  回復  更多評論
            
          # re: 被程序員和測試員遺忘的好朋友--ASSERT 2008-05-30 18:44 | python
          assert語句在代碼中主要用于代碼調試吧?Java中測試可以用Junit等工具  回復  更多評論
            
          主站蜘蛛池模板: 惠水县| 武城县| 长沙市| 营口市| 扎兰屯市| 和静县| 邛崃市| 安泽县| 三原县| 福建省| 连州市| 镇巴县| 客服| 通化县| 禄丰县| 延长县| 德钦县| 北京市| 剑川县| 清涧县| 芦山县| 县级市| 灵山县| 古蔺县| 连江县| 本溪| 腾冲县| 广东省| 运城市| 沽源县| 个旧市| 海兴县| 平塘县| 城市| 乐山市| 肃南| 长春市| 昌都县| 桓仁| 略阳县| 桃园市|