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

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

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

相关文章

【APICloud系列|11】使用APPuploader申请ios开发证书及ios发布证书教程

开发证书用于app测试。申请ios开发证书 发布证书用于上架。ios发布证书 我开发的APP使用APICloud,简单走一下编译的流程,然后直接上架到APP store.完整的开发,window电脑,安卓手机,苹果手机,mac电脑还是很有必要的。…

orchard mysql_如何在Orchard CMS 1.3.10中使用MySQL数据库?

您正在讨论的错误是因为DatabaseOptions属性是一个布尔值。您需要更改该属性以接受字符串值。安装控制器中有一些地方需要更改该属性的使用方式...但是,最重要的部分是实现DataServicesProvider。我将我添加到核心,但我认为你可以把它作为一个功能放在设…

UIButton-初识IOS

今天,我学到了所有app经常用到的UIButton控件,废话不多说,这些都是我学习的时候总结的一些,希望可以帮到以后的初学者,IOS初学不应该直接拖拽,感觉不易于理解,所以我总结的基本上全是纯代码编辑…

【APICloud系列|12】ios真机调试时如何添加新设备的udid?

很多开发者在真机调试测试ios应用时,会看到需要添加udid,搞不清这个是什么东西应该怎么获取。 udid就是手机的一个串号,相当于手机的身份证,具有唯一性。 下面介绍如何获取udid并添加到开发者中心后台。 有两种方式可以获取udid ios app真机调试到上架App Store完整…

python rtf转txt_将DOC、RTF格式文件批量转为TXT格式文件

Windows 下将目录下所有文件下的文件 拷贝到一个目录中:搜索"."安装python 及 win32com模块 pip install pypiwin32创建LDA_RTF_TXT.pyfrom glob import globimport shutilimport osimport warningswarnings.filterwarnings(actionignore,categoryUserWar…

记录常用工具

查看没有用过的资源 Improving Your Code with lint 转载于:https://www.cnblogs.com/a0000/p/4443712.html

UA Web挑战会议:针对初创公司的SpringIO

在本周,我在“后端”部分的UA Web挑战会议上发表了讲话。 我在演讲中选择了一个奇怪的话题-“面向初创企业的SpringIO”。 结果是什么? 我将在下面总结。 在过去三年中,我开发了各种个人Web项目。 我再也没有称它们为“初创企业”&#xff0…

前端开发必备的1个CSS框架

常言道:工欲善其事,必先利其器,项目紧,框架还是很有必要的。 1. Bootstrap 最初被称为Twitter Blueprint的Bootstrap,是作为内部团队使用的工具而创建的。它是最著名的前端框架之一。自公开发布以来,Boot…

C语言杂记1

C语言杂记 注意signed int 与 unsigned int 之间的比较,与运算因为当int 型变量为-1时很可能被升级成无符号整型,就导致取反1这种运算的产生,出现无法控制的很大的数。 malloc(strlen(str))绝对错误地语句,考虑字符串需要1. NULL …

python 小说分析_谁还没看过几本金庸小说?用Python分析一下当年最爱看的主角是谁...

jieba用起来非常简单,短短几行代码就完成了分词工作(下图),可是...仔细一看发现哪里不对了“段誉”作为一个姓名没有被单独分出来,而是和其他一些动词连在一起,另外也有一些角色名字被拆分成了两个甚至更多的单词,例如…

【APICloud系列|13】移动端适配通揽

一、为什么要移动端适配? 一般情况下设计稿的设计师按照 375 的尺寸设计,然而,在现在移动终端(就是手机)快速更新的时代,每个品牌的手机都有着不同的物理分辨率,这样就会导致,每台设备的逻辑分辨率也不尽相同,此时 375 的设计稿,如果想要还原那基本是不可能了,因为如…

初级程序员应该怎么办?

你现在工作迷茫?不防看看这几条建议 01、吃透一门编程语言 这个技能看起来似乎没有必要强调,毕竟程序员不懂一种编程语言也说不过去啊。我之所以再次强调是怕你“贪心”,以为技多不压身就拼了命的学很多种编程语言。 有个大二的学生就曾经问我:“你好呀,老哥,有个问题…

存根类 测试代码 java_有关为旧版代码创建存根的更多信息–测试技术7

存根类 测试代码 java在我的上一个博客中 ,我谈到了如何处理行为不佳的不可测试的 (1) SitePropertiesManager 类,以及如何通过提取接口来创建存根。 但是,如果由于旧类的源代码已被锁定在第三方JAR文件中而无法访问它…

skywalking使用方法_skywalking 6.2配置相关和使用

1、关于日志和项目名配置: 日志可在探针agent.config里面配置也可以在外面配置 在外面配置方式为: -javaagent:/data/path/skywalking-agent.jarlogging.file_nameagent_passport.log,logging.dir/data/applogs/skyagent/ -Dskywalking.agent.service_namepassport由于是docker…

【APICloud系列|14】xcode下载地址

下载地址:https://developer.apple.com/download/more/ 这个是使用苹果Mac下载xcode用于上架appstore打包的软件。 Windows的Xcode:在PC上安装Xcode的5种方法 参考帖子:https://blog.csdn.net/qq_36666115/article/details/86485305

kail利用msf工具对MS12-020漏洞进行渗透测试

kail利用msf工具对MS12-020漏洞进行渗透测试 MS12-020全称Microsoft Windows远程桌面协议RDP远程代码执行漏洞 kail利用msf工具对MS12-020漏洞进行渗透测试: 实验环境: 工具:metasploit 靶机两台:windows 7sp1和kali2020 攻…

float在python中的书写形式错误的是_在Python3.7.1中,编写简单的GAN时,“TypeError:”float“对象不能解释为整数”错误...

我对Python和编程是全新的。我试图编写一个简单的GAN来使用Keras数据集(参见下面的教程超链接)。我收到两个警告,然后是一个错误:TypeError: float object cannot be interpreted as an integer.任何帮助都将不胜感激。在详细信息:Python 3.7…

将25k行C#转换为Java的经验教训

由于各种原因,我最近完成了一个将复杂的财务应用程序从C#转换为Java的项目。 港口的原因大部分是非技术性的,相反,这是有关企业的一项战略举措。 这是一次有趣的经历,我在此过程中吸取了一些经验教训,可以…

Spark K-Means

K-Means(K均值) 介绍 K-Means是被应用的最广泛的基于划分的聚类算法,是一种硬聚类算法,属于典型的局域原型的目标函数聚类的代表。算法首先随机选择k个对象,每个对象初始地代表一个簇的平均值或者中心。对于剩余的每个…

【APICloud系列|30】苹果MAC电脑取消辅助功能-语音识别

方法:快捷键 “commandF5”即可。 原因是不小心出现这个辅助功能,导致我进入苹果商店输入密码不能正常切换大小写,快捷键 “commandF5”就可以正常使用