何时进行单元测试,何时进行集成测试

4

我对测试不太熟悉,在开发Grails应用程序。

我想编写一个测试,以验证“当调用此操作时,返回正确的视图”。但我不知道如何确定是将其设计为单元测试还是集成测试。两种测试都可以满足我的需求 - 我该如何决定?

4个回答

5

集成测试的一个问题是速度。对我来说,集成测试需要15秒以上才能启动。在这段时间内,某些事情确实会从头脑中消失。

我更喜欢使用单元测试,其启动时间不超过2秒,并且可以在这15秒内运行多次。特别是使用mockDomain()。 特别是在Grails 2.0实现单元测试中的条件查询和命名查询

单元测试的另一个优点是它们强制你解耦代码。集成测试总是诱使你仅依赖于其他已存在和初始化的组件。


我倾向于使用单元测试来覆盖大部分代码。但有时候我会在单元测试中漏掉一些东西,有时候我对代码与协作者交互的假设也是错误的。因此,我喜欢添加简单的集成测试来确保协作者之间能够良好地协作。 - Shawn Flahave
好的,我并没有说不要使用集成测试; 我们需要测试集成。但对于任何特定组件,请务必进行单元测试。 - Victor Sergienko

4

来自Grails文档第9.1节

单元测试是在“单元”级别进行的测试。换句话说,您正在测试单个方法或代码块,而不考虑周围的基础架构。在Grails中,您需要特别注意单元测试和集成测试之间的区别,因为在单元测试中,Grails不会注入任何在集成测试和运行时存在的动态方法。

来自Grails文档第9.2节

与单元测试不同,集成测试可以完全访问测试中的Grails环境。Grails将使用内存中的HSQLDB数据库进行集成测试,并在每个测试之间清除数据库中的所有数据。

这意味着单元测试与Grails环境完全隔离,而集成测试则不是。根据《this article》的作者Scott Davis所说,只编写集成测试是可以接受的。

单元测试 vs 集成测试

正如我之前提到的,Grails支持两种基本类型的测试:单元测试和集成测试。在语法上两者没有区别——都是使用同样的断言作为GroovyTestCase编写的。不同之处在于语义。单元测试旨在独立测试类,而集成测试允许您在完整的运行环境中测试类。

坦白地说,如果您想将所有Grails测试都编写为集成测试,那对我来说也没问题。所有Grails create-*命令生成相应的集成测试,因此大多数人只需使用现有的测试。正如您马上会看到的,大多数您想要测试的内容都需要完整的环境运行,因此集成测试是一个非常好的默认选项。如果您有想要测试的非核心Grails类,则单元测试也可以。


我看了这两篇文章。他说“这对我来说没问题”并没有让我感到有说服力。我正在寻找一个强有力的理由,为什么我会选择一种测试方法而不是另一种,针对我所概述的特定测试。 - skaz
1
我对他说“没问题”有点感觉一样,但他的个人简介相当令人印象深刻。我有他的一本书(Groovy Recipes),我觉得他通常知道自己在说什么。 - ubiquibacon

0

这是一个非常有趣和具有挑战性的问题,但事实上,答案取决于您要测试什么。

以以下测试为例:“将书保存到数据库中”。提示在描述中。我们说我们需要一本书和一个数据库,所以在这种情况下,单元测试行不通,因为我们需要集成的数据库。

我的建议是将完整的测试描述写下来,并像我上面那样分解它。这将为您提供提示,帮助您做出决定。

使用Spock更容易,因为您可以使用字符串作为测试名称。


0

首先阅读Grails指南的这一章http://grails.org/doc/latest/guide/9.%20Testing.html

它讲述了如何测试控制器以及获取控制器响应的能力,例如: controller.response.contentAsString

现在决定哪种测试更多地是一门艺术而非科学。我更喜欢单元测试,因为它们运行速度更快 :)


我已经多次阅读了这篇文章并看到了控制器的示例。但是,让我担心的是实现的艺术部分。在我的情况下,我没有充分的理由选择其中一种方法。 - skaz
底线是你需要两者兼备。我使用单元测试尽可能地覆盖代码——这对于像 Groovy 这样的动态语言至关重要!集成测试将让您知道在模拟服务方法时制作的假设是否成立。 - dbrin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接