運用D.O.H進行Javascript應用程序測試(二)

上章“運用D.O.H進行Javascript應用程序測試(一)”使用firebug和Javascript註入技術快速展示瞭D.O.H的功能和基本用法。主要是:

  • 通過

    			dojo.provide("demo.doh.tests.functions.demoFunctions");

    來註冊測試代碼模塊,並在測試代碼模塊中通過我們熟悉的

    			//Import in the code being tested.
    			dojo.require("demo.doh.demoFunctions");

    來引入被測試代碼模塊。

通過doh.register(),而不是dojo.declare來定義測試代碼模塊:

 

 

doh.register("demo.doh.tests.functions.demoFunctions", [

 

function test_alwaysTrue(){

 

// summary:

 

// A simple test of the alwaysTrue function

 

// description:

 

// A simple test of the alwaysTrue function

 

doh.assertTrue(demo.doh.demoFunctions.alwaysTrue());

 

}

 

]);

 

 

但有這樣一些問題沒有解決:

  1. doh由誰來引入?在前文中是通過firebug控制臺來註入的。
  2. 測試代碼如何被運行起來?在前文中,是通過firebug控制臺註入測試代碼,並手動執行doh.run()命令來啟動測試的。

現在我們來看看常規的開發中應該如何佈署測試。

首先我建議你將開發目錄設置為類似下面的結構(與測試無關,隻不過這裡提到瞭測試,順便提一下):

image

幾年以前我們開始Java web application開發時,總是將test文件夾與src文件夾平行放置。上面的結構是Spring Roo的風格,現在我更能接受這種目錄結構。

首先,註意到util/doh下面的runner.html。該文件為運行測試提供瞭以下的基礎設施:

  • 一個圖形化的窗口和瀏覽器環境。這樣不僅可以運行跟瀏覽器窗口有關的測試代碼,而且提供瞭更好的圖形化測試報告呈現。
  • dojo和doh加載。這樣就解決瞭前面所提到的誰來註入doh的問題。
  • 啟動測試引擎doh.run()。

現在惟一的問題就是,如何讓這個框架運行我們的測試代碼?

答案在runner.html可以接受query string,這些query string被用作輸入參數,巧妙!(曾經看到一篇blog提到,使用類似的方法以打開dojo的調試開關)。

runner.html可以接受下面的參數:

  • dojoUrl 缺省地runner.html使用../../dojo/dojo.js作為dojo的位置。這個參數用來改寫這個設置。
  • testUrl  如果你的測試當中用到瞭任何第三方的庫,而無法使用dojo.require註入的,通過這個參數來註入第三方庫。盡管關鍵字testUrl使用瞭單數形式,但實際上它可以接收多個url,這些url需要以‘,’分隔。如果url不帶’.js’,它也會自動補上。
  • testModule 通過這個參數來引入我們的測試代碼。同樣,它可以接收多個moduleName,這些moduleName之間使用’,'分隔。dojo在絕大多數地方,名詞的單復數被用來區分是單個對象,還是一組對象的集合。這個地方是個小小的意外。
  • registerModulePath 前面引入的module如果其位置不在dojo.js/..目錄下,則需要通過這個參數來註冊。runner.html隻是保存這裡傳入的參數,將其解析成為數組並保存,但並不真正調用dojo.regiesterModulePath。

所以,如果要運行myModuleTest這個測試模塊,就需要這樣輸入url: /dojolib/util/doh/runner.html?testModule=myModuleTest

上面的地址,如果你的服務器不是apache或者nginx這樣的靜態資源服務器,而是tomcat這樣的應用服務器,可能會有一點點問題。我不確信服務器是否會報告非著名的404 Not Found錯誤。但我使用瞭nginx且沒有使用地址改寫重定向看起來nginx直接去掉瞭queryString,將前面的部分當成請求地址返回瞭。

 

 

10:58:53 http request line: "GET /dojolib/util/doh/runner.html?testModule=myModuleTest HTTP/1.1" 

10:58:53 http uri: "/dojolib/util/doh/runner.html" 

10:58:53 http args: "testModule=myModuleTest" 

10:58:53 http exten: "html" 

10:58:53 http process request header line 

10:58:53 http header: "Host: www.lotus-scent.com" 

10:58:53 http header: "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:7.0.1) Gecko/20100101 Firefox/7.0.1" 

10:58:53 http header: "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" 

10:58:53 http header: "Accept-Language: zh-cn,zh;q=0.5" 

10:58:53 http header: "Accept-Encoding: gzip, deflate" 

10:58:53 http header: "Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7" 

10:58:53 http header: "Connection: keep-alive" 

10:58:53 http header: "Cookie: Drupal.toolbar.collapsed=0; cocat1=-19.-6.-3" 

10:58:53 http header done 

10:58:53 event timer del: 4: 1318215561487 

10:58:53 rewrite phase: 0 

10:58:53 test location: "/" 

10:58:53 test location: "dojodoc" 

10:58:53 test location: "edward" 

10:58:53 test location: "dojolib" 

10:58:53 test location: ~ "/blog/.*\.(?:ico|css|js|gif|jpe?g|png|zip)" 

10:58:53 using configuration "/dojolib" 

10:58:53 http cl:-1 max:1048576 

10:58:53 rewrite phase: 2 

10:58:53 post rewrite phase: 3 

10:58:53 generic phase: 4 

10:58:53 generic phase: 5 

10:58:53 access phase: 6 

10:58:53 access phase: 7 

10:58:53 post access phase: 8 

10:58:53 content phase: 9 

10:58:53 content phase: 10 

10:58:53 content phase: 11 

10:58:53 http filename: "/usr/www/dojolib/util/doh/runner.html" 

10:58:53 add cleanup: 000000001E3ED7D0 

10:58:53 http static fd: 3 

10:58:53 http set discard body 

10:58:53 HTTP/1.1 200 OK 

 

 

 

當前面的url請求返回時,window對象依然保存著原始的url地址,而非服務器真正返回文件的地址。所以,當runner.html文檔在瀏覽器裡加載時,javascript引擎就可以解析query string中攜帶的參數,並發起新的請求以加載測試模塊。

 

摘自:盛夏蓮花- 前沿web技術

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *