gradle入门_Gradle入门:集成测试

gradle入门

因为Java项目的标准项目布局仅定义了一个测试目录( src / test ),所以我们没有将集成测试添加到Gradle构建中的标准方法。

如果要使用标准项目布局,则可以使用以下选项之一将集成测试添加到Gradle构建中:

  • 我们可以将集成测试添加到与单元测试相同的目录中。 这是一个可怕的想法,因为集成测试通常比单元测试要慢得多。 如果我们决定使用这种方法,则反馈回路的长度会比应有的要长得多。
  • 我们可以创建一个新项目,并将集成测试添加到该项目中。 这没有任何意义,因为它迫使我们将项目转换为多项目构建。 另外,如果我们的项目已经是一个多项目构建,那么我们就搞砸了。 当然,我们可以将所有集成测试添加到同一项目中,也可以为每个经过测试的项目创建新的集成测试项目,但是脚踏实地的工作会比较轻松。

显然,我们需要一种更好的方法 。 这篇博客文章描述了我们如何创建满足以下要求的Gradle构建:

  • 集成测试和单元测试必须具有不同的源目录。 src / integration-test / java目录必须包含我们的集成测试的源代码,而src / test / java目录必须包含我们的单元测试的源代码。
  • 集成测试和单元测试必须具有单独的资源目录。 src / integration-test / resources目录必须包含我们的集成测试的资源。 src / test / resources目录必须包含我们的单元测试的资源。
  • 我们必须能够为集成测试配置编译时和运行时依赖项。
  • 我们必须能够运行我们的单元测试或集成测试。
  • 我们必须能够运行所有测试。
  • 如果集成测试失败,我们的构建也必须失败。
  • 集成测试和单元测试必须具有单独HTML报告。

让我们从配置集成测试的源目录和资源目录开始。

配置我们的集成测试的源目录和资源目录

我们可以使用sourceSets构建脚本块将新的源和资源目录添加到Gradle构建中。 有了这些信息,我们可以按照以下步骤配置集成测试的源目录和资源目录:

  1. 创建一个名为IntegrationTest的新源集。
  2. 确保将主要测试源集的输出添加到编译时类路径中。
  3. 确保将主要测试源集的输出添加到运行时类路径。
  4. 将集成测试的源目录设置为src / integration-test / java
  5. 将集成测试的资源目录设置为src / integration-test / resources

完成后,存储库构建脚本块之后 ,我们的build.gradle文件应具有以下sourceSets构建脚本块:

sourceSets {integrationTest {java {compileClasspath += main.output + test.outputruntimeClasspath += main.output + test.outputsrcDir file('src/integration-test/java')}resources.srcDir file('src/integration-test/resources')}
}

补充阅读:

  • 第23.2节Java插件– Gradle用户指南的源集
  • sourceSets构建脚本块的DSL参考
  • SourceSetOutput的DSL参考

当在命令提示符下运行命令: gradle properties时,我们将看到一长串项目属性。 与该博客文章相关的属性如下所示:

> gradle properties
:properties------------------------------------------------------------
Root project
------------------------------------------------------------
configurations: [configuration ':archives', configuration ':compile', configuration ':default', configuration ':integrationTestCompile', configuration ':integrationTestRuntime', configuration ':runtime', configuration ':testCompile', configuration ':testRuntime']sourceSets: 1
sources: [Java source 'main:java', JVM resources 'main:resources', Java source 'test:java', JVM resources 'test:resources', Java source 'integrationTest:java', JVM resources 'integrationTest:resources']BUILD SUCCESSFULTotal time: 3.34 secs

如我们所见,我们在Gradle构建中添加了新的源和资源目录。 有趣的是,当我们创建一个新的源集时,Java插件向我们的构建中添加了两个新的依赖项配置:

  • integrationTestCompile配置用于声明编译我们的集成测试时所需的依赖项。
  • IntegrationTestRuntime配置用于声明运行我们的集成测试所需的依赖项。 此配置包含添加到integrationTestCompile配置中的所有依赖项。

补充阅读:

  • 第23.5节Java插件– Gradle用户指南的依赖性管理

让我们继续前进,找出在这些依赖项配置对我们有用之前必须进行哪些配置更改。

配置我们的集成测试的依赖性配置

在配置集成测试的源目录和资源目录时,我们创建了一个源集,该源集创建了两个新的依赖项配置: IntegrationTestCompileIntegrationTestRuntime 。 问题在于这些配置不包含我们的单元测试的依赖项。

我们可以通过向这些配置中添加必需的依赖项来解决此问题,但是由于添加重复的配置是一个糟糕的主意,因此我们不会这样做。 相反,我们将按照以下步骤配置这些依赖项配置:

  1. 确保IntegrationTestCompile配置包含编译我们的单元测试所需的依赖项。
  2. 确保IntegrationTestRuntime配置包含运行我们的单元测试所需的依赖项。

我们可以使用配置构建脚本块进行这些更改。 换句话说,我们必须将下面代码添加到sourceSets依赖关系构建脚本块之间我们的build.gradle文件:

configurations {integrationTestCompile.extendsFrom testCompileintegrationTestRuntime.extendsFrom testRuntime
}

补充阅读:

  • Gradle用户指南的8.3节依赖项配置
  • 配置构建脚本块的DSL参考
  • ConfigurationContainer的DSL参考
  • 配置的DSL参考

现在,我们可以向这些配置添加依赖项。 例如,如果要在集成测试中使用AssertJ 3.0 ,则必须将assertj-core依赖项添加到integrationTestCompile配置中。 完成此操作后,从build.gradle文件中找到的依赖项构建脚本块如下所示:

dependencies {compile 'log4j:log4j:1.2.17'testCompile 'junit:junit:4.11'integrationTestCompile 'org.assertj:assertj-core:3.0.0'
}

补充阅读:

  • Gradle入门:依赖管理

下一步是创建运行集成测试的任务。 让我们找出如何做到这一点。

创建运行我们的集成测试的任务

我们可以按照以下步骤创建运行集成测试的任务:

  1. 创建一个名为integrationTest的新任务,并将其类型设置为Test
  2. 配置已编译测试类的位置。
  3. 配置运行我们的集成测试时使用的类路径。

通过将以下代码添加到我们的build.gradle文件中,我们可以创建和配置integrationTest任务:

task integrationTest(type: Test) {testClassesDir = sourceSets.integrationTest.output.classesDirclasspath = sourceSets.integrationTest.runtimeClasspath
}

补充阅读:

  • 第15.1节《 Gradle用户指南》中的定义任务
  • 任务的DSL参考

我们已经创建了运行集成测试的任务,但是问题是在构建过程中未调用此任务。 因为要将其包含在我们的构建中,所以我们必须遵循以下步骤:

  1. 确保集成测试在检查任务之前运行,并且如果集成测试失败,则检查任务会使构建失败。
  2. 确保在集成测试之前运行我们的单元测试。 即使我们的集成测试失败,这也可以确保我们的单元测试得以运行。

我们可以通过在build.gradle文件中添加以下几行来进行这些配置更改:

check.dependsOn integrationTest
integrationTest.mustRunAfter test

补充阅读:

  • 第23.3节Java插件– Gradle任务用户指南
  • 第15.4节为Gradle用户指南的任务添加依赖项
  • Gradle用户指南的15.5节订购任务

我们差不多完成了,但是仍然有一个问题。 我们的单元测试和集成测试将其HTML报告创建到同一报告目录。 这意味着,如果我们同时运行单元测试和集成测试,则只能看到包含集成测试的测试结果HTML报告。

通过将以下代码段添加到我们的build.gradle文件中,我们可以确保将单元测试和集成测试HTML报告创建到不同的报告目录:

tasks.withType(Test) {reports.html.destination = file("${reporting.baseDir}/${name}")
}

这不是我自己的想法。 我是从这个Stackoverflow答案中借用的,它解释了如何创建用于集成和单元测试的单独HTML报告。

在将此片段添加到build.gradle文件中之后,我们的单元测试和集成测试将使用它们自己的报告目录,这些目录将在下面进行描述:

  • build / reports / integrationTest目录包含HTML报告,该报告包含我们的集成测试的测试结果。
  • build / reports / test目录包含HTML报告,该报告包含我们的单元测试的测试结果。

我们完了! 让我们继续前进,找出如何运行测试。

运行我们的测试

现在,我们创建了一个运行集成测试的新任务,并将该任务与Gradle构建集成在一起。 我们终于准备好运行我们的单元和集成测试。 我们的Gradle构建要求指出:

  • 我们必须能够运行唯一的单元测试。
  • 我们必须只能运行集成测试。
  • 我们必须能够运行所有测试。

让我们一一满足这些要求。

首先 ,如果我们只想运行单元测试,则可以使用以下两个选项之一:

  • 我们可以通过运行以下命令来运行单元测试: gradle clean test在命令提示符处。
  • 我们可以通过运行以下命令来运行构建并排除集成测试:在命令提示符下执行gradle clean build -x integrationTest

其次 ,如果我们只想运行集成测试,则可以选择以下选项之一:

  • 我们可以通过运行以下命令来运行集成测试: gradle clean IntegrationTest -x在命令提示符下进行测试
  • 我们可以通过运行以下命令来运行构建并排除单元测试: gradle clean build -x test在命令提示符处。

第三 ,如果要运行所有测试,则可以选择以下两个选项之一:

  • 我们可以通过运行以下命令来运行单元测试和集成测试: gradle clean IntegrationTest在命令提示符下。
  • 我们可以通过运行以下命令来运行构建: gradle clean build在命令提示符处。

补充阅读:

  • 11.2节不包括Gradle用户用户指南的任务

让我们总结一下我们从此博客文章中学到的知识。

摘要

这篇博客文章教会了我们以下几点:

  • 如果我们向构建中添加新的源集,则Java插件会为其创建编译时间和运行时依赖项配置。
  • 我们可以使用ConfigurationextendedFrom属性来包含另一个依赖项配置的依赖项。
  • 我们可以通过创建一个新的Test任务,并配置集成测试类和使用的类路径的位置来创建一个运行集成测试的任务。
  • 我们可以向任务添加依赖项,并配置调用任务的顺序。
  • 我们可以使用-x命令行选项排除任务。
  • PS:您可以从Github获得此博客文章的示例应用程序 。

如果您想学习如何使用Gradle,则应该看一下我的Gradle教程 。

翻译自: https://www.javacodegeeks.com/2015/05/getting-started-with-gradle-integration-testing.html

gradle入门

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/337594.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

老兵精讲:高质量C语言编程的10条规范

点击蓝字关注我们C语言编码规范10条分享给大家,还是可以规避掉很多bug的!1、最重要的规则编写代码时最重要的一条规则是:检查周围的代码并尝试模仿它。作为维护人员,如果收到的补丁明显与周围代码的编码风格不同,这是令…

认识计算机系统反思,《计算机系统组成》教学反思

第1篇:《计算机系统组成》教学反思《计算机系统组成》—计算机硬件和软件知识一课是七年级信息技术中《信息技术基础》里的知识。在学习这之前,学生虽然都使用过计算机,但对于计算机的系统组成、主机内的硬件知识基本知之甚少。但是对这些知识…

springboot需要tomcat服务器吗_SpringBoot学习(二):内嵌服务器引擎(Tomcat,Jetty)实现原理...

概述SpringBoot使用main方法启动的一个重要特性是,不需要打包成war部署到Tomcat这种Servlet容器中,而是只需打包成jar,然后通过java或mvn等命令运行这个jar包,然后应用就可以在指定的端口监听客户端的连接请求了。在SpringBoot内部…

java8 函数式编程_使用Javaslang进行Java 8中的函数式编程

java8 函数式编程我们非常高兴地在jOOQ博客上宣布一个客座帖子,该帖子由HSH Nordbank的高级软件工程师Daniel Dietrich (三人的丈夫和父亲)撰写。 他目前作为项目负责人和首席开发人员为金融产品创建定价框架。 除工作外,他还对编…

while(1) 和 for(;;)有什么区别?

点击蓝字关注我们有粉丝问了类似这样的问题:while(1) 和 for(;;)它们不都是无限循环吗,作用应该一样啊,它们到底有什么区别?要回答这个问题,其实你各自编写一段while(1) 和 for(;;)的代码,编译对比一下代码…

pycharm ubuntu 安装_Nvidia Jetson Xavier 安装配置(ubuntu 18.04)

0. 简介Xavier 硬件配置开发板 Interfaces1. 刷机刷机准备:Xavier 通过 USB 与主机(host,装有 ubuntu 的电脑)连接;Xavier 通过网线主机连接(直连或连到同一路由器下);Xavier 连接电…

计算机兴趣小组意义,信息技术兴趣小组开展之我见

信息技术学科有别于其他学科。多年来本人一直从事中学信息技术的教学,从简单的DOS平台教到WindowsXP操作系统。我觉得信息技术教育在当今素质教育中是多方面的。中小学信息技术课程重点在培养学生的创新精神和实践能力。但由于受到时间和设备等因素限制,在常规教学中…

C++高阶必会操作--模板元编程

点击蓝字关注我们泛型编程大家应该都很熟悉了,主要就是利用模板实现“安全的宏”,而模板元编程区别于我们所知道的泛型编程,它是一种较为复杂的模板,属于C的高阶操作了,它最主要的优点就在于把计算过程提前到编译期&am…

jdbc如何插入clob_让我们回顾一下如何通过JDBC插入Clob或Blob

jdbc如何插入clobLOB是所有数据库以及JDBC中的PITA。 正确处理它们需要花费几行代码,并且可以确保最终会出错。 因为您必须考虑以下几点: 首先,LOB是繁重的资源,需要特殊的生命周期管理。 分配LOB后,最好也“释放”它…

怎样做远程计算机控制系统,qq远程控制,怎样进行远程控制制作步骤

怎样设置qq远程控制?qq上有一个远程协助不少人都用过,但是这个远程小编建议不是认识的朋友,不要随便开放,很容易被窃取电脑资料,如果是不是很信得过有人,在申请协助时一定要自己盯着电脑,以防别…

pcl中ransac提取直线_复杂场景中的一个图像配准思路

在很多时候,我们可能需要使用到图像的识别与配准工作,来判断某个特征或者是划出某个特定特征的位置。现在的深度学习已经能够比较好地解决这个问题,比如常见的YOLO,可以利用几行设定代码就能够划出所需要识别的位置。但是精准度可…

js中使用camel框架_使用Fabric8在Kubernetes中使用Camel和CDI

js中使用camel框架序幕 我最近在博客上发表了使用CDI注入Kubernetes服务的信息 。 在本文中,我将更进一步,将Apache Camel带入图片。 因此,我将使用Camel的CDI支持来连接我的组件和路由,以及Fabric8的CDI扩展来自动将Kubernetes服…

程序员必知的10个C语言技巧

点击蓝字关注我们硬件设计师最常见的工作内容,就是通过写代码来测试硬件。这10个C语言技巧(C语言仍然是常见的选择)可以帮助设计师避免因基础性错误而导致某些缺陷的产生,并造成维护方面的困扰。为了成功的推出一个产品&#xff0…

一万字详解C语言中长度为零的数组

点击蓝字关注我们零长度数组概念:众所周知, GNU/GCC 在标准的 C/C 基础上做了有实用性的扩展, 零长度数组(Arrays of Length Zero) 就是其中一个知名的扩展.多数情况下, 其应用在变长数组中, 其定义如下:struct Packet {int state…

计算机网络自顶向下方法实验报告,计算机网络自顶向下方法试验三报告.doc

计算机网络自顶向下方法试验三报告陕西师范大学 计算机网络 实验报告年级: 2010级 姓名: 陈翠萍    学号:实验日期: 2012.9.24实验名称:Wireshark Lab: HTTP1至7题总的截图:1. Is your browser runnin…

app访问java web_Java Web App体系结构

app访问java web我曾经利用Servlet,JSP,JAX-RS,Spring框架,Play框架,带有Facelets的JSF和一些Spark框架。 以我的拙见,所有这些解决方案都远非面向对象和优雅的。 它们都充满了静态方法,不可测试…

电路中滤波电容和退耦电容_详解电源滤波电路中的高频滤波电容电路

图2-12所示是电源滤波电路中的高频滤波电路。电路中,一个容量很大的电解电容C1(2200F)与一个容量很小的电容C2(0.01F)并联,C2是高频滤波电容,用来进行高频成分的滤波,这种一大一小两个电容相并联的电路在电源电路中十分常见。1.高…

计算机驱动空间不够,Win8.1系统如何释放驱动器空间解决可用空间不足问题

现在越来越多用户安装升级win8.1系统,在操作使用过程中难免遇到一些奇奇怪怪的问题。相信有很多win8.1系统用户会遇到电脑的可用空间不足的提示,用户感到很疑惑,自己的电脑又没装什么软件怎么会这么提示。有什么办法可以解决此问题&#xff0…

python编程入门单例_Python单例模式实例详解

本文实例讲述了Python单例模式。分享给大家供大家参考,具体如下: 单例模式:保证一个类仅有一个实例,并提供一个访问他的全局访问点。 实现某个类只有一个实例的途径: 1,让一个全局变量使得一个对象被访问&a…

java 8入门与实践_30个Java入门技巧和最佳实践

java 8入门与实践Java是最流行的编程语言之一-无论是Win应用程序,Web应用程序,移动,网络,消费电子产品,机顶盒设备,Java随处可见。 在Java上运行的设备超过30亿。 据Oracle称 ,正在使用50亿张J…