365bet地区使用Slf j测试进行365bet地区模拟记录

365bet地区在本指南中,我们将学习如何在365bet地区中模拟和验证日志语句

s尼拉夫·埃萨(Nirav Essar)

365bet地区版本 3.3.5

365bet地区培训

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

入门

365bet地区在本指南中,您将学习如何在365bet地区应用程序中模拟日志记录并验证日志事件,方法是使用Slf ​​j检验图书馆

您将需要什么

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

  • 花些时间在你手上

  • 体面的文本编辑器或IDE

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

如何完成指南

要开始,请执行以下操作

要么

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

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

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

要完成指南,请转到初始

  • 光盘进入grails指南grails模拟日志记录slf j测试初始

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

您可以直接前往完成的例子如果你光盘进入grails指南grails模拟日志记录slf j测试完成

编写申请

我们将使用日志记录编写一个简单的应用程序。对于一个简单的概念,我们将创建一个具有的域对象该应用程序将根据年龄记录对人的友好建议。通过这个人为的示例,我们将开发测试以验证是否发生了正确的记录事件

首先,我们将应用程序配置为仅记录与练习有关的项目logback groovy删除文件底部的行根错误STDOUT然后添加以下代码片段,这将激活软件包中的记录器例子.

365bet地区应用程序配置会议日志回切
日志"例子"调试'标准输出'])

人员域和数据服务

我们将创建一个Domain类具有属性.

grails创建域类Person

编辑课程以这样结束

grails应用程序域示例grails Person groovy
例子 常规转换CompileStatic

静态编译
  {
    整数toString"那么$年龄$"
    }
}

为了创建并找到学生,我们将使用GORM数据服务365bet地区它会自动实现一个接口以提供数据访问逻辑,可以将其注入到另一个365bet地区工件中,例如Controller

grails应用程序服务示例grails PersonDataService groovy
例子 grails gorm services服务

服务接口PersonDataService人员findPerson名称人savePerson那么整数年龄

创建一个人

让我们实施功能来创建一个我们可以注入个人服务变成一个人控制器保存一个人成功保存后,会记录一条消息;保存失败时,请捕获异常并记录一条错误消息。静态脚手架人为了快速UI的方便而连接到控制器

grails应用程序控制器示例grails PersonController groovy
例子 验证ValidationException
 常规转换CompileStatic

静态编译
 人控制器 {

    静态的支架Person PersonDataService personDataService定义 createPerson(那么整数年龄人员人员personDataService savePerson名称年龄日志信息"人已成功保存${}"回应人: ''
        } 抓住ValidationException e日志错误"保存时发生错误"重新导向行动: "指数"
        }
    }
}

向某人提供建议

人控制器它将根据传入的名称提供建议。此方法将首先通过名称查找一个人,然后使用一个称为POGO的普通旧Groovy对象年龄顾问用于记录友好的建议

grails应用程序控制器示例grails PersonController groovy
    定义 offerAdvice(名称AgeAdvisor ageAdvisorAgeAdvisor人员人员人员人员数据服务查找人员姓名如果人年龄顾问报价年龄顾问人年龄其他记录错误"没有名字的人${}发现"重新导向行动: "指数"
    }

POGO简单易用自我groovy注释建立记录器

src main groovy示例grails AgeAdvisor groovy
例子 常规转换CompileStatic
 groovy util日志记录Slf j

自我 (1)
静态编译
 年龄顾问 {

    虚空offerAgeAdvice整数年龄如果年龄 0..<30日志信息"你是一个年轻而充满活力的人"日志信息"丰满你的生活")
        } 其他 如果 (30年龄日志警告"从这里下山都不好意思")
        }
    }
}
1 注意自我365bet地区注解这对于POGO来说是必需的,因为只有365bet地区人工制品才由365bet地区框架注入了记录器

使用Slf j测试进行模拟记录

Slf ​​j检验是Slf j的一种测试实现,它将日志消息存储在内存中,并提供检索消息以进行验证的方法。它基本上是一种替代实现,应该是测试类路径上的唯一实现。要实现这一点,请声明依赖项,并从中排除Logback依赖项testCompile构建阶段

建立gradle
依赖项testCompile'英国组织Lidalia SLF J测试'
}
建立gradle
配置testCompile排除: 'ch qos登录', 模组: '经典logback'
}

此外,我们将使用RestBuilder的用于测试在下面添加此依赖项

建立gradle
依赖项testCompile"组织grails grails数据存储区其余客户端"
}

验证控制器中的日志

365bet地区我们可以使用Slf j Test来验证Controller中是否发生了日志事件。我们将创建365bet地区集成测试,以便自动注入数据服务,而无需担心模拟。我们将使用RestBuilder的通过HTTP与控制器方法进行交互

每次测试的过程都很简单

  1. 访问测试记录器

  2. 调用功能

  3. 使用测试记录器检索事件

  4. 根据情况验证事件

src集成测试groovy示例grails PersonControllerIntSpec groovy
例子 com google common收集ImmutableList
 grails gorm事务回滚
 grails插件rest client RestBuilder
 grails插件其余客户端RestResponse
 grails测试mixin集成集成
 spock lang共享
 spock lang规格
 英国组织Lidalia slf jext级别
 英国org lidalia slf jtest LoggingEvent
 英国org lidalia slf jtest TestLogger
 英国org lidalia slf jtest TestLoggerFactory

积分
回滚
 PersonControllerIntSpec 延伸规格共享TestLogger personControllerLogger TestLoggerFactory getTestLogger"示例grails PersonController") (1)
    共享RestBuilder的休息RestBuilder的定义 清理TestLoggerFactory clearAll(2)
    }

    虚空 "测试创建人成功日志"() {
        什么时候:"一个人被创造"RestResponse响应休息获取"HTTP本地主机${服务器端口}创建人姓名Nirav年龄"不可变列表loggingEvents personControllerLogger getAllLoggingEvents(3)

        然后: "检查记录事件"状态200loggingEvents大小1 (4)loggingEvents0信息"保存成功的人名称Nirav age" (5)loggingEvents0水平水平信息
1 从中检索测试记录器TestLoggerFactory通过使用记录器名称
2 清除测试之间的内存日志事件
3 检索日志事件,以便我们对其进行验证
4 声明日志记录事件的大小
5 验证消息并随后验证日志级别

验证更多日志

再添加两个测试以覆盖其他场景

src集成测试groovy示例grails PersonControllerIntSpec groovy
    虚空 "测试创建人日志失败"() {
        什么时候:"创建了一个人但是输入错误"RestResponse响应休息获得"HTTP本地主机${服务器端口}创建人姓名Bob年龄20"不可变列表loggingEvents personControllerLogger getAllLoggingEvents然后: "检查记录事件"状态200loggingEvents大小1loggingEvents0信息"保存时发生错误"loggingEvents0水平水平错误虚空 "测试报价给老人的建议"() {
        给定: "一个人已经被创建"RestResponse响应休息获得"HTTP本地主机${服务器端口}创建人姓名John age"TestLogger ageAdvisorLogger TestLoggerFactory getTestLogger"示例365bet地区 AgeAdvisor") (1)

        什么时候:"我们寻求建议"休息休息"HTTP本地主机${服务器端口}人员报价顾问名称John"不可变列表loggingEvents ageAdvisorLogger getAllLoggingEvents然后: "检查记录事件"状态200loggingEvents大小1loggingEvents0信息"从这里下山都不好意思"loggingEvents0水平水平警告
1 请注意,我们正在访问记录器示例365bet地区 AgeAdvisor工厂能够访问任何记录器以验证活动

验证Groovy POGO中的日志

Slf ​​j Test以相同的方式处理POGO对象年龄顾问回忆记录器是与Slf ​​J注解这不会改变验证日志事件的方法

src测试groovy示例grails AgeAdvisorSpec groovy
例子 com google common收集ImmutableList
 示例365bet地区 AgeAdvisor
 spock lang共享
 spock lang规格
 英国组织Lidalia slf jext级别
 英国org lidalia slf jtest LoggingEvent
 英国org lidalia slf jtest TestLogger
 英国org lidalia slf jtest TestLoggerFactory

 AgeAdvisorSpec 延伸规格共享AgeAdvisor ageAdvisor年龄顾问共享TestLogger记录器TestLoggerFactory getTestLogger"示例365bet地区 AgeAdvisor") (1)

    定义 清理TestLoggerFactory清除虚空 "验证年轻日志"() {

        什么时候: "方法被调用"ageAdvisor offerAgeAdvice15不可变列表loggingEvents记录器getLoggingEvents然后: "检查记录事件"loggingEvents大小2 (2)loggingEvents0信息"你是一个年轻而充满活力的人"loggingEvents0水平水平INFO记录事件1信息"丰满你的生活"loggingEvents1水平水平信息虚空 "验证老年日志"() {

        什么时候: "方法被调用"ageAdvisor offerAgeAdvice31不可变列表loggingEvents记录器getLoggingEvents然后: "检查记录事件"loggingEvents大小1loggingEvents0信息"从这里下山都不好意思"loggingEvents0水平水平警告
1 在使用的POGO中自我注释,我们只是以相同的方式检索记录器
2 请注意,我们能够验证多个日志事件

运行应用程序

要运行该应用程序,请使用gradlew bootRun命令将在端口上启动应用程序

要运行测试,请使用gradlew检查.

帮助365bet地区

365bet地区服务:

免费咨询

OCI 365bet地区团队包括365bet地区联合创始人检查我们的并向发展和维护365bet地区的工程师学习

Grails OCI团队