首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Dojo 敏捷开发:集成 DOH 单元测试到 Ant build (2)

Dojo 敏捷开发:集成 DOH 单元测试到 Ant build (2)

集成 DOH 单元测试到 Ant build所谓集成 DOH 单元测试到 Ant build 中,就是寻找一种方式将使用 DOH 编写的单元测试作为 Ant build 的一个 target 进行运行,并且能够将单元测试结果体现在 build 的运行结果中,当单元测试失败时能够使 build 失败。
在介绍集成方式之前,首先来看一下 Dojo 项目代码的组织方式,因为组织方式的不同将会影响到 build 中的一些参数配置。
Dojo 项目代码的组织方式以下所介绍的 Dojo 项目代码的组织方式只是一种比较流行的组织方式,并不是唯一可行的,您可采用不同的组织方式。本文后面实例中的参数配置将以下面介绍的组织方式为准。
通常一个 Web 项目的所有 Web 资源都包含在一个 WebContent 目录中,其中包括图片、JavaScript 脚本、CSS 等。Dojo 项目还包括 Dojo 类库、项目 Dojo 代码、项目的 Dojo 单元测试代码。如下图展示了这些文件的目录组织方式:
图 1. Dojo 项目的目录组织方式其中,dojo 目录是 Dojo 的库目录;com 是项目 Dojo 代码目录,com 是项目代码包的顶级目录;tests 是项目单元测试目录;css 是项目 CSS 文件所在的目录;images 是项目图片文件所在的目录。这些目录中与本文所介绍的主题相关的有 dojo 目录和 tests 目录。
典型的 Dojo 库的 dojo 目录包含子文件夹:dojo、dijit、dojox、util,util 中包含 shrinksafe、doh 等目录;tests 目录中通常会定义一个 module.js 文件,用于定义所有待运行的 Dojo 单元测试列表。
集成命令行运行方式DOH 的命令行运行方式通过一个 Java 命令运行 js.jar,并且将 runner.js 和待运行的模块通过参数传递进去。集成这种方式到 Ant build 中是显而易见的,因为 Ant 直接提供了运行 Java 命令的方式。清单 1 的 Ant 片段就能够完成运行 Dojo 单元测试的目的(假定 build.xml 文件在 js 目录中)。
清单 1. 集成命令行运行方式的 Ant 片段
1
2
3
4
5
6
7
8
9
10
<target name="runUT">
   <java jar="dojo/util/shrinksafe/js.jar" fork="true"
          failonerror="true">
       <arg value="dojo/util/doh/runner.js"/>
       <arg value="dojoUrl=dojo/dojo/dojo.js"/>
       <arg value="dohBase=dojo/util/doh/"/>
       <arg value="testUrl=tests/module.js"/>
       <arg value="testModule=tests.module"/>
   </java>
</target>




这里的 failonerror 属性一定要设置为 true,这样当单元测试失败时 build 才会失败。Java 命令里面的 arg 定义了执行 js.jar 时所需要的参数:
  • dojo/util/doh/runner.js: 这个参数指定了 DOH 中 runner.js 相对于 build basedir 的路径;
  • dojoUrl=dojo/dojo/dojo.js: 这个参数指定了 dojoUrl 的值,即相对于 build basedir,Dojo 库中 dojo.js 的路径;
  • dohBase=dojo/util/doh/: 这个参数指定了 dohBase 的值,即相对于 build basedir,DOH 根目录的相对路径,即项目目录中 doh 目录的路径;
  • testUrl=tests/module.js: 这个参数指定了 testUrl 的值,即相对于 build basedir,待执行单元测试的路径,通常直接指向 module.js 文件,它是单元测试的入口;
  • testModule=tests.module: 这个参数指定了 testModule 的值,即待测试模块的名称,通常定义为 module.js 所定义的模块。
当该 target 被执行时,module.js 中 required 的所有单元测试将会被执行,我们写的每一个单元测试都可以用独立的 js 文件进行组织,然后通过 required 方式包含在 module.js 中。单元测试的运行结果会被直接打印出来,当有单元测试失败时 build 就会失败。清单 2 展示了一个简单的 DOH 单元测试 sampleTest.js。
清单 2. DOH 单元测试示例
1
2
3
4
dojo.provide("tests.sampleTest");
doh.register("tests.sampleTest", [ function test_sample() {
doh.assertEqual("b", "a");
} ]);




将这个单元测试添加到 module.js 中,即在 module.js 的头部位置中添加一行语句:dojo.require("tests.sampleTest ")
清单 3 展示了这个单元测试运行的结果:
清单 3. 失败的 DOH 单元测试运行结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
run:
    [java] ------------------------------------------------------------
    [java] The Dojo Unit Test Harness, $Rev: 24146 $
    [java] Copyright (c) 2011, The Dojo Foundation, All Rights Reserved
    [java] ------------------------------------------------------------
    [java] 1 tests to run in 1 groups
    [java] ------------------------------------------------------------
    [java] GROUP "tests.sampleTest" has 1 test to run
    [java] _AssertFailure: doh._AssertFailure: assertEqual() failed:
    [java] expected
    [java] b
    [java] but got
    [java] a
    [java] : assertEqual() failed:
    [java] expected
    [java] b
    [java] but got
    [java] a
    [java] doh._AssertFailure: assertEqual() failed:
    [java] expected
    [java] b
    [java] but got
    [java] a
    [java] ERROR IN:
    [java]  (function test_sample() {doh.assertEqual("b", "a");})
    [java] ------------------------------------------------------------
    [java] | TEST SUMMARY:
    [java] ------------------------------------------------------------
    [java]  1 tests in 1 groups
    [java]  0 errors
    [java]  1 failures

BUILD FAILED




如果将 sampleTest.js 中 doh.assertEqual(“b”, “a”) 改为 doh.assertEqual(“a”, “a”),就会是一个执行成功的结果,如清单 4 所示。
清单 4. 成功的 DOH 单元测试运行结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
run:
    [java] ------------------------------------------------------------
    [java] The Dojo Unit Test Harness, $Rev: 24146 $
    [java] Copyright (c) 2011, The Dojo Foundation, All Rights Reserved
    [java] ------------------------------------------------------------
    [java] 1 tests to run in 1 groups
    [java] ------------------------------------------------------------
    [java] GROUP "tests.sampleTest" has 1 test to run
    [java] ------------------------------------------------------------
    [java] | TEST SUMMARY:
    [java] ------------------------------------------------------------
    [java]  1 tests in 1 groups
    [java]  0 errors
    [java]  0 failures
BUILD SUCCESSFUL

返回列表