路是爬出來的

          #

          今天又去見客戶了

                  今天跟市場的人去跑。見一個客戶,都怪我連對方是什么樣的情況都不了解,去的很匆忙。只知道是做外貿的,想做個網站。

          去到一看,傻眼了。洋人。哈,幸好跟我同去的老板會英文。不知道他們在唧咕什么,后來都是老板跟我翻譯,然后我提出一些要求,最后談到價錢。整個過程就是這么簡單。

                 讓我感受最深刻是要學英文了。不過最欣慰的是,那邊的電腦都中毒了。因此認識了些女孩子,并加了QQ,說什么遠程協助幫她殺毒。哈哈哈

                 希望可以幫到她們,不過說實話,沒有一個懂電腦的在身邊,真的很慘,她那邊是做外貿的,電腦一中毒,可能很多重要數據被偷,或者丟失,看來我們做軟件的也還不錯。

          posted @ 2006-12-30 09:06 路是爬出來的 閱讀(126) | 評論 (0)編輯 收藏

          續關于 j2me圈子的朋友有沒興趣大家一起做個冒險島的游戲

               這兩天忙著學習關于單元測試,游戲的事情放到放下了。趁著現在有點時間,把我自己一個簡單的框架拿出來參考下。

          這里用的人物圖片資源是整合fins剛上傳的一個游戲,

               在這里我說下簡單的功能,

              1。mali只能向前走,走過了就回不了頭了

               2。為能實現跳躍,跟出現關外

              3。人物只能之下行走,不能根據場景的路線判斷行走,比如前方有個臺階,要跳躍。

              4,等大家提供了。哈哈

          posted @ 2006-12-30 09:06 路是爬出來的 閱讀(103) | 評論 (0)編輯 收藏

          單元測試之測試目的

          在javaeye學習一段時間單元測試后,雖然測試的文章不多,但都是經典帖子。同時也發現這里面討論的關注點大部分是對測試的目。對于該怎么測試,怎么樣才可以讓測試自動話



          ,怎么樣保持測試的實效性等討論的比較少。



          最近被公司逼的急了,它要求在這個月里寫一篇關于單元測試的論文。無奈之下,只好來到這里記錄下自己學習的點點滴滴。以方便自己以后整理成論文。



          做事往往要帶很強的目的性去做才可以成功,單元測試也不例外



          單元測試目的:

          首先保證代碼質量。

          其次保證代碼的可維護。

          再此保證代碼的可擴展。



          目的之一代碼的代碼質量

          我們編寫的代碼雖然可以通過編譯器檢測到語法的正確性質,但并不能保證代碼邏輯也是正確的。我們該怎么保證代碼執行是正確的呢。好下面我們來看下代碼。



          java 代碼


           


          1.    int add(int x, int y){  

          2.     return x+y;  

          3. }  





             上面的功能模塊。下面是段測試代碼

           
          java 代碼


           


          1. void testAdd(){  

          2.     //我們要求程序邏輯是1+4=5;  

          3.     assertEquals(5,add(1,4); 


          4. }



               經過測試以后,如果你修改了int add(int x, int y);里面的邏輯,如果修改的正確,測試代碼始終都是見到綠色的。如果你邏輯錯了。那不好意思,你的測試將會讓你重新寫那段邏輯代碼。直到你正確為止。

               有個比較特殊的情況,如果我測試代碼寫成這樣,那我保證邏輯代碼的正確性,但我卻看不到我期待的綠色,這有是什么原因呢?

          java 代碼


           


          1. 1void testAdd(){    

          2. 2.     //我們要求程序邏輯是1+4=5;    

          3. 3.     assertEquals(6,add(1,4);   

          4. 4. }  



          我個人認為這個問題并是邏輯代碼的問題,而是你測試代碼中的邏輯問題,

          噢,MyGot,作為程序員的我。已經為邏輯代碼傷腦筋了。還要為測試代碼煩惱,做人真命苦啊。  想來也確實是這樣。

          這就引申了另外一個問題,怎么樣才可以保證我邏輯代碼的可測性?



          目的之二代碼的可維護性。

          就拿上面的例子來說吧。只要我們的單元測試是正確的,那我們就可以保證無論你怎么修改那段代碼,只要測試代碼可以產生綠色條,那OK,你修改的邏輯代碼是正確的。當然可維護并非只有這點,還有,比如保證修改了這段代碼不會影響到其他的模塊等。



          目的之三代碼的可擴展。

          對于這點我理解很膚淺。只能表達表面的東西,希望。

          對于可擴展我覺得保遵循一個代碼之間的耦合度降到最低。就OK了。單元測試對這方面有很強的好處,為了程序的可維護性,它可以強迫你寫低耦合度的程序。





          單元測試的優點


          1、它是一種驗證行為。

              程序中的每一項功能都是測試來驗證它的正確性。它為以后的開發提供支緩。就算是開發后期,我們也可以輕松的增加功能或更改程序結構,而不用擔心這個過程中會破壞重要的東西。而且它為代碼的重構提供了保障。這樣,我們就可以更自由的對程序進行改進。


          2、它是一種設計行為。

              編寫單元測試將使我們從調用者觀察、思考。特別是先寫測試(test-first),迫使我們把程序設計成易于調用和可測試的,即迫使我們解除軟件中的耦合。


          3、它是一種編寫文檔的行為。

              單元測試是一種無價的文檔,它是展示函數或類如何使用的最佳文檔。這份文檔是可編譯、可運行的,并且它保持最新,永遠與代碼同步。


          4、它具有回歸性。

              自動化的單元測試避免了代碼出現回歸,編寫完成之后,可以隨時隨地的快速運行測試。


          單元測試的范疇




              如果要給單元測試定義一個明確的范疇,指出哪些功能是屬于單元測試,這似乎很難。但下面討論的四個問題,基本上可以說明單元測試的范疇,單元測試所要做的工作。


          1、 它的行為和我期望的一致嗎?

              這是單元測試最根本的目的,我們就是用單元測試的代碼來證明它所做的就是我們所期望的。


          2、 它的行為一直和我期望的一致嗎?

              編寫單元測試,如果只測試代碼的一條正確路徑,讓它正確走一遍,并不算是真正的完成。軟件開發是一個項復雜的工程,在測試某段代碼的行為是否和你的期望一 致時,你需要確認:在任何情況下,這段代碼是否都和你的期望一致;譬如參數很可疑、硬盤沒有剩余空間、緩沖區溢出、網絡掉線的時候。


          3、 我可以依賴單元測試嗎?

              不能依賴的代碼是沒有多大用處的。既然單元測試是用來保證代碼的正確性,那么單元測試也一定要值得依賴。


          4、 單元測試說明我的意圖了嗎?

              單元測試能夠幫我們充分了解代碼的用法,從效果上而言,單元測試就像是能執行的文檔,說明了在你用各種條件調用代碼時,你所能期望這段代碼完成的功能。

          posted @ 2006-12-30 09:06 路是爬出來的 閱讀(161) | 評論 (0)編輯 收藏

          單元測試之實踐一,關于設計的常見分層

                  我做過的項目不多。也就幾個。做項目的經歷是個學習的過程。

                 第一個項目,純Jsp,沒有任何的java類,當時就覺得好郁悶啊。做久了,根本找不到北。

                 第2個項目:開始會用些javabean來做了。但是還是一個字好亂。

                 第3個項目:開始使用hibernate, 只是對數據庫層做了些簡單的封裝,修改起來比較好了點

                 第4個項目:研究Webwork+spring+hibernate。終于實現了所謂的MVC了。哈哈,該起程序來終于開始有點爽了。

                第5個項目: 開始引入了單元測試,現在還在很懵懂在學習中,為了更好的測試,我們開始努力寫出更高質量的代碼。所以對軟件的分層更細致了些。



                我們可以從測試來分出上的設計的好壞。

                1,純jsp,根本無從單元測試,我想就是那些大牛們也很難寫出這樣的測試代碼吧

                2,對于純粹只有get/set的javabean而言,我想應該是沒有必要做單元測試的。如果有邏輯代碼的話,測試起來也是相當困難的,因為你不知道里面的邏輯代碼跟多少個類大了交道,你會為了測試這段代碼,建立相關的環境,比如啟動EJB,Web容器等。跟難預料的是,跟你耦合的類未必就是正確的,其實你的測試代碼跟你的javabean邏輯是對的,但是因為你引用的類(也就是耦合類)的邏輯是錯誤的,這將導致你的測試是個紅色,“真的很抱歉,其實我也不想這樣的,單元測試說”。 這樣就足以證明是你的設計問題了。并不是單元測試的問題。所以說第個項目測試是很難測是的。只是比不能測試好一點點。

                3,至于第3個跟第2個差不多。

                4,第4個由于對每個層做了細致設計,所以設計測試代碼容易點,而且可以通過easymock等工具進行分層測試,這樣可以做到更細粒度的測試,對測試覆蓋率也是很有幫助的。下面我將主要通過第4個項目的用戶注冊例子來講單元測試的各個方面。



          先看下,源代碼的包結構。





          接下來看下流程圖。

          可以很清楚的知道,沒一層做些什么工作,接下的文章,我將會根據我的設計習慣,一一給出他們相應的測試代碼。希望高手們指教。

          我不會繪制UML圖,所以只好手工來畫,可惜手機像素不高,所以。。。。





          posted @ 2006-12-30 09:06 路是爬出來的 閱讀(156) | 評論 (0)編輯 收藏

          單元測試之實踐二,關于DAO的測試

                 前陣子發表過 我的第一個真正意義上的測試

          里面對于測試Service大家是沒有意義的,對于測試DAO層則表現各有各的看法。

          比如

          robbin     大哥建議:


          測試DAO不如連數據庫一起測試吧。因為DAO測試的目的不是DAO接口實現對不對,而是測試是否如你預期的發送了SQL,如你預期的返回了結果集。這個時候你Mock之后,測試就沒有意義了。



          hyysguyang      大哥建議:篇

          wuhua 寫道

          分層的原因很多。這里我的看法片面就不說了

          但對于mock來說是有莫大好處的。

          比如service測試的時候完全可以做到隔離數據庫,

          我現在的意思是,

          居然Service可以隔離Dao層,也就是說Dao層也是可以做到隔離相關的數據實現的。也是可以mock一個對象。而并非用實際的連接去代 替。如果我們的邏輯沒出錯的話,測試就算通過了,至于數據層的檢測,那就不關我們的事情了,比如Hibernate由Hibernate去test, Spring由Spring去Test,Oracle由它自己去做。干自己的事情,別趟其他渾水。這樣不是瀟灑很多嗎



          但是數據庫的測試畢竟比較特殊,記住測試的目的是確保你的代碼質量,如果你確定你的這樣測就沒問題了,那無話可說,否則就盡量多的測試。

          事實上,最原始的單元測試(plain testcase)就是用來測方法,測業務邏輯的,如果有邏輯就測,沒邏輯就不用測了,同樣的道理,相信你不會去測一個bean的get/set方法吧。

          記住你測試的目的和動機,如果你認為測試dao層是為了測你的邏輯(你確定你的dao的實現代碼是否真的存在邏輯),那你就mock吧,但是,我 們更相信,我們測DAO層,更應該是測訪問數據庫的情況,你如連接,sql是否正確,sequence是否正確等,而這些你必須要真正的連接數據庫,也因 此,我們一般都是直接訪問數據庫來測試的,當然,如果可能你可以采用內存庫。

          事實上,我們對dao的測試,一般都進行所謂的的集成單元測試。我認為,你應該確定好你的測試策略,然后在去采用相應的測試方法。我在目前的開發中就是采用這樣的方式測的。


          上面兩個大哥都建議測試DAO的時候還是連接數據庫為好。

          但個人認為上面兩個大哥的單元測試以非純正的單元測試了,而是集成單元測試。

          其實說白了,測試這東西只是為了項目更好,更快的完成。至于是否要求純單元,或者是集成單元測試,則看各位的需要,如果覺得集成單元測試對項目有幫助,那就用吧,現在發現對這個已經沒有明顯的界限了。





          不理會它了,現在回歸到我們用戶注冊的例子。

          java 代碼


           


          1. 1public interface IAccountDao extends IBaseDao {    

          2. 2.     public Account findAccountById(String id);    

          3. 3.     public Account findAccounByName(String name);    

          4. 4. }   





          實際實現代碼

          java 代碼


           


          1. package org.wuhua.dao.impl;  

          2.   

          3. import java.util.List;  

          4.   

          5. import org.wuhua.dao.IAccountDao;  

          6. import org.wuhua.model.Account;  

          7.   

          8. public class AccountDao extends BaseDao implements IAccountDao {  

          9.   public Account findAccountById(String id) {  

          10.         return (Account) this.getHibernateTemplate().get(Account.class, id) ;  

          11.     }  

          12.   

          13.     public Account findAccounByName(String name) {  

          14.         List l = this.getHibernateTemplate().find("from Account as a where a.name=?", name);  

          15.         if(l != null && l.size() >=1)  

          16.             return (Account) l.get(0);  

          17.         else   

          18.             return null;  

          19.     }  

          20. }  





          java 代碼


           


          1. package org.wuhua.dao;  

          2.   

          3. import java.util.ArrayList;  

          4. import java.util.List;  

          5.   

          6. import junit.framework.Assert;  

          7. import junit.framework.TestCase;  

          8.   

          9. import org.easymock.MockControl;  

          10. import org.easymock.classextension.MockClassControl;  

          11. import org.springframework.orm.hibernate3.HibernateTemplate;  

          12. import org.wuhua.dao.impl.AccountDao;  

          13. import org.wuhua.model.Account;  

          14.   

          15.    

          16.   

          17. public class AccountDaoTest extends TestCase {  

          18.       

          19.     private AccountDao accountDao;  

          20.     private org.springframework.orm.hibernate3.HibernateTemplate ht;  

          21.     private MockControl control;  

          22.   

          23.     protected void setUp() throws Exception {  

          24.         control = MockClassControl.createControl(HibernateTemplate.class);  

          25.         ht = (HibernateTemplate) control.getMock();  

          26.         accountDao = new AccountDao();  

          27.         accountDao.setHibernateTemplate(ht);  

          28.     }  

          29.   

          30.     protected void tearDown() throws Exception {  

          31.            

          32.     }  

          33.       

          34.     public void testFindAccountById(){  

          35.         Account a = new Account("wuhua");  

          36.         a.setId("10");     

          37.           

          38.         ht.get(Account.class, a.getId());  

          39.           

          40.         control.setReturnValue(a);  

          41.           

          42.         control.replay();  

          43.           

          44.         Account result =   accountDao.findAccountById(a.getId());  

          45.           

          46.         assertNotNull(result);  

          47.   

          48.         Assert.assertEquals(a.getId(),result.getId());  

          49.         Assert.assertEquals(a, result);  

          50.           

          51.         control.verify();  

          52.           

          53.     }  

          54.       

          55.     public void testFindAccountByName(){  

          56.         Account a = new Account("wuhua");      

          57.            

          58.         ht.find("from Account as a where a.name=?", a.getName());  

          59.         List l = new ArrayList();  

          60.         l.add(a);  

          61.         control.setReturnValue(l);  

          62.           

          63.         control.replay();  

          64.           

          65.         Account result =  accountDao.findAccounByName(a.getName());  

          66.   

          67.         Assert.assertEquals(a.getId(),result.getId());  

          68.         Assert.assertEquals(a, result);  

          69.           

          70.         control.verify();  

          71.           

          72.     }  

          73. }  


          posted @ 2006-12-30 09:06 路是爬出來的 閱讀(132) | 評論 (0)編輯 收藏

          單元測試之實踐三 Service的測試

          測試Service,因為Service依賴的Dao, 所以只需Mock一個Dao即可。在這里我詳細的介紹關于注冊這個功能的測試

          java 代碼


           


          1. public interface IAccountService extends IBaseService {  

          2.       Account findAccountById(String id);  

          3.       Account findAccounByName(String name);  

          4.       void regist(Account account) throws ObjectExistsException;  

          5. }  



             注冊功能的實現。
          java 代碼


           


          1. public void regist(Account account) throws ObjectExistsException {  

          2.     if(accountDao.findAccounByName(account.getName()) != null)  

          3.         throw new ObjectExistsException("User's name is exists!");  

          4.       

          5.     accountDao.save(account);  

          6. }  





          測試代碼
          java 代碼


           


          1.     protected void setUp() throws Exception {  

          2.         control = MockControl.createControl(IAccountDao.class);  

          3.         accountDao = (IAccountDao) control.getMock();  

          4.         as = new AccountService();  

          5.         as.setAccountDao(accountDao);  

          6.     }  

          7.   

          8.   

          9. public void testFindAccountByName() {  

          10.         String name = "wuhua";  

          11.         accountDao.findAccounByName(name);  

          12.         Account a = new Account("wuhua");  

          13.         a.setId(name);  

          14.         control.setReturnValue(a);  

          15.         control.replay();  

          16.         Account at = as.findAccounByName(name);  

          17.         Assert.assertEquals(name, at.getId());  

          18.         Assert.assertEquals(a, at);  

          19.         control.verify();  

          20.     }  





          首先我們建立一個關鍵字查詢,name="wuhua";

          然后調用Dao的方法,

          然后自定義返回一個自己預期的對象,

          最后通過比較這個對象判斷結果是否是自己想要的

          posted @ 2006-12-30 09:06 路是爬出來的 閱讀(355) | 評論 (0)編輯 收藏

          單元測試之實踐四 Action的測試

                 Action的測試是比較辛苦的。因為它依賴與其他的環境(比如tomcat)。

                 在我的印象中,基于struts的測試是很麻煩的,因為對于execute方法,你必須mock兩個對象進去。

                還好。基于Webwork的測試相對簡單些。

                下面讓我們來測試一個例子吧

                

          java 代碼


           


          1.       Account account;  

          2. IAccountService accountService;  

          3. public void setAccount(Account account) {  

          4.     this.account = account;  

          5. }  

          6.   

          7. public void setAccountService(IAccountService accountService) {  

          8.     this.accountService = accountService;  

          9. }  

          10.   

          11. public String regist() throws Exception {  

          12.     if(account == null) {  

          13.         account = new Account();  

          14.         return INPUT;  

          15.     }  

          16.       

          17.     if(!validForm(account))   

          18.         return INPUT;  

          19.       

          20.     try {  

          21.         accountService.regist(account);  

          22.     } catch (ObjectExistsException e) {  

          23.         e.printStackTrace();  

          24.         return INPUT;  

          25.     }  

          26.       

          27.     return SUCCESS;  

          28. }  

          29.   

          30. private boolean validForm(Account e) {  

          31.     if(e.getName() == null || e.getName().trim().equals(""))  

          32.         return false;  

          33.     if(e.getPassword() == null || e.getPassword().trim().equals(""))  

          34.         return false;  

          35.     return true;  

          36. }  





          有經驗的程序員見到上面的代碼應該就知道怎么測試了。

          我們只需setAccount,跟setAccountService即可,

          而Account本身來講就是是個po,所以可以自己new一個

          AccountService則可以mock一個。真是太完美了,我太喜好mock,它總是給我驚喜

          java 代碼


           


          1. package org.wuhua.action;  

          2.   

          3. import junit.framework.TestCase;  

          4.   

          5. import org.easymock.MockControl;  

          6. import org.wuhua.exception.ObjectExistsException;  

          7. import org.wuhua.model.Account;  

          8. import org.wuhua.service.IAccountService;  

          9.   

          10. import sms.king.AccountManager;  

          11.   

          12. import com.opensymphony.xwork.Action;  

          13.   

          14. public class AccountActionTest extends TestCase {  

          15.     private MockControl control;  

          16.     IAccountService accountService;  

          17.     protected void setUp() throws Exception {  

          18.         control = MockControl.createControl(IAccountService.class);  

          19.         accountService = (IAccountService) control.getMock();  

          20.            

          21.     }  

          22.       

          23.     public void testRegistOk() throws Exception {  

          24.         Account employee = new Account("name");  

          25.         employee.setPassword("password");  

          26.           

          27.        

          28.            

          29.           

          30.         accountService.regist(employee);  

          31.         control.setVoidCallable(1);  

          32.           

          33.         control.replay();  

          34.           

          35.         AccountAction action = new AccountAction();  

          36.         action.setAccount(employee);  

          37.         action.setAccountService(accountService);  

          38.           

          39.         assertEquals(Action.SUCCESS, action.regist());  

          40.           

          41.         control.verify();  

          42.     }  

          43.       

          44.     public void testRegistNameExists() throws Exception {  

          45.         Account employee = new Account("name");  

          46.         employee.setPassword("password");  

          47.           

          48.    

          49.        

          50.           

          51.         accountService.regist(employee);  

          52.         control.setThrowable(new ObjectExistsException(""));  

          53.           

          54.         control.replay();  

          55.           

          56.         AccountAction action = new AccountAction();  

          57.         action.setAccount(employee);  

          58.         action.setAccountService(accountService);  

          59.           

          60.         assertEquals(Action.INPUT, action.regist());  

          61.           

          62.         control.verify();  

          63.     }  

          64. }  



           

          ok,一個測試的例子就好了。

          posted @ 2006-12-30 09:06 路是爬出來的 閱讀(155) | 評論 (0)編輯 收藏

          這年頭誰不浮躁

                都說程序員很浮躁,動不動就那跳槽威脅公司,以提高自己的價值。

                但是真的就是這樣嗎? 你看海爾,你看聯想,TCL那個不浮躁,動不動就說什么國際話走出中國市場。它們就是不甘于現狀,敢于浮躁。這不就是為了提高自己的競爭力嗎?  

                浮躁本沒罪,被人罵多了就有罪了。浮躁是人不安現在的本能反映,它足以摧毀一切,想想要是鄧爺爺也安于現狀,當時人家的年齡可是7老8十的,人家干嗎這么拼命啊。還不是浮躁,覺得應該給全國人們一個好的生活。

                我們浮躁也還不是為了更好的生活。浮躁讓人覺得有生機勃勃。

                浮躁本沒罪,有罪的是浮躁這個詞語。

          posted @ 2006-12-30 09:06 路是爬出來的 閱讀(95) | 評論 (0)編輯 收藏

          單元測試總篇與TTD實踐

                  經過前幾篇的測試學習跟實踐,我覺得有必要對這次學習做個總結。其實上面的話只是幌子,主要原因還是javaeye的

          lighter 寫道

          貌似這一篇文章要放在"agile"版塊更好一些吧.

          btw:wuhua同學寫文章有時候可以把兩篇結合成一篇,可能會更好一些,不然讓別人看一篇文章要看一,二,三,四才能看完.個人建議而已,別見怪.



          覺得他說的很對,當時是出于篇幅過程,怕javaeye blog不支持大篇幅的文章,所以拆開。不過我覺得我這個擔心是多余的。這里說句題外話,我用過很多Blog,但覺得這里是最好的。速度快,寫文章貼心(主要是對源代碼格式化方面做的很出色)。



          好了,進入正題。

          先介紹下我以前寫的那些文章先,讓大家對這篇文章有個初步的認識。

          單元測試之測試目的,

          單元測試之實踐一,關于設計的常見分層

          單元測試之實踐二,關于DAO的測試

          單元測試之實踐三 Service的測試









          單元測試之實踐四 Action的測試



          以前我正常的設計流程是Database->Model -> Dao-> Service -> Action ->View。這樣的設計伴隨我1年多了,這樣的設計方式好嗎?這樣的設計高效嗎? 代碼質量能保證嗎? 我可以很肯定的回答,不能,如果數據庫一該,我要在表格里面添加一個字段,或者什么的。那么它將會牽連到很多其他,修改的動作如下:Database->Model -> Dao-> Service -> Action ->View。 噢,my got,幾乎跟設計的一樣多,甚至更多,因為在修改的過程中你就算有再好IDE去重構它也不能保證它的正確性。然后你就要去測試,測試它的正確性。也許測試的過程將是修改過程的幾倍時間。所以我個人覺得這樣的設計方式是不高效的。總而言之就是這樣的設計遲早會出問題的?



          為什么會這樣呢?難道就沒有一種解決辦法嗎? 經過這段日子學習我發現,以前的設計不能很好的保證質量是因為你沒有足夠的單元測試去支撐著它,所以你改了代碼后缺乏一個很好的手段去保持這段代碼的質量,換句話的意思就是,沒有一個靜態的人去監督你的工作(我把單元測試比喻為靜態的人,它只做一件事,就是督促你的代碼不出問題)。



          好了。我們已經找到了適合保證我們代碼質量的方法了。但是我們還得提高我們的開發效率啊。這又怎么辦呢?是不是還按照以前的方式嗎?我想自己渾渾噩噩的活了20多年了。我想換種活法了,想找種更刺激,更有意義的生活方式。

          設計有時候更生活是一樣的,應該經常探索,經常實踐才能感受的更多。

          那好吧我們就來個徹底的變革吧。怎么變呢? 很明顯:那就是TDD。

          該怎么做呢?

          以前的方式:Database->Model -> Dao-> Service -> Action ->View。

          TDD的方式:Test->其他。

          先看看下面Dao的例子吧:以前的方式:IBaseDao ->  BaseDao -> BaseDaoTest。

          TDD:BaseDaoTest->IBaseDao->BaseDao.


           


          1. public void testFindAccountByName(){  

          2.     Account a = new Account("wuhua");      

          3.     ht.find("from Account as a where a.name=?", a.getName());  

          4.     List l = new ArrayList();  

          5.     l.add(a);  

          6.     control.setReturnValue(l);  

          7.     control.replay();  

          8.     Account result =  accountDao.findAccounByName(a.getName());  

          9.     Assert.assertEquals(a.getId(),result.getId());  

          10.     Assert.assertEquals(a, result);  

          11.     control.verify();  

          12.       

          13. }  



          好,非常好,怎么這段代碼不能運行呢?當然不行了,因為上面的很多類都沒有。那我們這段代碼的用途是什么呢?

          用途就是:以為上面的從上面的代碼我很清楚自己以后要做什么。1,要建立一個Model,里面起碼有一個name屬性,然后你會發現我們要測試的功能段是accountDao.findAccounByName(a.getName()); 里面我們要求測試的SQL是from Account as a where a.name=?,意圖明確吧。好,



          我們寫下實際代碼吧。

          java 代碼



          1. public Account findAccounByName(String name) {  

          2.         List l = this.getHibernateTemplate().find("from Account as ", name);  

          3.         if(l != null && l.size() >=1)  

          4.             return (Account) l.get(0);  

          5.         else   

          6.             return null;  

          7.     }  



          好,代碼寫好了。去運行我們的測試吧。結果是令人失望的。怎么會是紅色的呢。肯定是邏輯代碼出問題了(如果測試代碼沒問題的話)。經過檢查發現原來
          from Account as a where a.name=?跟from Account as 完全兩碼事。好改回去



          java 代碼


           


          1. public Account findAccounByName(String name) {  

          2.         List l = this.getHibernateTemplate().

          3.                              find("from Account as a where a.name=?", name);  

          4.         if(l != null && l.size() >=2)  

          5.             return (Account) l.get(0);  

          6.         else   

          7.             return null;  

          8.     } 



          怎么還是紅色啊。我不干了(程序員暴躁的情緒出來了,我就經常這樣)主管跟我說:“再查查吧。別灰心。”

          后來查了半天發現原來

          java 代碼


           


          1. List l = new ArrayList();    

          2.  l.add(a);   



          我只renturn一個預期的對象a
          java 代碼


           


          1. if(l != null && l.size() >=2)  

          2.             return (Account) l.get(0);  

          3.         else   

          4.             return null;  



          而代碼卻要求我要傳入預期兩個對象才給我通過,所以代碼只return null。



          最后改了這段代碼

          java 代碼


           


          1. public Account findAccounByName(String name) {  

          2.         List l = this.getHibernateTemplate().find("from Account


          3.                                         as a where a.name=?", name);  

          4.         if(l != null && l.size() >=1)  

          5.             return (Account) l.get(0);  

          6.         else   

          7.             return null;  

          8.     }  





          終于通過了。綠色,綠色,我看到了。我對主管說。主管笑了。我也笑了



          最后我郁悶下,寫這篇文章足足話了我22個小時,

          第一次寫好了。殺毒突然重啟。所以全沒了。

          第二次,提交不了。然后忘記備份,又全沒了

          第三次成功了。過程跟TDD差不多。







          posted @ 2006-12-30 09:06 路是爬出來的 閱讀(261) | 評論 (0)編輯 收藏

          90個外國英文網站強力推薦 (轉)

          文章轉自http://www.j2medev.com/blog/user2/titoudao/archives/2006/2401.html

          主要收藏用。

          一、大陸可訪問的優秀英文信息源

          1、英國《經濟學家》
          http://www.economist.com

          2、美聯社
          http://wire.ap.org/GoToAP.cgi

          3、英國BBC
          http://news.bbc.co.uk

          4、《紐約時報》
          http://www.nytimes.com

          5、普利策新聞獎1995年到2001年全部獲獎作品
          http://www.pulitzer.org

          6、美國全國廣播公司
          http://www.msnbc.com/news

          7、《華爾街日報》評論
          http://www.opinionjournal.com

          8、香港《南華早報》
          http://china.scmp.com/index.html



          二、新聞收藏夾

          1、CNN可以直接訪問的地址
          http://asia.cnn.com(亞洲版)

          2、CNN可以通過代理服務器訪問的地址
          http://207.25.71.5(國際版)

          3、BBC可以通過代理服務器訪問的地址
          http://212.58.240.36

          4、《華盛頓郵報》社論版 可以通過代理服務器訪問的地址:
          http://64.215.175.141/wp-dyn/opinion



          三、英美外電新聞

          1、《泰晤士報》
          http://www.thetimes.co.uk

          2、《基督教科學箴言報》
          http://www.csmonitor.com

          3、《今日美國》
          http://usatoday.com

          4、美國廣播公司
          http://abcnews.go.com

          5、英國《觀察家》
          http://www.observer.co.uk

          6、英國《每日電訊》
          http://www.dailytelegraph.co.uk



          四、英美周刊雜志

          1、《每周標準》
          http://www.weeklystandard.com

          2、《外交事務雜志》
          http://www.foreignaffairs.orghttp:/...eignaffairs.org

          3、《沙龍》
          http://www.salon.com

          4、《美國觀察者》
          http://www.gilder.com/amspec/index.html

          http://www.gilder.com/amspec/index.html

          http://www.gilder.com/amspec/index.html

          5、《新共和》
          http://www.tnr.com/

          6、《國家評論》
          http://www.nationalreview.com

          7、《國家雜志》
          http://nationaljournal.com/about/njweekly/stories/

          8、《紐約客》
          http://www.newyorker.com/

          9、《紐約書評》
          http://www.nybooks.com/

          10、《外交政策》
          http://www.foreignpolicy.com/

          11、《大西洋月刊》The Atlantic Onlinehttp://www.theatlantic.com//

          12、《外交政策聚焦》
          http://www.foreignpolicy-infocus.org/

          13、《民族》The Nationhttp://www.thenation.com/

          14、《進步》Homepage of The Progressive magazine
          http://www.progressive.org/

          15、《洋蔥》
          http://www.theonion.com/(有趣新聞站點)



          五、時事資料

          1、安全政策研究中心
          http://www.centerforsecuritypolicy.org/

          2、美國國務院各國背
          http://www.state.gov/r/pa/bgn/

          3、世界各國地圖
          http://www.lib.utexas.edu/maps/index.html

          4、衛星照片
          http://www.spaceimaging.com/

          5、網上各國政府資料
          http://www.gksoft.com/govt/en/

          6、中國外交部各國背景
          http://www.fmprc.gov.cn/chn/c242.html



          六、英美常用經濟網站

          1、《金融時報》
          http://news.ft.com/home/rw

          2、《商業周刊》
          http://news.ft.com/home/rw

          3、《財富》
          http://www.fortune.com/fortune

          4、《遠東經濟評論》
          http://www.feer.com

          5、《福布斯》
          http://www.forbes.com

          6、哥倫比亞廣播公司《市場觀察》
          http://cbs.marketwatch.com/news/default.asp?siteid=mktw

          7、《街》
          http://www.thestreet.com/



          七、非英美周刊雜志和資料站點

          1、德國《鏡報》
          http://www.spiegel.de/spiegel(點擊English Texts)

          2、教廷《羅馬觀察家》
          http://www.vatican.va/news_services..._eng/index.html

          3、捷克《布拉格郵報》
          http://www.praguepost.cz/

          4、《俄羅斯周刊》
          http://www.russiajournal.com/

          5、英國《簡氏防務周刊》
          http://www.janes.com/(出色的軍事雜志)

          6、埃及《中東時報》
          http://www.metimes.com/

          7、《巴勒斯坦時報月刊》
          http://www.ptimes.com/

          8、巴勒斯坦《耶路撒冷時報》
          http://www.jerusalem-times.net/

          9、埃及《Al-Ahram周刊》
          http://www.ahram.org.eg/weekly/

          10、阿富汗研究
          http://www.institute-for-afghan-studies.org/

          11、中東新
          http://www.middleeastwire.com/

          12、以色列DEBKA檔案
          http://www.debka.com/(一個情報站點)

          13、保加利亞《首都周刊》
          http://www-us.capital.bg/old/weekly/index.html

          14、皇帝的新裝
          http://www.emperors-clothes.com;

          15、全球主義者
          http://www.theglobalist.com/

          16、臺灣《東森新聞報》
          http://www.ettoday.com/

          by
          http://www.hjenglish.com



          八、非英美外電新聞

          1、《東盟新聞》
          http://www.aseanreview.com

          2、菲律賓《星報》
          http://www.philstar.com/htmtest/index.htm

          3、菲律賓《每日調查》
          http://www.inq7.net/

          4、印尼《雅加達郵報》
          http://www.thejakartapost.com/headlines.asp

          5、新加坡《海峽時報》
          http://straitstimes.asia1.com.sg/home

          6、巴基斯坦《黎明報》
          http://www.dawn.com

          7、《印度時報》
          http://www.timesofindia.com

          9、尼泊爾新聞
          http://www.nepalnews.com.np

          10、德國《法蘭克福匯報
          http://www.faz.com/IN/INtemplates/eFAZ/default.asp

          11、俄羅斯《莫斯科時報》
          http://www.moscowtimes.ru

          12、保加利亞《新聞報》
          http://news.bg/en/

          13、保加利亞《索菲亞回聲報》
          http://www.sofiaecho.com/

          14、《愛爾蘭時報》
          http://www.ireland.com/

          15、以色列《哈阿雷茲》
          http://www.haaretzdaily.com/

          16、伊拉克新聞
          http://www.uruklink.net/iraqnews/eindex.htm

          17、《約旦時報》
          http://www.jordantimes.com

          18、阿聯酋《Khaleej時報》
          http://www.khaleejtimes.com/

          19、古巴《格拉瑪》
          http://www.granma.cu/ingles/index.html

          20、阿根廷《布宜諾斯艾利斯先驅報》
          http://www.buenosairesherald.com

          21、泛非洲在線
          http://allafrica.com/

          22、聯合國新聞中心
          http://www.un.org/News

          23、可以在線閱讀英文小說
          http://hnbc.hpe.sh.cn/01/01A/04/UVWX.HTM

          24、《時代周刊》
          www.time.com

          25、《國家地理》
          http://www.nationalgeographic.com

          26、《新聞周刊》
          http://www.msnbc.com/news/NW-front_Front.asp

          posted @ 2006-12-30 09:06 路是爬出來的 閱讀(143) | 評論 (0)編輯 收藏

          僅列出標題
          共5頁: 上一頁 1 2 3 4 5 下一頁 
          主站蜘蛛池模板: 沅江市| 南雄市| 康马县| 和政县| 大城县| 霍州市| 大方县| 文山县| 滦南县| 庆云县| 盈江县| 泾川县| 绥芬河市| 神农架林区| 全椒县| 浮梁县| 淳安县| 扶余县| 晋中市| 伊宁市| 江津市| 上饶市| 大城县| 昌吉市| 高唐县| 奎屯市| 黄石市| 肃北| 惠州市| 耿马| 舒兰市| 四会市| 卓尼县| 庄河市| 万年县| 郁南县| 墨脱县| 任丘市| 尚志市| 双鸭山市| 亳州市|