我对测试不太熟悉,在开发Grails应用程序。
我想编写一个测试,以验证“当调用此操作时,返回正确的视图”。但我不知道如何确定是将其设计为单元测试还是集成测试。两种测试都可以满足我的需求 - 我该如何决定?
我对测试不太熟悉,在开发Grails应用程序。
我想编写一个测试,以验证“当调用此操作时,返回正确的视图”。但我不知道如何确定是将其设计为单元测试还是集成测试。两种测试都可以满足我的需求 - 我该如何决定?
集成测试的一个问题是速度。对我来说,集成测试需要15秒以上才能启动。在这段时间内,某些事情确实会从头脑中消失。
我更喜欢使用单元测试,其启动时间不超过2秒,并且可以在这15秒内运行多次。特别是使用mockDomain()。
特别是在Grails 2.0实现单元测试中的条件查询和命名查询。
单元测试的另一个优点是它们强制你解耦代码。集成测试总是诱使你仅依赖于其他已存在和初始化的组件。
单元测试是在“单元”级别进行的测试。换句话说,您正在测试单个方法或代码块,而不考虑周围的基础架构。在Grails中,您需要特别注意单元测试和集成测试之间的区别,因为在单元测试中,Grails不会注入任何在集成测试和运行时存在的动态方法。
这意味着单元测试与Grails环境完全隔离,而集成测试则不是。根据《this article》的作者Scott Davis所说,只编写集成测试是可以接受的。与单元测试不同,集成测试可以完全访问测试中的Grails环境。Grails将使用内存中的HSQLDB数据库进行集成测试,并在每个测试之间清除数据库中的所有数据。
正如我之前提到的,Grails支持两种基本类型的测试:单元测试和集成测试。在语法上两者没有区别——都是使用同样的断言作为GroovyTestCase编写的。不同之处在于语义。单元测试旨在独立测试类,而集成测试允许您在完整的运行环境中测试类。
坦白地说,如果您想将所有Grails测试都编写为集成测试,那对我来说也没问题。所有Grails create-*命令生成相应的集成测试,因此大多数人只需使用现有的测试。正如您马上会看到的,大多数您想要测试的内容都需要完整的环境运行,因此集成测试是一个非常好的默认选项。如果您有想要测试的非核心Grails类,则单元测试也可以。
这是一个非常有趣和具有挑战性的问题,但事实上,答案取决于您要测试什么。
以以下测试为例:“将书保存到数据库中”。提示在描述中。我们说我们需要一本书和一个数据库,所以在这种情况下,单元测试行不通,因为我们需要集成的数据库。
我的建议是将完整的测试描述写下来,并像我上面那样分解它。这将为您提供提示,帮助您做出决定。
使用Spock更容易,因为您可以使用字符串作为测试名称。
首先阅读Grails指南的这一章http://grails.org/doc/latest/guide/9.%20Testing.html
它讲述了如何测试控制器以及获取控制器响应的能力,例如: controller.response.contentAsString
现在决定哪种测试更多地是一门艺术而非科学。我更喜欢单元测试,因为它们运行速度更快 :)