问题描述
- 在项目根目录下使用
./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 并没有找到满足条件的测试类。
- junit:是一种用来做单元测试的框架,特点就是:
-
Q2:那么对于gradle test指令运行junit5和junit4有什么区别呢?
-
A2:
- gradle运行junit4:
- 只需要加上依赖包
testCompile 'junit:junit:4.12'
即可运行测试
- 只需要加上依赖包
-
但是junit5的测试运行就完全不一样了,junit5的基础架构如下图
image.png
- gradle运行junit4:
由上图可知,为了在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平台上触发测试
image.png
- 项目中必须引入Junit Jupiter,因此需要加依赖包
-
Q5:最后junit5提供了使得log结果清晰明了的方式:
-
A5:
image.pngjunitPlatform { 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' } //保证测试的显示可以类似于一棵树
网友评论