解决junit5无法使用gradle test运行测试

问题描述

  • 在项目根目录下使用./graldew test发现测试都过,但是没有运行一个测试用例
  • 测试类:
import org.junit.jupiter.api.DynamicTest;
import org.junit.jupiter.api.TestFactory;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
import static org.assertj.core.api.Java6Assertions.assertThat;
import static org.junit.jupiter.api.DynamicTest.dynamicTest;
public class AnagramsTest {
    @TestFactory
    Stream<DynamicTest> should_return_single_char_given_single_string() {
        return Stream.of("b", "i", "r", "o")
                .map(str -> dynamicTest("should_return_" + str + "_given_" + str, () -> {
                    List<String> actualList = Anagrams.calculate(str);
                    List<String> expectedList = Arrays.asList(str);
                    assertThat(actualList).isEqualTo(expectedList);
                }));
    }

    @TestFactory
    Stream<DynamicTest> should_return_list_given_string_with_two_char() {
        return Stream.of("bi", "br", "bo", "ir", "io", "ro")
                .map(str -> dynamicTest("should_return_list_with_two_element_given_" + str, () -> {
                    List<String> actualList = Anagrams.calculate(str);
                    assertThat(actualList).contains(str);
                    assertThat(actualList.size()).isEqualTo(2);
                }));
    }

    @TestFactory
    Stream<DynamicTest> should_return_list_given_string_with_three_char() {
        return Stream.of("bir")
                .map(str -> dynamicTest("should_return_list_with_two_element_given_" + str, () -> {
                    List<String> actualList = Anagrams.calculate(str);
                    assertThat(actualList).contains(str);
                    assertThat(actualList.size()).isEqualTo(6);
                }));
    }

    @TestFactory
    Stream<DynamicTest> should_return_list_given_string_with_four_char() {
        return Stream.of("biro")
                .map(str -> dynamicTest("should_return_list_with_two_element_given_" + str, () -> {
                    List<String> actualList = Anagrams.calculate(str);
                    assertThat(actualList).contains(str);
                    System.out.println(actualList);
                    assertThat(actualList.size()).isEqualTo(24);
                }));
    }}

思考

  • Q1:junit是什么?./gradlew test是如何运行测试的呢?

  • A1:

    • junit:是一种用来做单元测试的框架,特点就是:
      • 提供简单注释@Test就可以将某一个方法注释为测试方法
      • 提供丰富的断言方法进行测试
      • 提供丰富的日志
      • 提供测试运行的工具
    • gradlew test运行junit 4测试用例的方式:
      • 到默认的src/main/java目录下,先编译源代码,文件存放在build/classes/main目录下
      • 然后编译测试代码,放在build/classes/test目录下
      • 执行build/classes/test目录下满足条件的测试类:
        – 任何被@RunWith注解的子类
        – 任何至少包含一个被@Test注解的类
        – 任何继承自junit.framework.TestCase 或groovy.util.GroovyTestCase的类
    • 判断后发现:所有的测试都在src/test/java中,因此保证测试可以被编译到build/classes/main目录中。
    • 但是由于使用的是junit5所以测试用例都是使用注解@TestFactory,说明当前测试没有运行的原因就是gradle 并没有找到满足条件的测试类。
  • Q2:那么对于gradle test指令运行junit5和junit4有什么区别呢?

  • A2:

    • gradle运行junit4:
      • 只需要加上依赖包testCompile 'junit:junit:4.12'
        即可运行测试
    • 但是junit5的测试运行就完全不一样了,junit5的基础架构如下图

      《解决junit5无法使用gradle test运行测试》 image.png

由上图可知,为了在java虚拟机上运行junit5,我们需要启动Junit Platform,并且还有启动Junit ENGINE

  • Q3:如何使用gradle运行junit5的测试?
  • A3:如果测试中包含junit5的新的api比如@TestFactory那么这些api都来自于JUnit Jupiter。因此
    • 项目中必须引入Junit Jupiter,因此需要加依赖包junit-jupiter-api
    • 如果想要在平台正常使用api还必须要包含junit-jupiter-engine引擎
    • 如果想要使用gradle运行测试,那么必须加入junit-platform-gradle-plugin插件该插件提供了可以使用gradle在junit平台上触发测试
      《解决junit5无法使用gradle test运行测试》 image.png
  • Q5:最后junit5提供了使得log结果清晰明了的方式:

  • A5:

    《解决junit5无法使用gradle test运行测试》 image.png

    junitPlatform {
      details 'tree'
      } //保证测试的显示可以类似于一棵树
    

    build.gradle的配置

    buildscript {
      repositories {
          mavenCentral()
      }
      dependencies {
          classpath ("org.junit.platform:junit-platform-gradle-plugin:1.0.0-M4")
      }}
    apply plugin: 'java'
    apply plugin: 'idea'
    apply plugin: 'org.junit.platform.gradle.plugin'
    repositories {
      jcenter()
    }
    dependencies {
      testCompile 'org.assertj:assertj-core:3.9.0'
      testCompile group: 'org.mockito', name: 'mockito-core', version: '2.15.0'
    testCompile("org.junit.jupiter:junit-jupiter-api:5.0.0-M4") //提      供junit5的api
    testRuntime("org.junit.jupiter:junit-jupiter-engine:5.0.0-M4") //提供junit5 运行engine
    }
    junitPlatform {
      details 'tree'
    } //保证测试的显示可以类似于一棵树
    
    原文作者:张培_
    原文地址: https://www.jianshu.com/p/6da6c232690f
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞