详细学习如何用Gradle测试java工程。第二部分。该学习记录基于Gradle官方网站资料。本篇参考链接如下:

https://docs.gradle.org/current/userguide/java_testing.html

基础

Gradle中所有的测试都围绕这Test类型。它可以使用多种测试用类库比如junit,TestNG。

并且可以自动校对结果。将校对结果通过TestReport类型的任务输出。

Test类型的任务需要知道一下两方面的信息:

  • 测试代码的编译结果在什么地方保存(property: Test.getTestClassesDirs())
  • 测试运行时需要参照的classpath(property: Test.getClasspath())

java插件引入了

  • 名字为test的source set指定测试代码所在文件夹
  • 名字为test的Test类型任务来执行测试
  • 名字为testImplementation和testRuntimeOnly的配置来指定依赖

利用以上任务及配置之后,我们只需要对test任务进行一些设定就可以执行测试。如下:

dependencies { testImplementation 'junit:junit:4.12'}test { // 告诉test任务,测试使用的使junit引擎 useJUnit() // 将堆的大小的最大值设定为1G maxHeapSize = '1G'}

关于如何设定test任务,后面会详细学习。如果需要自定义测试任务,可以参照上一章。

测试的执行

Gradle使用另外的JVM分支执行测试,独立于执行构建脚本的主分。这样可以避免classpath的冲突。

既然是独立的JVM分支,那么可以设定自己的参数,而不会对主分支产生影响。下面是一些测试任务的设定

※官网给出的设定示例很不使用。所以笔者使用了Test类型的Javadoc中的例子

// 引入java插件,可以直接使用test任务apply plugin: 'java' // test任务用于执行测试test { // 告诉Gradle使用TestNG进行测试,不指定会默认junit4 useTestNG() // 告诉Gradle使用junitPlatform进行测试。就是junit5 useJUnitPlatform() // 设置系统参数 systemProperty 'some.prop', 'value' // 包含某些文件夹下的测试 include 'org/foo/**' // 除外某些文件夹下的测试 exclude 'org/boo/**' // 在控制台输出测试的标准结果或者错误 testLogging.showStandardStreams = true // 为JVM设定堆的大小 minHeapSize = "128m" maxHeapSize = "512m" // 给JVM传递参数 jvmArgs '-XX:MaxPermSize=256m' // 使用测试的声明周期方法,beforeTest在所有测试的执行前都会执行 beforeTest { descriptor -> logger.lifecycle("Running test: " + descriptor) } // 测试出现错误则中断所有测试 failFast = true // 监听标准输出和错误 onOutput { descriptor, event -> logger.lifecycle("Test: " + descriptor + " produced standard out/err: " + event.message ) }}

更多的设定可参照如下链接

https://docs.gradle.org/current/dsl/org.gradle.api.tasks.testing.Test.html

测试的过滤

Gradle提供了两种方法来过滤测试

  • 过滤器(推荐)
  • 使用inlusion/exclusion

使用过滤器可以通过如下条件来过滤测试

  • 使用测试类的全名,或者测试方法的全名
  • 一个简单的以大写字母开头的类名
  • 星号(*)

下面的示例简单展示了过滤器的使用

test { filter { // 包括所有方法名以UiCheck结尾的方法 includeTestsMatching "*UiCheck" // 包括所有指定包下的测试类 includeTestsMatching "org.gradle.internal.*" }}

关于过滤器的参数,可以参照

https://docs.gradle.org/current/javadoc/org/gradle/api/tasks/testing/TestFilter.html

使用--tests参数可以指定执行特定的测试比如

# 执行所有SomeTestClass中的测试方法

gradle test --tests SomeTestClass

# 执行特定的测试方法

gradle test --tests SomeTestClass.someSpecificMethod

# 执行SomeTestClass类中名字内含有someMethod的测试方法

gradle test --tests SomeTestClass.*someMethod*

测试结果报告

Test类型的任务可以生成html,xml,和原生二进制文件。一般情况下使用html较多。测试结果报告默认放在build文件夹下。

当然也可以明确指定为其他文件夹

// 指定结果报告保存目录reporting.baseDir = "my-reports"// 指定测试结果保存目录testResultsDirName = "$buildDir/my-test-results"task showDirs { doLast { logger.quiet(rootDir.toPath().relativize(project.reportsDir.toPath()).toString()) logger.quiet(rootDir.toPath().relativize(project.testResultsDir.toPath()).toString()) }}

输出:

$ gradle showDirsStarting a Gradle Daemon (subsequent builds will be faster)> Task :showDirsmy-reportsbuildmy-test-resultsBUILD SUCCESSFUL in 13s1 actionable task: 1 executedJava插件还引入了testReport任务,用来自定义html的格式等需求。subprojects { apply plugin: 'java' // 让test任务的输出结果报告功能失效 test { reports.html.enabled = false }}task testReport(type: TestReport) { // 指定报告存放目录 destinationDir = file("$buildDir/reports/allTests") // 包含所有子工程的test任务生成的报告 reportOn subprojects*.test}

查找需要执行的测试类

Gradle默认自动查找需要执行的测试类

如果使用Junit4进行测试,Gradle会按照如下规则查找测试类

  • 类继承自TestCase或者GroovyTestCase
  • 有@Runwith注解
  • 其或其父类包含具有@Test注解的方法

需要注意的是,Gradle会去查找继承树,父类在jar包内的时候,这个jar包如果包含测试类也会被执行。

如果不希望Gradle自动查找,可以将scanForTestClasses设定为false,这时只能通过includes和excluds方式。

但是使用Junit platform的时候,scanForTestClasses是不起作用的。 Gradle默认不去自动查找测试类,需要手动通过include和excludes指定。

一个完整的利用Gradle和junit进行测试的示例

目录构成

测试代码类示例

示例中的test2会抛出异常使测试非正常结束

package myjava.effective;import java.util.Optional;import org.junit.Test;public class Java8_7_Optional_Test { @Test public void test1() { // parameter can not be null Optional op = Optional.of(new Person()); Person person = op.get(); System.out.println(person); } @Test public void test2() { // construct an empty instance Optional op = Optional.empty(); System.out.println(op.get()); } @Test public void test3() { // if null then revoke empty, else revoke of Optional op = Optional.ofNullable(null); if (op.isPresent()) { System.out.println(op.get()); } // if exist then use it else create a new one Person person = op.orElse(new Person("AAAA

gradle exclude_Gradle学习记录020 java工程的测试 part1相关推荐

  1. IDL学习记录和Java调用IDL方法

    IDL学习记录和Java调用IDL方法 2018年02月06日 08:32:02 回首1949 阅读数:385更多 个人分类: 随想 版权声明:乐呵乐呵得了 https://blog.csdn.net ...

  2. java基础案例教程前4章知识点_java学习记录4 Java基础知识点

    java学习记录4 Java基础知识点 1. 注释 单行注释 使用"//"开头,后面是注释的内容 一般在要注释的语句的上面加注释 多行注释 以"/*"开头,以& ...

  3. SpringCloud学习记录(1)-父工程与子模块创建及子模块调用

    创建父工程,导入依赖 选择创建maven工程,步骤如下: 修改父工程的pom.xml,具体如下: <?xml version="1.0" encoding="UTF ...

  4. Redis学习记录之Java中的初步使用

    [html] view plain copy  redis下载地址:<span style="font-family: Arial, Helvetica, sans-serif;&qu ...

  5. 学习记录466@Java Calender类、TimeUnit类以及 ScheduledExecutorService实现定时任务

    为什么要将Calender.TimeUnit与ScheduledExecutorService一起记录呢,因为ScheduledExecutorService实现定时任务需要用到Calender.Ti ...

  6. Java学习记录:Java飞机大战进阶版(敌人有子弹、有生命、有boss、有声音、还有大招一键清屏)

    Java飞机大战 序言 一.项目需求分析 二.各个对象类的设计 加载图片类Images 抽象类FlyingObject 天空类Sky 小敌机类Airplane 大敌机类BigAirplane 侦察机类 ...

  7. 懒癌患者的学习记录之JAVA冒泡排序代码

    冒泡排序 冒泡排序基本思路: 从第零位开始,依次与后一位进行比较并将较大的往后排较小的往前排.第一次循环就会将最大的值排在最后一位,第二次循环会将第二大的值排在倒数第二位,以此类推. JAVA冒泡排序 ...

  8. (JavaSE 学习记录)Java运算符

    算术运算符注意项 如果两个操作数有一个为Long, 则结果为Long. 没有long时,结果为int.即使操作数全为short,byte,结果也是int. 如果两个操作数有一个为double,则结果为 ...

  9. 懒癌患者的学习记录之JAVA简单选择排序

    简单选择排序 简单选择排序基本思虑 1.简单来说就是找到数组中最小的放到0,第二小的放到1,以此类推. 2.首先假设第0个值为最小 3.然后从他后面的值找到比他小的,设那个值为最小,以此类推,直到最后 ...

最新文章

  1. AI一分钟 | 万达网科裁员95%高达5000余人,被爆下一步将转型AI; 英伟达放话了:研究人员放心用,不更新驱动就没啥事儿
  2. firefox兼容性问题
  3. c#快捷键(成为高手必备)
  4. Open WebRTC Toolkit实时视频分析系统
  5. 【SPOJ - TOURS 387】Travelling tours (最小费用最大流,拆点)
  6. 数据结构与算法理论概述
  7. “校园知网”5月8日冲刺计划书
  8. 浅析我对代码规范的理解
  9. cad批量打印_CAD插件——批量打印软件安装包+安装教程
  10. c语言实现fft原理,新手小白一看就会,FFT算法的原理详解
  11. java dead store_jcip Java并发编程实战源码,这本书名为《 践》有些抹杀了它的价值,其中 Develop 238万源代码下载- www.pudn.com...
  12. 深入 Parcel架构与流程
  13. 友盟用户反馈自定义UI-Android
  14. Angular JS introduce
  15. 蓝牙耳机选什么好?5款主打高性价比的蓝牙耳机推荐
  16. TCP/IP中的TTL
  17. 我们能用计算机做什么英语作文,关于计算机工作的英文作文
  18. bestcoder#86 T1~T3
  19. Redis【2022最新面试题】
  20. aws eks 快速启动和配置

热门文章

  1. matlab工具箱设置学习率_MATLAB金融工具箱:06:统计套利的机器学习2:特征工程和模型开发...
  2. error LNK2026: 模块对于 SAFESEH 映像是不安全的
  3. HTTP 中POST GET 区别
  4. 在eclipse中查看Android源代码
  5. 最优化——线性规划总结1(线性规划标准型,规范型,顶点)
  6. 一天教会三岁表弟HTML,你值得拥有
  7. mysql慢日志优化_Mysql优化-慢sql日志
  8. 手机蓝牙如何减少延时_如何使用车载蓝牙播放手机音乐的方法
  9. matlab fspeical,matlab的special函数用法
  10. Altium designer中元器件库(SCHLIB)元件引脚上文字(标号)大小及距离边缘位置设置