【问题标题】:Grails unit or integration tests?Grails 单元测试还是集成测试?
【发布时间】:2013-07-13 12:21:47
【问题描述】:

对于我想在 Grails 2.2.3 应用程序中测试的内容,我不知道是使用单元测试还是集成测试。我想像这样运行一些测试:

@TestFor(Student)
@Mock(Student)
class StudentTests {

void testFoundStudent() {
        def s = Student.findById(myId)
        assert s != null
        assert s.firstName = 'Grant'
        assert s.lastName = 'McConnaughey'
    }
}

这将需要使用我们的测试数据库,那么这是否会使其成为集成测试?当我将此代码作为单元测试运行时,它在assert s != null 处失败。这意味着它没有使用我们的数据库,因为它应该找到具有该 ID 的学生。

【问题讨论】:

  • 您的测试数据库是否在DataSource.groovytest 环境下被提及/使用?
  • 另外,如果您使用的是@TestFor(DomainClass),我认为您不需要@Mock 注释。 @TestFor 会为你做嘲笑。
  • 在哪里可以解决您的问题?

标签: unit-testing testing grails junit integration-testing


【解决方案1】:

在 Grails 单元测试中,您可以使用 Gorm 测试域类交互,并且在后台 Grails 将使用内存数据库(ConcurrentHashMap 的实现)来模拟这种行为here。所以是的,您得到 null 因为该学生在内存数据库中不存在,您需要先插入该数据。

Student.findOrSaveWhere (firstName: 'Grant',lastName : 'McConnaughey')

在您的示例中,如果打算测试该数据是否存在,您需要使用集成测试并使用 datasource.groovy 将其连接到您的数据库,除非您有充分的理由进行测试,否则这确实不是一个好主意你的数据。

如果您尝试再次测试def s = Student.findById(myId),那并没有增加任何价值,因为那是 Grails 动态查找器,您可能需要信任您正在使用的框架。

不过,一般来说

单元测试通常在没有物理的情况下运行 涉及 I/O 的资源,例如数据库、套接字连接或 文件link

希望对你有帮助

【讨论】:

  • 那么应用程序是否可能只需要集成测试?
  • 我想说任何应用程序都应该至少有单元、集成和功能测试。我宁愿有重叠覆盖而不是不覆盖某些东西。您选择了测试,具体取决于您正在测试的模块的性质。简单而幼稚的答案是用单元测试的单一功能覆盖您的较小组件。然后使用集成测试来覆盖它们的交互,最后使用功能来覆盖更大的图景。我的类比是您放大并使用单元测试测试问题,然后缩小一点并使用集成进行测试并完全缩小功能测试的问题。
猜你喜欢
  • 2021-12-19
  • 2014-09-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-15
  • 1970-01-01
  • 1970-01-01
  • 2015-11-20
  • 1970-01-01
相关资源
最近更新 更多