上章“運用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());
}
]);
但有這樣一些問題沒有解決:
- doh由誰來引入?在前文中是通過firebug控制臺來註入的。
- 測試代碼如何被運行起來?在前文中,是通過firebug控制臺註入測試代碼,並手動執行doh.run()命令來啟動測試的。
現在我們來看看常規的開發中應該如何佈署測試。
首先我建議你將開發目錄設置為類似下面的結構(與測試無關,隻不過這裡提到瞭測試,順便提一下):
幾年以前我們開始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技術