• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    追求代碼質量: 對 Ajax 應用程序進行單元測試[4]

    發布: 2008-7-04 08:07 | 作者: 不詳 | 來源: csai | 查看: 61次 | 進入軟件測試論壇討論

    領測軟件測試網 關鍵字:測試submitWord() 方法又委托給 getDefinition() 方法,我可以用 JUnit 測試它。getDefinition() 方法從邏輯上獨立于特定于 UI 的代碼(對于絕大部分而言),并且可以在沒有單擊按鈕的情況下得到調用。另一方面,與異步應用程序有關的狀態問題和 Java 語言的語義規則也規定了我不能在測試中完全 避免與 UI 相關的交互。仔細查看清單 4 中的代碼,您能夠發現激活異步回調的 getDefinition() 方法操縱了某些 UI 組件 —— 一個錯誤警告窗口以及一個 Label 實例。

        我還可以通過獲得輸出 Label 實例的句柄,斷言其文本是否是給定單詞的定義,從而驗證應用程序的功能。在用 GWTTestCase 測試時,最好不要 嘗試手工強制改變組件狀態,而應該讓 GWT 完成這些工作。舉例而言,在清單 4 中,我想驗證對某個給定單詞返回了其正確定義并放入一個輸出 Label 中。無需操作 UI 組件來設置這個單詞;我只要直接調用 getDefinition 方法,然后斷言 Label 具有對應定義。

        既然我已經編寫好了計劃進行測試的 GWT 應用程序,我需要實際編寫測試,這意味著設置 GWT 的 GWTTestCase。

        設置 GWTTestCase

        若想從 GWTTestCase 的測試魔力中獲益,需要遵守一些規則。幸運的是,規則很簡單:

        所有用于實現測試的類和待測 GWT 模塊必須位于同一個包內。

        運行測試時,您必須至少傳遞一個 VM 參數,指明在哪種 GWT 模式(托管或 Web)下運行測試。

        您必須實現 getModuleName() 方法,它返回一個 String,表示您的 XML 模塊文件。
    最后,因為與服務器端實體通信的 Ajax 應用程序在本質上是異步的,GWT 還提供了 Timer 類,以便延遲 JUnit,使異步行為在進行相關斷言之前全部完成。

        實現 getModuleName 和 Timer 類

        我已經指出,我的測試集中于 getDefinition() 方法(如 清單 4 所示)。您可以從代碼看到,測試邏輯非常簡單:傳入一個單詞(比如 pugnacious),然后驗證相應的 Label 文本是否得到正確定義。很簡單,對嗎?但是不要忘記,getDefinition() 方法在 AsyncCallback 對象中具有某種相關的異步性。

        GWTTestCase 類是一個抽象 類,因為它的 getModuleName() 方法就是這么聲明的;因此,當您擴展該類時,您需要實現 getModuleName()(除非您是在為框架創建自己的基抽象類)。模塊名實際上就是您的 GWT XML 文件所在的包結構的名稱去掉文件擴展名。舉個例子,在本例中,我有一個名為 WordModule.gwt.xml 的 XML 文件,它位于一個目錄結構如:com/acme/gwt。相應的,模塊的邏輯名稱為 com.acme.gwt.WordModule,這會讓您想到 Java 平臺的普通包模式。

        我已經得到一個模塊名,可以開始定義測試用例了,如清單 5 所示:


        清單 5. 您必須實現 getModuleName 方法并提供一個有效的名字
                   
    import com.google.gwt.junit.client.GWTTestCase;
    import com.google.gwt.user.client.Timer;

    public class WordModuleTest extends GWTTestCase {

     public String getModuleName() {
       return "com.acme.gwt.WordModule";
     }
    }
     


        到目前為止一切良好,但是我還沒有執行任何測試!由于我的 Ajax 應用程序使用 AsyncCallback 對象,在通過測試用例調用 getDefinition() 方法時, 我必須強迫 JUnit 延遲運行;否則測試將由于沒有任何響應而失敗。這就要用到 GWT 的 Timer 類。Timer 使我能夠重寫 getDefinition() 的 run 方法,在 Timer 內完成測試用例邏輯。(測試用例以獨立線程運行,有效地阻塞 JUnit 完成整個測試用例)。

        以我的測試為例,我將首先調用 getDefinition() 方法,然后提供一個 Timer 的 run() 方法的實現。run() 方法得到輸出 Label 實例的文本并驗證是否是正確定義。定義了 Timer 實例后,我就需要確定其何時運行,同時強制 JUnit 掛起直至 Timer 實例完成。也許聽起來有點復雜,不必擔心,因為實踐起來非常簡易。實際上,清單 6 展示了整個過程:

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/

    TAG: ajax AJAX Ajax 代碼 單元 應用程序 質量


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備10010545號-5
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>