365bet地区365bet地区服务测试

365bet地区在本指南中,我们将探索365bet地区中的服务测试单元测试GORM集成测试模拟合作者

s尼拉夫·埃萨(Nirav Essar)

365bet地区版本 3.3.0

365bet地区培训

365bet地区培训由创建并积极维护365bet地区框架的人们开发和交付

入门

365bet地区在本指南中,您将探索365bet地区中的服务测试。

  • 365bet地区365bet地区服务单元测试模拟合作者

  • 365bet地区365bet地区服务单元测试GORM代码

  • 365bet地区365bet地区服务集成测试

您将需要什么

要完成本指南,您将需要以下内容

  • 花些时间在你手上

  • 体面的文本编辑器或IDE

  • 安装了JDK或更高版本JAVA首页适当配置

如何完成指南

要开始,请执行以下操作

要么

365bet地区指南存储库包含两个文件夹

  • 初始初始项目通常是一个简单的365bet地区应用程序,其中包含一些其他代码,可以帮助您快速入门

  • 完成一个完整的示例它是按照指南中介绍的步骤进行操作并将这些更改应用于文档的结果。初始

要完成指南,请转到初始

  • 光盘进入grails指南grails模拟基础入门

并按照下一节中的说明进行操作

您可以直接前往完成的例子如果你光盘进入grails指南grails模拟基础完整

编写申请

我们将编写一个简单的应用程序,其中涉及课堂还有一个学生域类

多个服务将与这些域类交互我们将使用这些服务来讨论多个测试主题

域类

我们将创建Domain类作为应用程序的基础。学生课堂有一对多的关系课堂拥有许多学生A学生可以报​​名参加课堂或无

grails创建领域课程Student

将域属性添加到创建的类文件

grails应用程序域grails模拟基础学生习惯
365bet地区模拟基础 grails编译器365bet地区CompileStatic

365bet地区CompileStatic
 学生 {
    大十进制年级课堂教室静态的约束教室可为空: 
    }
}
grails创建域类Classroom

再次将域属性添加到创建的类文件中有很多学生这会建立一对多的关系

grails应用程序域grails模拟基础课堂常规
365bet地区模拟基础 常规转换CompileStatic

静态编译
 课堂 {

    老师静态的有很多学生们学生

戈拉姆冬眠

我们正在使用GORM RELEASE

gradle属性
grails版本3.3.0grailsWrapperVersion1.0.0gormVersion6.1.6发布gradleWrapperVersion3.5
建立gradle
buildscript存储库mavenLocal maven url"https repo grails org grails核心"依赖类路径"org grails grails gradle插件$grails版本"类路径"com bertramlabs插件资产管道gradle"类路径"org grails插件休眠${gormVersion"发布"}" (1)"0.1""365bet地区模拟基础"应用插入:"日食"应用插入:"理念"应用插入:"战争"应用插入:"组织grails grails网站"应用插入:"资产管道"应用插入:"组织grails grails gsp"应用插入: 'Codenarc'仓库Maven本地Maven网址"https repo grails org grails核心"依赖项编译"org springframework boot spring boot starter logging"编译"org springframework boot spring boot autoconfigure"编译"组织grails grails核心"编译"org springframework引导弹簧引导启动器执行器"编译"org springframework boot spring boot starter tomcat"编译"组织grails grails网络启动"编译"组织grails grails日志记录"编译"org grails grails插件其余"编译"org grails grails插件数据绑定"编译"org grails grails插件,我"编译"org grails grails插件服务"编译"org grails grails插件URL映射"编译"org grails grails插件拦截器"编译"org grails插件缓存"编译"org grails插件异步"编译"org grails插件脚手架"编译"org grails插件事件"编译"org grails插件休眠"  (1)编译"组织休眠休眠核心决赛"编译"org grails插件gsp"安慰"org grails grails控制台"轮廓"org grails个人资料网站"运行"org glassfish网站el impl b"运行"与h数据库h"运行"组织apache tomcat tomcat jdbc"运行"com bertramlabs插件资产流水线"测试编译"org grails grails gorm测试支持"测试编译"org grails出生的插件"测试编译"org grails grails网站测试支持"testRuntime"org seleniumhq selenium selenium htmlunit driver"testRuntime"净sourceforge htmlunit htmlunit"bootRun jvmArgs'始终启用Dspring输出和ANSI输出'addResources资产最小化minifyCsscodenarc工具版本'0.27.0'configFile文件"${项目projectDir}配置Codenarc规则"reportFormat'html'
}
1 对于本指南,我们使用GORM Hibernate实现

DynamicFinder服务

下一个服务使用GORM动态查找器获得成绩超过门槛的学生名单

grails应用程序服务grails模拟基础StudentService groovy
365bet地区模拟基础 grails编译器365bet地区CompileStatic
 交易事务

365bet地区CompileStatic
交易性只读)
 学生服务 {

    清单findStudentsWithGradeAbove大十进制年级学生findAllByGradeGreaterThanEquals年级

休眠规范

我们将在的帮助下对动态取景器使用单元测试休眠规范365bet地区它允许在365bet地区单元测试中使用Hibernate。在内存数据库中使用H

src测试groovy grails模拟基础StudentServiceSpec groovy
365bet地区模拟基础 grails测试休眠HibernateSpec
 免费测试服务ServiceUnitTest

禁止警告(['方法名称', 'DuplicateNumberLiteral'])
 学生服务规格 延伸休眠规范实施ServiceUnitTest {

    清单<getDomainClasses学生(1)
    定义 '测试找到成绩以上的学生'() {
        什么时候: '学生已经存储在数据库中'学生全部保存学生: '紧张', 年级: 91),
            学生: '塞尔吉奥', 年级: 95),
            学生: '杰夫', 年级: 93),
        )

        然后学生人数3

        什么时候: '服务被称为搜索'
        清单学生服务findStudentsWithGradeAbove92)

        然后: '发现学生具有适当的成绩'学生人数2学生们0那么'塞尔吉奥'学生们0年级95学生们1那么'杰夫'学生们1年级93
    }
}
1 测试一组有限的域类覆盖getDomainClasses方法并确切指定您要测试的
2 如果被测服务使用交易性您将需要在单元测试的设置方法中分配事务管理器

投影查询

下一项服务使用带有投影的Criteria查询来计算由其老师姓名标识的教室中所录取学生的平均成绩

grails应用程序服务grails模拟基础ClassroomService groovy
365bet地区模拟基础 交易事务
 常规转换CompileStatic

静态编译
交易性只读)
 课堂服务 {

    大十进制computeAvgGradeTeacherName课堂老师的平均名额'年级'得到 大十进制
    }
}

服务集成测试

我们可以使用单元测试对项目查询进行单元测试,请参见

src测试groovy grails模拟基础ClassroomServiceSpec groovy

但是,您可能要使用集成测试,例如,可能要针对生产中使用的同一数据库测试查询

只需使用自动接线将您的服务注入集成测试,如下所示

src集成测试groovy grails模拟基础ClassroomServiceIntegrationSpec groovy
365bet地区模拟基础 grails测试mixin集成集成
 grails交易回滚
 org springframework bean工厂注释自动装配
 spock lang规格

禁止警告('方法名称')
回滚
积分
 ClassroomServiceIntegrationSpec 延伸规格自动接线课堂服务虚空 '测试计算教室的平均成绩'() {
        什么时候:
        定义课堂课堂老师: '史密斯')
        [
                [: '紧张', 年级: 91],
                [: '塞尔吉奥', 年级: 95],
                [: '杰夫', 年级: 93每个教室addToStudents学生: 那么年级: 年级课堂保存然后教室人数1学生人数3

        什么时候:
        大十进制avgGrade服务calculateAvgGrade'史密斯')

        然后avgGrade93.0
    }
}

合作者服务

我们有一个服务,该服务与另一个服务协作以执行操作。这是一个常见的用例。我们将学习如何模拟协作者以单独测试服务逻辑

grails应用程序服务grails模拟基础ClassroomGradesNotificationService groovy
365bet地区模拟基础 常规转换CompileStatic

静态编译
 ClassroomGradesNotificationServiceEmailService emailService整型emailClassroom学生教室教室整型emailCount0
        对于学生学生课堂学生定义电子邮件emailFromTeacherToStudent课堂老师学生的emailcountCount emailService sendEmail email emailCountemailFromTeacherToStudent老师学生学生: "${学生姓名}",
                : "${老师}",
                注意: "等级是${学生成绩}",
        ]
    }
}
grails应用程序服务grails模拟基础EmailService groovy
365bet地区模拟基础 常规转换CompileStatic
 groovy util日志记录Slf j

自我
静态编译
 电邮服务 {

    整型sendEmail消息日志信息"发送电子邮件${信息}"
        1
    }
}

与模拟合作者一起测试电子邮件

Spock框架提供了模拟协作者的能力。我们能够用模拟实现来替换服务中的依赖项。这具有以下优点:着重于测试中的功能,同时将依赖功能委派给模拟对象。此外,可以验证模拟协作者查看它们被调用了多少次以及正在发送哪些参数

实施代码以与模拟协作者测试电子邮件本质上,我们想验证每个电子邮件服务是否均已调用学生在一个课堂.

src测试groovy grails模拟基础课程ClassroomGradesNotificationServiceSpec groovy
365bet地区模拟基础 grails测试gorm DataTest
 免费测试服务ServiceUnitTest
 spock lang共享
 spock lang规格

禁止警告('方法名称')
 ClassroomGradesNotificationServiceSpec 延伸规格实施数据测试ServiceUnitTest {

    共享教室教室定义 setupSpec() { (1)模拟域学生模拟域课堂定义 设定课堂课堂老师: '史密斯')
        [
                [: '紧张', 年级: 91],
                [: '塞尔吉奥', 年级: 95],
                [: '杰夫', 年级: 93每个教室addToStudents学生: 那么年级: 年级虚空 '用模拟协作者测试电子邮件学生'() {
        给定: '学生是教室的一部分'
        定义模拟服务模拟电子邮件服务(2)服务emailService模拟服务(3)

        什么时候: '服务被称为通过电子邮件发送给学生'
        整型emailCount服务emailClassroom学生教室(4)

        然后:
        1模拟服务sendEmail: '塞尔吉奥', : '史密斯', 注意: '等级是']) >> 1 (5)
        1模拟服务sendEmail: '紧张', : '史密斯', 注意: '等级是']) >> 1
        1模拟服务sendEmail: '杰夫', : '史密斯', 注意: '等级是']) >> 1emailCount3
    }

}
1 模拟域类
2 实例化的模拟实现电邮服务.
3 将模拟注入服务
4 调用正在测试的服务,该服务现在具有的模拟实现电邮服务.
5 使用spock语法验证调用参数并返回值

在里面然后子句,我们使用spock来验证模拟被称为With1 *这确实被称为一次。定义的参数验证执行期间传递的内容。>> 1在返回的地方提供模拟存根功能

本质上,我们正在验证模拟被称为三个不同的时间,不同的时间学生参数

摘要

总结本指南,我们了解了

  • 要使用GORM代码对Service的方法进行单元测试,请使用休眠规范.

  • 要为服务创建集成测试,请使用自动接线.

  • Spock可以完成模拟服务嘲笑方法它遵循宽大的模拟原则,并具有一系列功能

运行应用程序

运行测试

grailsw grails测试应用程序grails打开测试报告

要么

Gradlew测试