zcx

          2005年1月11日

               摘要: 用Commons Modeler 開發(fā)JMX應用 Modeler組件是Jakarta Commons 項目針對Model MBeans提供的一個便利的開發(fā)組件。 首先介紹一下基本的概念:Managed bean簡稱Mbean,是對可被管理的資源的抽象定義,ModelBean是JMX定義的Mbean中動態(tài)和靈活的一種。但是要實現(xiàn)它開發(fā)人員必須設置大量的Metadata信息。Modeler組件針對Mo...  閱讀全文
          posted @ 2005-01-11 18:05 zcx 閱讀(2141) | 評論 (1)編輯 收藏
           

          單元測試的局限
          關于單元測試的一篇好文章,我只翻譯了一段,有興趣的可以看看原文。

          譯自:http://www.theserverside.com/blogs/showblog.tss?id=Unitized


          考慮一下單元測試的目的和原則:
          1。盡量小粒度的“單元”被測試。
          2。測試在于其它模塊隔離地情況下獨立地完成。
          3。Mocking在隔離的方面作出了強化。
          4。代碼和測試都是同一個人完成的。

          把上面提到的考慮在一起,意味著單元測試是測試整個代碼中最低層次的部分,每一個部分是和其它部分隔離的。測試和編碼是同一個人完成的。
          這種方式的測試正是“我”所說的“l(fā)ow hanging fruit”[可輕易實現(xiàn)的目標 (easy targets)]。它可以捕獲小的問題,也就是可以找到不符合單元測試的要求的單獨的函數(shù)或者類。

          單元測試是一個好事,提供了對于自己代碼正確性的有價值的反饋。但是“Keep in mind" 它只能得到“l(fā)ow hanging fruit”。在設計上,單元測試被期望“簡單的”、“作為系統(tǒng)中獨立的小部分”。因為這些,在它的本質(zhì)上(與生俱來的),單元測試沒有考慮系統(tǒng)的“組合”,它只考慮獨立的部分。單元測試從不檢查一個系統(tǒng)中內(nèi)部的聯(lián)絡,從不檢查他們是如何捆綁在一起的。

          根據(jù)“我”的經(jīng)驗,系統(tǒng)中如何聯(lián)絡和如何捆綁在一起正是系統(tǒng)的復雜度所在。
          正是這種“連接”定義了你的設計,如果在一個足夠高的層次上考慮,這種聯(lián)系甚至可以理解為系統(tǒng)的架構。
          信息是如何在不同的軟件層上和不同的組件之間的流動實實在在的定義了一個應用。
          由此看來,單元測試是不會測試一個應用的這些方面的。單元測試忽略了信息是如何在不同的層和不同的組件之間流動的,忽略了類和對象在一個大的架構和設計中如何相互關聯(lián)和組合在一起的。
          這就意味著單元測試只能在獨立的代碼片斷中捕獲簡單的錯誤,但是對系統(tǒng)的整體的設計或者機構Say nothing。
          設計和架構限定了你的系統(tǒng)的性能,內(nèi)存使用,“端到端”的正確性。[用戶的輸入,到Server處理所使用的,到最后的返回的整個路徑]。所以這些是如何進行聯(lián)系的顯示了系統(tǒng)的行為,并且正是在這個范圍中存在著the toughest bug 和 problems,要想讓一切OK,程序員們也要在這個地方苦干不止。
          編寫隔離的獨立組件是容易的,把他們粘合在一起是困難的。單元測試只在隔離的在獨立的部分上作判斷,而不是在整體上。

          使系統(tǒng)中的一個組件的動作正確相當來說是價值不高的活動。獨立的編寫一個系統(tǒng)的組件不是計算機編程的困難的部分,任何一個個體的小的組件都是容易編寫的。在開發(fā)中最難的部分來自于如何把所有的組件捆綁在一起工作。單元測試可以驗證每一個你編寫的獨立組件是不是按照你所想的那樣工作,但是它不能檢查更復雜的“wiring”--“wiring”正是我們的設計,開發(fā)和調(diào)試絕大部分工數(shù)所在。

          從上看來,單元測試不會指出“端到端”的處理是否正常,不會關心性能,不會關心內(nèi)存的使用,不會關心可用性,不會關心代碼是否正是用戶想要的。它也不會捕獲多線程的bug,或者錯誤的理解了外部API或者子系統(tǒng)的使用等等。這些并不意味著單元測試是不好的或者應該避免的,它只是說明單元測試只會給你一個有限的回報。設想我們作為開發(fā)人員,我們沒有無限的資源去開發(fā)我們的代碼,我們不得不聰明的決定我們要把我們的精力放在那里。我們不得不經(jīng)常的折衷和決定怎樣做有最好的效果。

          在“我”參加的所有開發(fā)中。單元測試覆蓋了絕大部分的代碼,但是在以下的方面的努力還差得很遠:
          1。應用程序設計的本身。你應該花費更多的時間在你的設計上,采用一種迭代的,真實地方式而不是花費在單元測試上,因為一個好的設計得到的回報比任何數(shù)量的單元測試都多。
          2。集成測試(Integration Test)。集成測試的測試特征是基于“端到端”的。通過它的設計可以證明你的獨立的組件可以工作在一起。通過一個集成測試,你可以更信賴你的系統(tǒng)按照“端到端”的方式工作,而不是一些獨立的對象。
          3。功能測試和回歸測試(Functional Test&Regression Test)。系統(tǒng)不是開發(fā)人員想的那樣,而是用戶期望它是什么樣子。更進一步,回歸測試當新的特性被追加或者底層的代碼被改變時,驗證高級別的功能的正確性沒有被改變。
          4。非功能測試(Non-function Test)。在可接受的運行需求下,代碼作為整體被運行,請求在可接受的時間范圍內(nèi)被處理。sever不會因為有3個用戶請求就會memory緊張。等等。

          做以上的東西會比單元測試難很多。但是在同樣的投入下會得到更多的回報。

          posted @ 2005-01-11 18:02 zcx 閱讀(866) | 評論 (2)編輯 收藏
           

          Java ClassLoader 實現(xiàn)程序的擴展性

            

          今天在完成一個功能的候,使用了ServiceLocate模式,

          過這個模式,在程序中可以自由的加其他成員實現(xiàn)的功能模

          具體的做法:

           1)定義標準的服接口。

           2)定描述實現(xiàn)接口的xml文件。

           3)程序xml文件,使用Class.newInstance()例化具體的服務對象。

           4)建立一個特定服和特定服務實現(xiàn)對應HashMap象。完成注冊任

           5)主程序中根據(jù)具體的服HashMap中取得具體的行服

           

          個方法,可以完成基于Interface開發(fā)要求,利于Test和程序的拓展性。

          有新的要求出現(xiàn)后,只需要添加xml中的元素和具體的實現(xiàn)類就可以了。

           

          接下來,繼續(xù)想。又發(fā)現(xiàn)問題

          1xml是和程序一起發(fā)布的,如果用隨意改了。很明程序會崩

          解決方法:xml放在jar包中,使用getClass().getResourceAsStream(String name)

          自己加載進來。用完全不知道具體的情況。

           

          2)如果把xml放在了jar包中“藏起來”,實際上原來來的動態(tài)擴展的特性,

          也就沒有那了。如何解決呢

           

          細細想來,問題關鍵在于,所有的服務實象的創(chuàng)建和注冊都是在

          主控程序中通xml來完成的。如果可以把個注冊和例化的程從主控程序

          中分離出來,通過每個服務實象自注冊來完成,那算是真正的可拓展的。

          如果需要完成新的功能,只需要把新的服務對Class發(fā)布,重新運行主控程序就會實現(xiàn)的功能。(看起來就和Eclipse

          真是一個不的想法,但是怎做呢?

           

          看看Eclipse如何做的。

          http://www.eclipse.org/articles/Article-Plug-in-architecture/plugin_architecture.html

           

           

          首先要有一個規(guī)定的plugin deploy這樣主程序才知道從哪里加

          要有一個plugin.xml文件描述plugin.著文件中有屬性:class="foo.bar.Plugin">

          看上去和我原來做的方式一啊。但是它是如何把個目下的plugin都加的呢?

          我沒有看Eclipse的源,不知道他是怎寫的)

           

          再想想,其主要要解決的問題是不通主框架程序注冊服務實現(xiàn)

          應該由服程序自己注冊上來。按照個思路,我想有兩解決方案。

          1)服接口添加registerService 方法。

             * jarMETATINFO文件中定義類名。

             * 從特定的目jar/class文件。

             * URLClassLoader.newInstance()

             * 后把ServiceLoader參數(shù)出入 service.registerSevice()

             * service象完成自己的注冊。

          2)服添加static端在例化的候自完成注冊。

             * 之前和上一個方法一

             * SeviceLoader實現(xiàn)為單態(tài)的模式。提供靜態(tài)的注冊方法。

             * servie象中實現(xiàn)如下的代段完成自注冊。

             static

                        {

                          ServiceLoader.registerService(new service());

                        }

           

           

          這樣看來總算OK了吧。

          posted @ 2005-01-11 18:00 zcx 閱讀(664) | 評論 (0)編輯 收藏
           

          原來在http://a-ke.blogbus.com 發(fā)現(xiàn)太慢了。

          自己上都費勁。轉(zhuǎn)到這里會好一些吧!

          回頭把東西都搬過來。

          posted @ 2005-01-11 17:54 zcx 閱讀(591) | 評論 (0)編輯 收藏
           
          主站蜘蛛池模板: 东辽县| 余姚市| 秭归县| 澜沧| 云浮市| 山西省| 龙门县| 陇西县| 洞头县| 长寿区| 依安县| 乌拉特后旗| 通海县| 伊吾县| 阿拉尔市| 禹城市| 松潘县| 彝良县| 郑州市| 鄂伦春自治旗| 大新县| 石渠县| 无为县| 和硕县| 海口市| 辽阳县| 唐山市| 沾益县| 四子王旗| 札达县| 绩溪县| 开平市| 徐水县| 巴东县| 腾冲县| 贵南县| 涡阳县| 灌云县| 方城县| 盐边县| 安康市|