gradle exclude_Gradle学习记录020 java工程的测试 part1

详细学习如何用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进行测试的示例

目录构成

9e38198ef740ceb1547d495ba3f77719.png

测试代码类示例

示例中的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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值