Gradle管理Java项目,标准项目布局仅定义了一个测试目录( src / test ),如果将集成测试添加到与单元测试相同的目录中。 这是一个糟糕的主意,因为集成测试通常比单元测试慢很多,使用这种方法反馈回路的长度比单元测试要长得多。另外我们也可以创建一个新项目,并将集成测试添加到该项目中。它迫使我们将项目转换为多项目构建,在多项目构建中如果按业务划分额外加入了过多的集成测试无疑将项目管理搞得十分复杂,所以我们需要一种更好的方法。
Gradle配置集成测试的方法(来自于网上的思路)
- 集成测试和单元测试必须具有不同的源目录。 src / dbtest / java目录必须包含我们的集成测试的源代码,而src / test / java目录必须包含我们的单元测试的源代码。
- 集成测试和单元测试必须具有单独的资源目录。 src / dbtest / resources目录必须包含我们的集成测试的资源。 src / test / resources目录必须包含我们的单元测试的资源。
- 我们必须能够为集成测试配置编译时和运行时依赖项。
- 我们必须能够运行我们的单元测试或集成测试。
- 我们必须能够运行所有测试。
- 如果集成测试失败,我们的构建也必须失败。
- 集成测试和单元测试必须具有单独HTML报告。
配置我们的集成测试的源目录和资源目录
我们可以使用sourceSets构建脚本块将新的源和资源目录添加到Gradle构建中。 有了这些信息,我们可以按照以下步骤配置集成测试的源目录和资源目录:
- 创建一个名为dbtest的新源集。
- 确保将主要和测试源集的输出添加到编译时类路径中。
- 确保将主要和测试源集的输出添加到运行时类路径。
- 将集成测试的源目录设置为src / dbtest / java 。
- 将集成测试的资源目录设置为src / dbtest / resources 。
完成后,在存储库构建脚本块之后,我们的build.gradle文件应具有以下sourceSets构建脚本块:
subprojects { ... ... sourceSets { dbtest { java { compileClasspath += main.output + test.output runtimeClasspath += main.output + test.output srcDir file('src/dbtest/java') } resources.srcDir file('src/dbtest/resources') } }
Gradle比Maven的方便之处就是可以自定义项目的布局,经过上面的定义后在每个子项目src下都可以建立dbtest目录,其中保存我们用于集成测试的源代码和相关资源。但是在IntelliJ IDEA集成开发环境中使用创建测试类时却只能找到test目录,并没有将dbtest当作测试目录来使用。实际上当在sourceSets中定义新的目录结构IDEA集成开发环境将其识别为Sources Root而不是Test Sources Root。如何将dbtest标记为Sources Test Root,需要Gradle引入idea插件并进行如下配置:
subprojects { apply plugin: 'idea' ...... idea { module { testSourceDirs += file('src/dbtest/java') } }
创建运行我们的集成测试的任务
在创建了我们自己的测试代码布局之后,我们建立的集成测试就不再和test任务一起在build的时候编译和运行了,毕竟这类测试的开销比较大,为了运行这个集成测试的任务,我们需要定义自己的集成测试任务,我们按如下方式定义:
- 创建一个名为dbtest的新任务,并将其类型设置为Test 。
- 配置已编译测试类的位置。
- 配置运行我们的集成测试时使用的类路径。
在build.gradle中的定义的代码如下所示:
task dbtest(type: Test) { testClassesDirs = sourceSets.dbtest.output.classesDirs classpath = sourceSets.dbtest.runtimeClasspath }
这里需要注意的是,在网上的参考文章和我们使用的方式是一样的,我们也正是参考了这些内容(参考链接在文章结尾),但由于Gradle版本的问题,在Gradle 5之前的版本其定义的属性是testClassesDir,而在Gradle 5以后的版本变成了复数testClassesDirs, 我们Gradle使用的7.1版本。
这样定义的任务可以在Gradle的other分类下找到,不会也build过程一起编译和运行,如果想要上面的dbtest任务参与到build的构建过程中,还需要在build.gradle中加入下面的代码:
check.dependsOn dbtest dbtest.mustRunAfter test
这样集成测试dbtest会在检查任务之前运行,并且如果集成测试dbest失败,则检查任务会使构建失败。另外就是确保在集成测试之前运行我们的单元测试。 即使我们的集成测试失败,这也可以确保我们的单元测试得以运行。
参考文章:
https://blog.csdn.net/cunfen0516/article/details/112550588 gradle_Gradle入门:集成测试
标签:集成,src,数据库,单元测试,Gradle,测试,dbtest From: https://www.cnblogs.com/xupeixuan/p/17052341.html