快速业务通道

精通Grails - 使用Grails进行单元测试(单元测试提速) - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23

精通Grails - 使用Grails进行单元测试(单元测试提速)

时间:2010-12-03 IBM Scott Davis

在本期精通Grails中,Scott Davis 向您展示如何利用 Grails 中包含的 GrailsUnitTestCase 和 ControllerUnitTestCase 类的内置模拟功能。

Grails 支持两种基本的测试类型:单元测试和集成测试。两种测试的语法完 全相同:都被使用相同的断言编写为一个 GroovyTestCase。它们之间的区别在 于语义上。单元测试用于在隔离环境下测试类,而集成测试支持在完整的、正在 运行的环境中测试类。

该文章是根据当时最新的 Grails 1.0 版本编写的,在该版本中,测试基础 架构的功能得到了显著改进。GrailsUnitTestCase 类及其子类的引入将流程测 试的简单性和全面性提升到了一个全新的水平。具体来讲,这些新测试类的模拟 功能提升了单元测试的速度,同时能够像在集成测试中一样正常测试功能。图 1 展示了 Grails 1.1.x 中全新的测试层次结构:

图 1. Grails 1.1.x 中全新的测试层次结构

当您在下一节中创建一个新的域类和控制器时,您将了解如何实际应用 GrailsUnitTestCase 和 ControllerUnitTestCase。

开始

要执行本文中的示例,首先创建一个新应用程序。在命令提示符下键入:

grails create-app testing

更改到测试目录(cd testing),然后键入:

grails create-domain-class User

接下来键入:

grails create-controller User

将清单 1 中的代码添加到 grails-app/domain/User.groovy 中:

清单 1. User 域类

class User {   String name   String login   String password   String role = "user"   static constraints = {    name(blank:false)    login(unique:true, blank:false)    password(password:true, minSize:5)    role(inList:["user", "admin"])   }   String toString(){    "${name} (${role})"   } }

定义 grails-app/controller/UserController.groovy 的核心行为,如清单 2 所示:

清单 2. UserController 类

class UserController {    def scaffold = true }

现在基本的基础架构已经就绪了,接下来添加一些测试。

精通Grails - 使用Grails进行单元测试(单元测试提速)(2)

时间:2010-12-03 IBM Scott Davis

在 GrailsUnitTestCase 中进行模拟

在文本编辑器中打开 test/unit/UserTests.groovy。代码如清单 3 所示:

清单 3. UserTests 类

import grails.test.* class UserTests extends GrailsUnitTestCase {    protected void setUp() {      super.setUp()    }    protected void tearDown() {      super.tearDown()    }    void testSomething() {    } }

在 Grails 1.0 中,create-domain-class 命令创建的存根测试扩展了 GroovyTestCase。可以看到,现在对一个域类的单元测试(在 Grails 1.1 中) 扩展了 GrailsUnitTestCase。所以,您可以使用一些新方法来在单元测试中启 用模拟功能,这种功能在以前需要在集成测试中启用。

具体来讲,GrailsUnitTestCase 提供了以下模拟方法:

mockForConstraintsTests() mockDomain() mockLogging()

要理解这些模拟方法有何用途,首先创建一个会失败的测试。将 testSomething() 方法更改为 testBlank() 方法,如清单 4 所示:

清单 4. 一个将会失败的测试

void testBlank() {   def user = new User()   assertFalse user.validate() }

您可能会问这个测试为什么会失败,毕竟它的语法是正确的。答案是您现在 运行的是单元测试。单元测试意味着在隔离环境中运行,所以不会运行数据库和 Web 服务

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号