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

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

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

    路是爬出來的

    #

    今天又去見客戶了

            今天跟市場的人去跑。見一個(gè)客戶,都怪我連對(duì)方是什么樣的情況都不了解,去的很匆忙。只知道是做外貿(mào)的,想做個(gè)網(wǎng)站。

    去到一看,傻眼了。洋人。哈,幸好跟我同去的老板會(huì)英文。不知道他們?cè)谶蠊臼裁矗髞矶际抢习甯曳g,然后我提出一些要求,最后談到價(jià)錢。整個(gè)過程就是這么簡單。

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

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

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

    續(xù)關(guān)于 j2me圈子的朋友有沒興趣大家一起做個(gè)冒險(xiǎn)島的游戲

         這兩天忙著學(xué)習(xí)關(guān)于單元測(cè)試,游戲的事情放到放下了。趁著現(xiàn)在有點(diǎn)時(shí)間,把我自己一個(gè)簡單的框架拿出來參考下。

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

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

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

         2。為能實(shí)現(xiàn)跳躍,跟出現(xiàn)關(guān)外

        3。人物只能之下行走,不能根據(jù)場景的路線判斷行走,比如前方有個(gè)臺(tái)階,要跳躍。

        4,等大家提供了。哈哈

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

    單元測(cè)試之測(cè)試目的

    在javaeye學(xué)習(xí)一段時(shí)間單元測(cè)試后,雖然測(cè)試的文章不多,但都是經(jīng)典帖子。同時(shí)也發(fā)現(xiàn)這里面討論的關(guān)注點(diǎn)大部分是對(duì)測(cè)試的目。對(duì)于該怎么測(cè)試,怎么樣才可以讓測(cè)試自動(dòng)話



    ,怎么樣保持測(cè)試的實(shí)效性等討論的比較少。



    最近被公司逼的急了,它要求在這個(gè)月里寫一篇關(guān)于單元測(cè)試的論文。無奈之下,只好來到這里記錄下自己學(xué)習(xí)的點(diǎn)點(diǎn)滴滴。以方便自己以后整理成論文。



    做事往往要帶很強(qiáng)的目的性去做才可以成功,單元測(cè)試也不例外



    單元測(cè)試目的:

    首先保證代碼質(zhì)量。

    其次保證代碼的可維護(hù)。

    再此保證代碼的可擴(kuò)展。



    目的之一代碼的代碼質(zhì)量

    我們編寫的代碼雖然可以通過編譯器檢測(cè)到語法的正確性質(zhì),但并不能保證代碼邏輯也是正確的。我們?cè)撛趺幢WC代碼執(zhí)行是正確的呢。好下面我們來看下代碼。



    java 代碼


     


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

    2.     return x+y;  

    3. }  





       上面的功能模塊。下面是段測(cè)試代碼

     
    java 代碼


     


    1. void testAdd(){  

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

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


    4. }



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

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

    java 代碼


     


    1. 1void testAdd(){    

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

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

    4. 4. }  



    我個(gè)人認(rèn)為這個(gè)問題并是邏輯代碼的問題,而是你測(cè)試代碼中的邏輯問題,

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

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



    目的之二代碼的可維護(hù)性。

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



    目的之三代碼的可擴(kuò)展。

    對(duì)于這點(diǎn)我理解很膚淺。只能表達(dá)表面的東西,希望。

    對(duì)于可擴(kuò)展我覺得保遵循一個(gè)代碼之間的耦合度降到最低。就OK了。單元測(cè)試對(duì)這方面有很強(qiáng)的好處,為了程序的可維護(hù)性,它可以強(qiáng)迫你寫低耦合度的程序。





    單元測(cè)試的優(yōu)點(diǎn)


    1、它是一種驗(yàn)證行為。

        程序中的每一項(xiàng)功能都是測(cè)試來驗(yàn)證它的正確性。它為以后的開發(fā)提供支緩。就算是開發(fā)后期,我們也可以輕松的增加功能或更改程序結(jié)構(gòu),而不用擔(dān)心這個(gè)過程中會(huì)破壞重要的東西。而且它為代碼的重構(gòu)提供了保障。這樣,我們就可以更自由的對(duì)程序進(jìn)行改進(jìn)。


    2、它是一種設(shè)計(jì)行為。

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


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

        單元測(cè)試是一種無價(jià)的文檔,它是展示函數(shù)或類如何使用的最佳文檔。這份文檔是可編譯、可運(yùn)行的,并且它保持最新,永遠(yuǎn)與代碼同步。


    4、它具有回歸性。

        自動(dòng)化的單元測(cè)試避免了代碼出現(xiàn)回歸,編寫完成之后,可以隨時(shí)隨地的快速運(yùn)行測(cè)試。


    單元測(cè)試的范疇




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


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

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


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

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


    3、 我可以依賴單元測(cè)試嗎?

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


    4、 單元測(cè)試說明我的意圖了嗎?

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

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

    單元測(cè)試之實(shí)踐一,關(guān)于設(shè)計(jì)的常見分層

            我做過的項(xiàng)目不多。也就幾個(gè)。做項(xiàng)目的經(jīng)歷是個(gè)學(xué)習(xí)的過程。

           第一個(gè)項(xiàng)目,純Jsp,沒有任何的java類,當(dāng)時(shí)就覺得好郁悶啊。做久了,根本找不到北。

           第2個(gè)項(xiàng)目:開始會(huì)用些javabean來做了。但是還是一個(gè)字好亂。

           第3個(gè)項(xiàng)目:開始使用hibernate, 只是對(duì)數(shù)據(jù)庫層做了些簡單的封裝,修改起來比較好了點(diǎn)

           第4個(gè)項(xiàng)目:研究Webwork+spring+hibernate。終于實(shí)現(xiàn)了所謂的MVC了。哈哈,該起程序來終于開始有點(diǎn)爽了。

          第5個(gè)項(xiàng)目: 開始引入了單元測(cè)試,現(xiàn)在還在很懵懂在學(xué)習(xí)中,為了更好的測(cè)試,我們開始努力寫出更高質(zhì)量的代碼。所以對(duì)軟件的分層更細(xì)致了些。



          我們可以從測(cè)試來分出上的設(shè)計(jì)的好壞。

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

          2,對(duì)于純粹只有g(shù)et/set的javabean而言,我想應(yīng)該是沒有必要做單元測(cè)試的。如果有邏輯代碼的話,測(cè)試起來也是相當(dāng)困難的,因?yàn)槟悴恢览锩娴倪壿嫶a跟多少個(gè)類大了交道,你會(huì)為了測(cè)試這段代碼,建立相關(guān)的環(huán)境,比如啟動(dòng)EJB,Web容器等。跟難預(yù)料的是,跟你耦合的類未必就是正確的,其實(shí)你的測(cè)試代碼跟你的javabean邏輯是對(duì)的,但是因?yàn)槟阋玫念悾ㄒ簿褪邱詈项悾┑倪壿嬍清e(cuò)誤的,這將導(dǎo)致你的測(cè)試是個(gè)紅色,“真的很抱歉,其實(shí)我也不想這樣的,單元測(cè)試說”。 這樣就足以證明是你的設(shè)計(jì)問題了。并不是單元測(cè)試的問題。所以說第個(gè)項(xiàng)目測(cè)試是很難測(cè)是的。只是比不能測(cè)試好一點(diǎn)點(diǎn)。

          3,至于第3個(gè)跟第2個(gè)差不多。

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



    先看下,源代碼的包結(jié)構(gòu)。





    接下來看下流程圖。

    可以很清楚的知道,沒一層做些什么工作,接下的文章,我將會(huì)根據(jù)我的設(shè)計(jì)習(xí)慣,一一給出他們相應(yīng)的測(cè)試代碼。希望高手們指教。

    我不會(huì)繪制UML圖,所以只好手工來畫,可惜手機(jī)像素不高,所以。。。。





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

    單元測(cè)試之實(shí)踐二,關(guān)于DAO的測(cè)試

           前陣子發(fā)表過 我的第一個(gè)真正意義上的測(cè)試

    里面對(duì)于測(cè)試Service大家是沒有意義的,對(duì)于測(cè)試DAO層則表現(xiàn)各有各的看法。

    比如

    robbin     大哥建議:


    測(cè)試DAO不如連數(shù)據(jù)庫一起測(cè)試吧。因?yàn)镈AO測(cè)試的目的不是DAO接口實(shí)現(xiàn)對(duì)不對(duì),而是測(cè)試是否如你預(yù)期的發(fā)送了SQL,如你預(yù)期的返回了結(jié)果集。這個(gè)時(shí)候你Mock之后,測(cè)試就沒有意義了。



    hyysguyang      大哥建議:篇

    wuhua 寫道

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

    但對(duì)于mock來說是有莫大好處的。

    比如service測(cè)試的時(shí)候完全可以做到隔離數(shù)據(jù)庫,

    我現(xiàn)在的意思是,

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



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

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

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

    事實(shí)上,我們對(duì)dao的測(cè)試,一般都進(jìn)行所謂的的集成單元測(cè)試。我認(rèn)為,你應(yīng)該確定好你的測(cè)試策略,然后在去采用相應(yīng)的測(cè)試方法。我在目前的開發(fā)中就是采用這樣的方式測(cè)的。


    上面兩個(gè)大哥都建議測(cè)試DAO的時(shí)候還是連接數(shù)據(jù)庫為好。

    但個(gè)人認(rèn)為上面兩個(gè)大哥的單元測(cè)試以非純正的單元測(cè)試了,而是集成單元測(cè)試。

    其實(shí)說白了,測(cè)試這東西只是為了項(xiàng)目更好,更快的完成。至于是否要求純單元,或者是集成單元測(cè)試,則看各位的需要,如果覺得集成單元測(cè)試對(duì)項(xiàng)目有幫助,那就用吧,現(xiàn)在發(fā)現(xiàn)對(duì)這個(gè)已經(jīng)沒有明顯的界限了。





    不理會(huì)它了,現(xiàn)在回歸到我們用戶注冊(cè)的例子。

    java 代碼


     


    1. 1public interface IAccountDao extends IBaseDao {    

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

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

    4. 4. }   





    實(shí)際實(shí)現(xiàn)代碼

    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 路是爬出來的 閱讀(130) | 評(píng)論 (0)編輯 收藏

    單元測(cè)試之實(shí)踐三 Service的測(cè)試

    測(cè)試Service,因?yàn)镾ervice依賴的Dao, 所以只需Mock一個(gè)Dao即可。在這里我詳細(xì)的介紹關(guān)于注冊(cè)這個(gè)功能的測(cè)試

    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. }  



       注冊(cè)功能的實(shí)現(xiàn)。
    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. }  





    測(cè)試代碼
    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.     }  





    首先我們建立一個(gè)關(guān)鍵字查詢,name="wuhua";

    然后調(diào)用Dao的方法,

    然后自定義返回一個(gè)自己預(yù)期的對(duì)象,

    最后通過比較這個(gè)對(duì)象判斷結(jié)果是否是自己想要的

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

    單元測(cè)試之實(shí)踐四 Action的測(cè)試

           Action的測(cè)試是比較辛苦的。因?yàn)樗蕾嚺c其他的環(huán)境(比如tomcat)。

           在我的印象中,基于struts的測(cè)試是很麻煩的,因?yàn)閷?duì)于execute方法,你必須mock兩個(gè)對(duì)象進(jìn)去。

          還好?;赪ebwork的測(cè)試相對(duì)簡單些。

          下面讓我們來測(cè)試一個(gè)例子吧

          

    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. }  





    有經(jīng)驗(yàn)的程序員見到上面的代碼應(yīng)該就知道怎么測(cè)試了。

    我們只需setAccount,跟setAccountService即可,

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

    AccountService則可以mock一個(gè)。真是太完美了,我太喜好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,一個(gè)測(cè)試的例子就好了。

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

    這年頭誰不浮躁

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

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

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

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

          浮躁本沒罪,有罪的是浮躁這個(gè)詞語。

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

    單元測(cè)試總篇與TTD實(shí)踐

            經(jīng)過前幾篇的測(cè)試學(xué)習(xí)跟實(shí)踐,我覺得有必要對(duì)這次學(xué)習(xí)做個(gè)總結(jié)。其實(shí)上面的話只是幌子,主要原因還是javaeye的

    lighter 寫道

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

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



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



    好了,進(jìn)入正題。

    先介紹下我以前寫的那些文章先,讓大家對(duì)這篇文章有個(gè)初步的認(rèn)識(shí)。

    單元測(cè)試之測(cè)試目的,

    單元測(cè)試之實(shí)踐一,關(guān)于設(shè)計(jì)的常見分層

    單元測(cè)試之實(shí)踐二,關(guān)于DAO的測(cè)試

    單元測(cè)試之實(shí)踐三 Service的測(cè)試









    單元測(cè)試之實(shí)踐四 Action的測(cè)試



    以前我正常的設(shè)計(jì)流程是Database->Model -> Dao-> Service -> Action ->View。這樣的設(shè)計(jì)伴隨我1年多了,這樣的設(shè)計(jì)方式好嗎?這樣的設(shè)計(jì)高效嗎? 代碼質(zhì)量能保證嗎? 我可以很肯定的回答,不能,如果數(shù)據(jù)庫一該,我要在表格里面添加一個(gè)字段,或者什么的。那么它將會(huì)牽連到很多其他,修改的動(dòng)作如下:Database->Model -> Dao-> Service -> Action ->View。 噢,my got,幾乎跟設(shè)計(jì)的一樣多,甚至更多,因?yàn)樵谛薷牡倪^程中你就算有再好IDE去重構(gòu)它也不能保證它的正確性。然后你就要去測(cè)試,測(cè)試它的正確性。也許測(cè)試的過程將是修改過程的幾倍時(shí)間。所以我個(gè)人覺得這樣的設(shè)計(jì)方式是不高效的??偠灾褪沁@樣的設(shè)計(jì)遲早會(huì)出問題的?



    為什么會(huì)這樣呢?難道就沒有一種解決辦法嗎? 經(jīng)過這段日子學(xué)習(xí)我發(fā)現(xiàn),以前的設(shè)計(jì)不能很好的保證質(zhì)量是因?yàn)槟銢]有足夠的單元測(cè)試去支撐著它,所以你改了代碼后缺乏一個(gè)很好的手段去保持這段代碼的質(zhì)量,換句話的意思就是,沒有一個(gè)靜態(tài)的人去監(jiān)督你的工作(我把單元測(cè)試比喻為靜態(tài)的人,它只做一件事,就是督促你的代碼不出問題)。



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

    設(shè)計(jì)有時(shí)候更生活是一樣的,應(yīng)該經(jīng)常探索,經(jīng)常實(shí)踐才能感受的更多。

    那好吧我們就來個(gè)徹底的變革吧。怎么變呢? 很明顯:那就是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. }  



    好,非常好,怎么這段代碼不能運(yùn)行呢?當(dāng)然不行了,因?yàn)樯厦娴暮芏囝惗紱]有。那我們這段代碼的用途是什么呢?

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



    我們寫下實(shí)際代碼吧。

    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.     }  



    好,代碼寫好了。去運(yùn)行我們的測(cè)試吧。結(jié)果是令人失望的。怎么會(huì)是紅色的呢??隙ㄊ沁壿嫶a出問題了(如果測(cè)試代碼沒問題的話)。經(jīng)過檢查發(fā)現(xiàn)原來
    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.     } 



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

    后來查了半天發(fā)現(xiàn)原來

    java 代碼


     


    1. List l = new ArrayList();    

    2.  l.add(a);   



    我只renturn一個(gè)預(yù)期的對(duì)象a
    java 代碼


     


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

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

    3.         else   

    4.             return null;  



    而代碼卻要求我要傳入預(yù)期兩個(gè)對(duì)象才給我通過,所以代碼只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.     }  





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



    最后我郁悶下,寫這篇文章足足話了我22個(gè)小時(shí),

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

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

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







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

    90個(gè)外國英文網(wǎng)站強(qiáng)力推薦 (轉(zhuǎn))

    文章轉(zhuǎn)自http://www.j2medev.com/blog/user2/titoudao/archives/2006/2401.html

    主要收藏用。

    一、大陸可訪問的優(yōu)秀英文信息源

    1、英國《經(jīng)濟(jì)學(xué)家》
    http://www.economist.com

    2、美聯(lián)社
    http://wire.ap.org/GoToAP.cgi

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

    4、《紐約時(shí)報(bào)》
    http://www.nytimes.com

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

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

    7、《華爾街日?qǐng)?bào)》評(píng)論
    http://www.opinionjournal.com

    8、香港《南華早報(bào)》
    http://china.scmp.com/index.html



    二、新聞收藏夾

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

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

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

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



    三、英美外電新聞

    1、《泰晤士報(bào)》
    http://www.thetimes.co.uk

    2、《基督教科學(xué)箴言報(bào)》
    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、《每周標(biāo)準(zhǔn)》
    http://www.weeklystandard.com

    2、《外交事務(wù)雜志》
    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、《國家評(píng)論》
    http://www.nationalreview.com

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

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

    9、《紐約書評(píng)》
    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、《進(jìn)步》Homepage of The Progressive magazine
    http://www.progressive.org/

    15、《洋蔥》
    http://www.theonion.com/(有趣新聞?wù)军c(diǎn))



    五、時(shí)事資料

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

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

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

    4、衛(wèi)星照片
    http://www.spaceimaging.com/

    5、網(wǎng)上各國政府資料
    http://www.gksoft.com/govt/en/

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



    六、英美常用經(jīng)濟(jì)網(wǎng)站

    1、《金融時(shí)報(bào)》
    http://news.ft.com/home/rw

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

    3、《財(cái)富》
    http://www.fortune.com/fortune

    4、《遠(yuǎn)東經(jīng)濟(jì)評(píng)論》
    http://www.feer.com

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

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

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



    七、非英美周刊雜志和資料站點(diǎn)

    1、德國《鏡報(bào)》
    http://www.spiegel.de/spiegel(點(diǎn)擊English Texts)

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

    3、捷克《布拉格郵報(bào)》
    http://www.praguepost.cz/

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

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

    6、埃及《中東時(shí)報(bào)》
    http://www.metimes.com/

    7、《巴勒斯坦時(shí)報(bào)月刊》
    http://www.ptimes.com/

    8、巴勒斯坦《耶路撒冷時(shí)報(bào)》
    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/(一個(gè)情報(bào)站點(diǎn))

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

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

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

    16、臺(tái)灣《東森新聞報(bào)》
    http://www.ettoday.com/

    by
    http://www.hjenglish.com



    八、非英美外電新聞

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

    2、菲律賓《星報(bào)》
    http://www.philstar.com/htmtest/index.htm

    3、菲律賓《每日調(diào)查》
    http://www.inq7.net/

    4、印尼《雅加達(dá)郵報(bào)》
    http://www.thejakartapost.com/headlines.asp

    5、新加坡《海峽時(shí)報(bào)》
    http://straitstimes.asia1.com.sg/home

    6、巴基斯坦《黎明報(bào)》
    http://www.dawn.com

    7、《印度時(shí)報(bào)》
    http://www.timesofindia.com

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

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

    11、俄羅斯《莫斯科時(shí)報(bào)》
    http://www.moscowtimes.ru

    12、保加利亞《新聞報(bào)》
    http://news.bg/en/

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

    14、《愛爾蘭時(shí)報(bào)》
    http://www.ireland.com/

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

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

    17、《約旦時(shí)報(bào)》
    http://www.jordantimes.com

    18、阿聯(lián)酋《Khaleej時(shí)報(bào)》
    http://www.khaleejtimes.com/

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

    20、阿根廷《布宜諾斯艾利斯先驅(qū)報(bào)》
    http://www.buenosairesherald.com

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

    22、聯(lián)合國新聞中心
    http://www.un.org/News

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

    24、《時(shí)代周刊》
    www.time.com

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

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

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

    僅列出標(biāo)題
    共5頁: 上一頁 1 2 3 4 5 下一頁 
    主站蜘蛛池模板: 99久热只有精品视频免费看 | 亚洲综合在线成人一区| 亚洲成人在线网站| 亚洲免费电影网站| 国产成人亚洲综合无| 中文字幕在线免费看| 成年黄网站色大免费全看| 四虎成人免费网站在线| 国产性爱在线观看亚洲黄色一级片 | 女人张开腿给人桶免费视频| 亚洲成A人片在线观看无码3D| 久久久青草青青亚洲国产免观| 亚洲高清在线mv| 最新亚洲人成无码网站| 男女作爱在线播放免费网站| 日本精品人妻无码免费大全| 亚洲av日韩av欧v在线天堂| 亚洲综合在线视频| 亚洲AV无码专区在线电影成人| aa在线免费观看| 午夜宅男在线永久免费观看网| 亚洲国产精品狼友中文久久久| 91久久亚洲国产成人精品性色| 亚洲av午夜国产精品无码中文字 | 夫妻免费无码V看片| 一本色道久久综合亚洲精品| 亚洲国产精品久久网午夜| 色网站在线免费观看| 97公开免费视频| 免费成人黄色大片| 亚洲第一香蕉视频| jizz在线免费播放| 手机在线毛片免费播放| 亚洲色欲久久久综合网| 亚洲色大成网站www| 国产猛男猛女超爽免费视频| 精品少妇人妻AV免费久久洗澡| 亚洲福利在线观看| 日产久久强奸免费的看| 大地资源在线观看免费高清| 国产亚洲成av人片在线观看|