文章“运用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:
http://www.example.com/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