Java项目中使用groovy简化测试 、 java项目测试框架spock的使用教程 简介 Spock 框架是一个基于groovy语法的测试框架,由于使用groovy,所以使用起来比 junit 更加灵活...测试方法的生命周期 在junit使用时,主要用以下注解来标记测试类的方法: @Test :标记需要运行的测试方法,一个测试类中可以有多个@Test方法; @Before/@After :标记的方法,会在每个测试方法运行之前.../之后运行一次; @BeforeClass/@AfterClass :标记的方法会在测试类初始化时/销毁时运行; spock 没有使用以上的注解形式,而是测试类需要继承 Specification 父类...} } 运行结果为: ? spock测试的生命周期方法执行顺序 3....def c = calculateService.plus(a, b) then: "校验结果" c == 4 - 1 } 其中,@Share注解表示的是各个测试方法共享的一个实例
每个开发人员都明白单元测试的作用,也都知道代码覆盖率越高越好。高覆盖率的代码,相对来说出现 BUG 的概率就越低,在线上运行就越稳定,接的锅也就越少,就也不会害怕测试同事突然的关心。...: 通过添加 @Unroll 注解,spock 自动把上面的代码拆分成了 3 个独立的单测测试,分别运行,运行结果更清晰了。...上面 『 | 』 号对的这么整齐。都是我一个空格一个 TAG 按出来的。虽然语法不要求对齐,但是逼死强迫症。...再于测试代码的类上加上 @SpringBootTest 注解就可以了。...,如果运行时间超过了指定时间就算失败,这时可以使用 timeout 注解 @Timeout(value = 900, unit = TimeUnit.MILLISECONDS) def
Spock通过@RunWith注解与JUnit框架协同使用,另外,Spock也可以和Mockito(Spring Boot应用的测试——Mockito)协同使用。...,由于@Primary的存在,使得在运行测试用例时Spring Boot优先使用Mockito框架模拟出的实例。...我们这里通过@JsonBackReference注解阻止循环依赖。 分析 可以看出,通过Spock框架可以写出优雅而强大的测试代码。...查看Specification类的源码,可以发现它被@RunWith(Sputnik.class)注解修饰,这个注解是连接Spock与JUnit的桥梁。...Spock也提供了setup()和cleanup()方法,执行一些给所有测试用例使用的准备和清除动作,例如在这个例子中我们使用setup方法:(1)mock出web运行环境,可以接受http请求;(2)
也有改了原来的代码逻辑导致单元测试执行失败的;或者新增了分支逻辑,单元测试没有覆盖到的;最终随着业务的快速迭代单元测试代码越来越难以维护。...这样的单元测试对代码的质量帮助不大,更多是为了测试而测试。最后时间没少花,可效果却没有达到。...@Unroll注解,可以把每一次调用作为一个单独的测试用例运行,这样运行后的单元测试结果更加直观: 而且如果其中某行测试结果不对,Spock的错误提示信息也很详细,方便进行排查(比如我们把第1条测试用例返回的邮编改成...Spock的单元测试代码继承自Specification基类,而Specification又是基于JUnit的注解@RunWith()实现的,代码如下: PowerMock的PowerMockRunner...也是继承自JUnit,所以使用PowerMock的@PowerMockRunnerDelegate()注解,可以指定Spock的父类Sputnik去代理运行PowerMock,这样就可以在Spock里使用
spock 是通过 groovy 实现的,groovy 是一种在 jvm 下运行的动态语言,与 java 最主要的区别就在于 groovy 拥有更强的语义,编写灵活,可读性强,虽然对于编写较大的项目来说...@Unroll 注解 — 让测试结果分条展示 上图中,虽然我们运行了多个测试用例,但结果却显示在一条结果中,这样,当我们的用例中某条出错时,是难以直观的定位到的,既然是多个用例,我们预期中当然是每个用例单独占用一行结果来显示...spock 框架也提供了批量测试拆分的机制,只要在方法上加上 @Unroll 注解,多个测试用例就会在结果中被分开展示了。...@Timeout — 测试超时 在方法上添加 @Timeout 注解,可以实现测试用例超时的指定。...Mock 测试通过模拟外部调用的结果,让我们的测试程序得以继续运行,在 JUnit 中,我们需要使用 Mockit 来实现接口的 Mock,同时,Mock 的编写也较为复杂,这些在 spock 中就显得非常简单了
前面讲了Spock框架Mock对象、方法经验总结,今天分享一下Spock框架中Mock静态资源的实践经验汇总。分成「静态资源」和「混合场景」。...静态方法 Mock静态方法我们使用PowerMock结合Mockito的方案,首先在测试类增加如下注解: @RunWith(PowerMockRunner.class) @PowerMockRunnerDelegate...混合场景 当一个测试用例中,既要Mock静态方法,也要Mock对象方法,就必须使用PowerMock提供的能力。...原因之前提过,主要是因为增加了类注解之后,Spock和Mockito一的Mock对象和定义方法的功能会无法运行,这个没找到具体的文档做出区分,所以如果遇到混合场景,建议使用PowerMock进行对象的Mock...mockito-inline中,也是支持对静态类和静态方法的Mock的,但在Spock中极难使用,资料说是因为项目pom中的Spock版本与Mockito版本不一致导致的,尝试了几个组合依然无法解决,又有人言
在spring环境中使用spock,也就是要自动注入被测试的实例,不需要我们手动初始化实例。...这样也就是先启动spring容器,再运行我们的测试用例,在springboot中,很容易做到这一点,甚至比junit还简单。...) where: x | y | z 9 | 8 | 1 6 | 5 | 1 3 | 3 | 0 } } 在要运行的测试类上加注解...@SpringBootTest,即可在运行这个测试类之前启动spring容器,运行完这个类所有的测试用例之后,容器会自动运行结束。...这三篇文章所有的完整测试代码都在我的gitee: https://gitee.com/yawensilence/demo-spock 。
技术方案 本技术方案基于公司力推的Spock单元测试框架,spock是一款基于Groovy语言的单元测试框架,其基础也是Java的Junit,目前最新版已经到了2.0,但对Groovy和相应的Java版本要求较高...,我把import内容也贴出来了,如果同样的代码无法运行,可以排查一下是否import正确的方法和类。...这里不是很建议import static ,因为可能出现混用以及不易排查的问题。 由于目前测试中没有遇到使用Spy放行的逻辑,所以均使用Mock模式,需要对Mock对象的方法进行模拟。...原因是在混合静态资源和非静态资源场景下,指定了PowerMock的@RunWith运行规则,不兼容Spock写法,需要用到PowerMock框架Mock对象的功能。...提供的功能,用到的注解@Shared,不加的话无法在Spock方法中进行赋值操作,但是可以当做一个普通的对象使用。
独立应用可以直接调用他们自己选择的日志框架。而对于logback来说,这个问题是没有意义的,因为logback是通过SLF4J来暴露其日志接口的。...参数化运行器的区别如下: 更明确 - 参数实在测试方法的参数中,而不是在类的字段中 更少的代码 - 你不需要用构造函数来设置参数 你可以在同一个类混合使用参数化和非参数化的方法。...极大的减少了诸如自动mock的样板,从而使测试更加易读。 可以使得测试能够根据被测试的对象上的API的改变而弹性变化。...标有@Inject注解的字段会被自动注入,不需要担心会遗忘掉它们 使得将对象连接在一起变得容易,因此你可以将一个单元测试变成集成测试的一部分 @RunWith(JukitoRunner.class) public...body内容的模式 请求验证 在单元测试里运行,但是是作为一个对立的进程或者一个WAR应用的形式 可通过流畅的Java API、JSON文件和基于HTTP的JSON进行配置 对stub的录制/回放 故障注入
独立应用可以直接调用他们自己选择的日志框架。而对于logback来说,这个问题是没有意义的,因为logback是通过SLF4J来暴露其日志接口的。...参数化运行器的区别如下: 更明确 – 参数实在测试方法的参数中,而不是在类的字段中 更少的代码 – 你不需要用构造函数来设置参数 你可以在同一个类混合使用参数化和非参数化的方法。...极大的减少了诸如自动mock的样板,从而使测试更加易读。 可以使得测试能够根据被测试的对象上的API的改变而弹性变化。...标有@Inject注解的字段会被自动注入,不需要担心会遗忘掉它们 使得将对象连接在一起变得容易,因此你可以将一个单元测试变成集成测试的一部分 @RunWith(JukitoRunner.class)public...内容的模式 请求验证 在单元测试里运行,但是是作为一个对立的进程或者一个WAR应用的形式 可通过流畅的Java API、JSON文件和基于HTTP的JSON进行配置 对stub的录制/回放 故障注入 针对每个请求的根据条件进行代理
许多Java开发人员编写在构建期间自动运行的单元测试和集成测试,主要是使用Jenkins或TeamCity 等持续集成工具。...模拟是现代单元测试的基本技术之一,因为它允许您在没有任何依赖性的情况下单独测试代码,这就是为什么我鼓励每个Java开发人员与JUnit一起学习模拟框架。...当您使用Spock时,您的测试将变得更易读并且更易于维护,并且由于其JUnit运行程序,Spock与大多数IDE,构建工具和持续集成服务器兼容。...8、Spring Test Spring MVC带有一个非常有用的测试框架,允许在不涉及Web容器的情况下进行深入测试。 它是向Spring应用程序编写自动化测试的最有用的库之一。...我还没有列入更多的库,例如AssertJ和Hamcrest,它们可以帮助你编写漂亮和流畅的测试 - 但是要慢慢来。 首先,学习一种可以在日常工作中使用的工具或库。
许多Java开发人员编写在构建期间自动运行的 单元测试和集成测试,主要是使用 Jenkins或TeamCity 等持续集成工具。...模拟是现代单元测试的基本技术之一,因为它允许您在没有任何依赖性的情况下单独测试代码,这就是为什么我鼓励每个Java开发人员学习模拟框架。...当您使用Spock时,您的测试将变得更易读并且更易于维护,并且由于其JUnit运行程序,Spock与大多数IDE,构建工具和持续集成服务器兼容。 7....Spring Test Spring MVC带有一个非常有用的测试框架,允许在不涉及 Web容器的 情况下进行深入测试。 它是向Spring应用程序编写自动化测试的最有用的库之一。...我还没有列入更多的库,例如AssertJ和Hamcrest,它们可以帮助你编写漂亮和流畅的测试 – 但是要慢慢来。 首先,学习一种可以在日常工作中使用的工具或库。
由JUnit Platform提供支持 Spock 2.0 M1的主要变化是向JUnit 5的迁移(确切地说,是使用JUnit Platform 1.5(是JUnit 5的一部分而不是JUnit 4运行器...这非常方便,因为应该在支持JUnit平台的任何地方(IDE,构建工具,质量保障工具等)自动识别并执行Spock测试。另外,平台本身提供的功能也应该也适用于Spock。...此外,所有参数化测试都会自动进行。但是,那太好了,目前还没有办法 “滚动”特定的测试,如Spock 1.x的spock-global-unroll所知。...从M1开始,当前在运行时阻止使用Groovy 3.0执行。...不幸的是,没有关于不兼容的Groovy版本的明确错误消息,只有一个非常隐秘的错误消息: Could not instantiate global transform class org.spockframework.compiler.SpockTransform
人人都说单元测试好,但是好多同学还是不愿意去写,其中一个很重要的原因就是测试代码的编写占用了太多的时间,而且测试本身也会出现bug。...虽然使用的Groovy语法,但是基本兼容Java语法,使用起来没有门槛,好东西就要分享!...Spock的特性 代码易读 易读的测试用例名字,可以使用任意字符串,比如下面中test stack 易理解的代码模块:given, when, then, expect def "test stack...创建测试用例 ? 第一个测试用例 常见问题 maven test命令并没有执行单元测试,而是提示No tests to run....:没有配置插件gmavenplus-plugin 参考 Spock Framework Reference Documentation Spock 一个优雅的Groovy/Java测试框架 Spock
Spock JUnit JUnit是一个为Java设计的开源单元测试框架,多数 Java 的开发环境都已经集成了 JUnit 作为单元测试的工具。...: 注解支持 支持多线程测试执行 支持数据驱动测试(使用@DataProvider) 官网地址:https://testng.org/ GoogleTest GoogleTest(gtest)是一个跨平台的...exe可执行程序,能直接运行 提供丰富的命令行参数 Pytest pytest是一个非常成熟的全功能的支持Python语言的自动化测试框架,也可以认为它一个测试管理框架,因为它不仅可以用来做单元测试,...Coverage.py可以指定要通过配置文件分析哪些源文件,通过分析源代码,发现没有被测试覆盖的代码 官网地址:https://coverage.readthedocs.io 单元测试用例自动生成工具...,生成的测试用例均符合Junit的标准,可直接在Junit中运行,并得到了Google和Yourkit的支持。
注解(反射):Java 里注解非常繁杂,类、方法、变量上都是,不光基础类库、Spring 框架里有很多,还可以自己定义新的注解。...用哪个方法都行,又没有一个权威指示的话,反而很难让人很难决定。...有各种框架和组件需要学习,如 web 框架 spring系列、数据库框架 mybatis、日志框架 log4j2,测试框架 spock,JVM语言 groovy 等等,每一种学习都需要花费很多时间。...经验 ---- 一个月多来,感觉自己勉强入门了,虽然还有很多东西不熟悉,甚至都没有接触过,但不再是之前的一头雾水,面对小问题也一脸茫然了。...spock 等测试框架来运行,比较灵活,像测试一样提供多个 case 运行程序; 推荐学习使用 spock,语法简洁,还可以省去不必要的打包时间,快速调试,可以在 IDE 里一键运行。
在上一次Spock实践中我们介绍了Spock的优点和Demo的搭建,今天我们继续介绍一些Spock常用的实践。...在使用Spock框架编写测试时,测试类需要继承自Specification类。...5、 Blocks 每个feature method又被划分为不同的block,不同的block处于测试执行的不同阶段,在测试运行时,各个block按照不同的顺序和规则被执行,如下图:...如果要验证有没有跑出异常,可以使用thrown ? 5.2.2 断言 要获取抛出的异常对象,可以用以下语法: ? 如果要验证没有抛出某种异常,可以用notThrown(): ?...而在spock中,通过where block可以让这类需求实现起来变得非常优雅。 ? 可以为标记@Unroll的方法声明动态的spec名。运行时,名称会被替换为实际的参数值。
独立应用可以直接调用他们自己选择的日志框架。而对于logback来说,这个问题是没有意义的,因为logback是通过SLF4J来暴露其日志接口的。...与标准的JUnit 参数化运行器的区别如下: 更明确 - 参数实在测试方法的参数中,而不是在类的字段中 更少的代码 - 你不需要用构造函数来设置参数 你可以在同一个类混合使用参数化和非参数化的方法。...标有@Inject注解的字段会被自动注入,不需要担心会遗忘掉它们 使得将对象连接在一起变得容易,因此你可以将一个单元测试变成集成测试的一部分 ?...GitHub,入门, 用户指南 Spock 企业级的测试和规范框架。 ?...GitHub, Website WireMock 用于模拟HTTP服务的工具 对HTTP响应进行打桩,可以匹配URL、header头信息和body内容的模式 请求验证 在单元测试里运行,但是是作为一个对立的进程或者一个
我们都知道 Spock 是一个单测框架,其特点是语法简明。但当我们使用 Spock 写了一堆单元测试之后,如何生成对应的单测覆盖率报告呢?...Maven 的编译阶段运行单测代码,而 JaCoCo 则是用来生成具体的单测覆盖率报告。...本文将新建一个非 Web 项目来演示如何生成 Spock 的单测覆盖率报告。 初始化项目 这里初始化项目一个普通的 Java 项目,并引入对应的 Spock 依赖,如下代码所示: 没有什么异常的话,程序会生成单测覆盖率报告文件,地址为: target/site/jacoco/index.html。...我们使用浏览器打开该文件可以浏览到单测覆盖率情况,如下图所示: 疑问 关于如何配置这两个插件的资料很多,但都运行不起来。后面我参考了官网的配置,就成功配置好了。
领取专属 10元无门槛券
手把手带您无忧上云