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

          ASSERT是在調(diào)試與測試環(huán)境,讓程序員和測試者及時發(fā)現(xiàn)運(yùn)行時錯誤的極簡極佳之方法。

          其語法如下:

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

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

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

          在運(yùn)行時,如果關(guān)閉了assertion功能,這些語句將不起任何作用。如果打開了assertion功能,那么expression1的值將被計算,如果它的值為false,該語句強(qiáng)拋出一個AssertionError對象。如果assertion語句包括expression2參數(shù),程序?qū)⒂嬎愠?expression2的結(jié)果,然后將這個結(jié)果作為AssertionError的構(gòu)造函數(shù)的參數(shù),來創(chuàng)建AssertionError對象,并拋出該對象;如果expression1值為true,expression2將不被計算。

          詳盡說明(點(diǎn)這里)。

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

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

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

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

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

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

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

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

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

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

          評論:
          # re: 被程序員和測試員遺忘的好朋友--ASSERT 2008-05-30 14:42 | Edward's
          我覺得測試和代碼還是應(yīng)該分開  回復(fù)  更多評論
            
          # re: 被程序員和測試員遺忘的好朋友--ASSERT 2008-05-30 15:57 | 我愛佳娃
          ASSERT只是一種斷言不可能的情況,應(yīng)該不算是真正的測試,只是能夠在運(yùn)行時及時提供信息給程序員和測試員的工具。它和UT并不沖突,適用場合不同。  回復(fù)  更多評論
            
          # re: 被程序員和測試員遺忘的好朋友--ASSERT 2008-05-30 18:44 | python
          assert語句在代碼中主要用于代碼調(diào)試吧?Java中測試可以用Junit等工具  回復(fù)  更多評論
            
          主站蜘蛛池模板: 五常市| 繁峙县| 丹棱县| 永安市| 兴国县| 宁都县| 弥渡县| 寿阳县| 定陶县| 石台县| 金阳县| 清河县| 建平县| 安庆市| 克东县| 乐陵市| 永丰县| 桃源县| 民县| 漳平市| 辽阳市| 锡林浩特市| 咸宁市| 巩义市| 合作市| 同江市| 调兵山市| 宝鸡市| 清丰县| 积石山| 临澧县| 格尔木市| 大新县| 桦甸市| 广东省| 红河县| 吴桥县| 临海市| 宁国市| 巴彦县| 瓦房店市|