我是靠谱客的博主 不安黑米,最近开发中收集的这篇文章主要介绍gradle exclude_Gradle学习记录020 java工程的测试 part1详细学习如何用Gradle测试java工程。第二部分。该学习记录基于Gradle官方网站资料。本篇参考链接如下:基础测试的执行测试的过滤测试结果报告查找需要执行的测试类一个完整的利用Gradle和junit进行测试的示例,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

详细学习如何用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

最后

以上就是不安黑米为你收集整理的gradle exclude_Gradle学习记录020 java工程的测试 part1详细学习如何用Gradle测试java工程。第二部分。该学习记录基于Gradle官方网站资料。本篇参考链接如下:基础测试的执行测试的过滤测试结果报告查找需要执行的测试类一个完整的利用Gradle和junit进行测试的示例的全部内容,希望文章能够帮你解决gradle exclude_Gradle学习记录020 java工程的测试 part1详细学习如何用Gradle测试java工程。第二部分。该学习记录基于Gradle官方网站资料。本篇参考链接如下:基础测试的执行测试的过滤测试结果报告查找需要执行的测试类一个完整的利用Gradle和junit进行测试的示例所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(24)

评论列表共有 0 条评论

立即
投稿
返回
顶部