运用D.O.H进行Javascript应用程序测试(二)

来源:互联网 发布:php substr函数的用法 编辑:程序博客网 时间:2024/06/07 16:32

文章“运用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:

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 line10: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 done10:58:53 event timer del: 4: 131821556148710:58:53 rewrite phase: 010: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:104857610:58:53 rewrite phase: 210:58:53 post rewrite phase: 310:58:53 generic phase: 410:58:53 generic phase: 510:58:53 access phase: 610:58:53 access phase: 710:58:53 post access phase: 810:58:53 content phase: 910:58:53 content phase: 1010:58:53 content phase: 1110:58:53 http filename: "/usr/www/dojolib/util/doh/runner.html"10:58:53 add cleanup: 000000001E3ED7D010:58:53 http static fd: 310:58:53 http set discard body10:58:53 HTTP/1.1 200 OK

当前面的url请求返回时,window对象依然保存着原始的url地址,而非服务器真正返回文件的地址。所以,当runner.html文档在浏览器里加载时,javascript引擎就可以解析query string中携带的参数,并发起新的请求以加载测试模块。
原创粉丝点击