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

精通 Grails 测试 Grails 应用程序(1)

精通 Grails 测试 Grails 应用程序(1)

编写第一个测试在开始测试之前,我将介绍一个新的域类。这个类的一些定制功能必须经过测试才能进入到生产中。输入 grails create-domain-class HotelStay,如清单 1 所示:
关于本系列Grails 是一种新型 Web 开发框架,它将常见的 Spring 和 Hibernate 等 Java™ 技术与当前流行的约定优于配置等实践相结合。Grails 是用 Groovy 编写的,它可以提供与遗留 Java 代码的无缝集成,同时还可以加入脚本编制语言的灵活性和动态性。学习完 Grails 之后,您将彻底改变看待 Web 开发的方式。

清单 1. 创建 HotelStay 类
1
2
3
4
5
6
7
$ grails create-domain-class HotelStay

Environment set to development
     [copy] Copying 1 file to /src/trip-planner2/grails-app/domain
Created Domain Class for HotelStay
     [copy] Copying 1 file to /src/trip-planner2/test/integration
Created Tests for HotelStay




从清单 1 可以看到,Grails 在 grails-app/domain 目录中为您创建了一个空的域类。它还在 test/integration 目录中创建了一个带有空的 testSomething() 方法的 GroovyTestCase 类(稍后我将进一步讲述单元测试和集成测试的区别)。清单 2 展示了一个带有生成的测试的空 HotelStay 类:
清单 2. 带有生成的测试的空类
1
2
3
4
5
6
7
class HotelStay {
}

class HotelStayTests extends GroovyTestCase {
    void testSomething() {
    }
}




GroovyTestCase 是在 JUnit 3.x 单元测试之上的一层 Groovy。如果您熟悉 JUnit TestCase,您肯定知道 GroovyTestCase 是如何工作的。对于这两种情况,您通过断言代码正常工作来测试它们。JUnit 有各种不同的断言方法,包括 assertEquals、assertTrue 和 assertNull 等等。它使您通过编程的方式表明 “我断言这个代码按照预期工作”。
为什么是 JUnit 3.x 而不是 4.x?由于历史原因,GroovyTestCase 就是一个 JUnit 3.x TestCase。当 Groovy 1.0 于 2007 年 1 月发布时,它支持 Java 1.4 语言结构。它可以在 Java 1.4、1.5 和 1.6 JVM 上运行,但在语言级别上仅与 Java 1.4 兼容。
接下来 Groovy 的主要发布版是 1.5,在 2008 年 1 月发布。Groovy 1.5 支持所有 Java 1.5 语言特性,比如泛型、静态导入、for/in 循环和注释(后者最值得讨论)。不过 Groovy 1.5 仍然可以在 Java 1.4 JVM 上运行。Groovy 开发团队许诺所有 Groovy 1.x 版本都将与 Java 1.4 保持向后兼容性。当 Groovy 2.x 发布时(可能是 2009 年末或 2010 年),它将不支持 Java 1.4。
因此,这些与 GroovyTestCase 打包的 JUnit 版本有什么关系呢?JUnit 4.x 引入了一些注释,比如 @test、@before 和 @after。尽管这些新特性非常有趣,但 JUnit 3.x 仍然是 GroovyTestCase 向后兼容 Java 1.4 的基础。
这就是说,您完全可以使用 JUnit 4.x(参见  获得 Groovy 站点相关文档的链接)。引入其他使用注释和 Java 5 语言特性的测试框架是完全有可能的(参见  获得结合使用 TestNG 和 Groovy 的示例)。Groovy 的字节码与 Java 编程兼容,因此您可以通过 Groovy 使用任何 Java 测试框架。

将清单 3 中的代码添加到 grails-app/domain/HotelStay.groovy 和 test/integration/HotelStayTests.groovy:
清单 3. 一个简单的测试
1
2
3
4
5
6
7
8
9
10
class HotelStay{
  String hotel
}

class HotelStayTests extends GroovyTestCase {
  void testSomething(){
    HotelStay hs = new HotelStay(hotel:"Sheraton")
    assertEquals "Sheraton", hs.hotel
  }
}




清单 3 正是我前面提到那种低级 Grails 基础设施测试。您应该相信 Grails 能够正确执行这个操作,因此这是一个典型的错误测试类型。但它允许您编写最简单的测试并观察其运行,实现了本文的目的。

要运行所有测试,请输入 grails test-app。要仅运行这个测试,请输入 grails test-app HotelStay(由于约定优于配置,Tests 后缀可以省略)。不管输入哪个命令,您应该会在命令提示中看到如清单 4 所示的输出(注意:为了突出重要的特性,我删减了许多代码)。
清单 4. 运行测试时的输出
1
2
3
4
5
6
7
8
9
10
11
12
13
$ grails test-app
Environment set to test

No tests found in test/unit to execute ...

-------------------------------------------------------
Running 1 Integration Test...
Running test HotelStayTests...
                    testSomething...SUCCESS
Integration Tests Completed in 253ms
-------------------------------------------------------

Tests passed. View reports in /src/trip-planner2/test/reports




这里发生了 4 件重要的事情:
  • 可以看到,environment 被设置为 test。这意味着 conf/DataSource.groovy 文件中的 test 块的数据库设置已生效。
  • test/unit 中的脚本已运行。您尚未编写任何单元测试,所以不能找到任何单元测试,这并不奇怪。
  • test/integration 中的脚本已经运行。您可以看到 HotelStayTests.groovy 脚本的输出 — 它的旁边有个很大的 SUCCESS。
  • 这个脚本向您展示一组报告。
如果您在 Web 浏览器中打开 /src/trip-planner2/test/reports/html/index.html,应该会看到一个关于所有已运行的测试的报告。如图 1 所示。
图 1. JUnit 顶级汇总报告如果您单击 HotelStayTests 链接,应该会看到 doSomething() 测试,如图 2 所示:
图 2. JUnit 类级报告如果测试意外失败,命令提示输出和 HTML 报告(如图 3 所示)将通知您:
图 3. 失败的 JUnit 测试
返回列表