Junit5的基础应用
一、实验目的
1、掌握Junit5的架构;
2、掌握Junit5常用annotation的使用;
3、掌握Junit5新的应用;
4、掌握Junit5参数化测试的用法
二、实验环境(本实验的硬件和软件环境及使用仪器等)
硬件:PC电脑一台;
配置: window系统,内存大于4G 硬盘250G及以上
软件:eclipse、 jdk15
三、实验实现过程实验内容: 任务1、掌握Junit5的架构 创建文件 代码如下: package lab4; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; @DisplayName("我的第一个Junit5测试用例") public class MyFirstJunit5Test { @BeforeAll public static void init() {System.out.println("初始化数据");} @AfterAll public static void cleanup() {System.out.println("清理数据");} @BeforeEach public void tearup() {System.out.println("当前测试方法开始");} @AfterEach public void tearDown() {System.out.println("当前测试方法结束");} @DisplayName("我的第一个测试") @Test void testFirstTest() { System.out.println("我的第一个测试开始测试");} @DisplayName("我的第二个测试") @Test void testSecondTest() { System.out.println("我的第二个测试开始测试");} @DisplayName("我的第三个测试") @Disabled @Test void testThirdTest() {System.out.println("我的第三个测试开始测试");} } 实验结果如下: 运行测试套件 结果截图 任务2、掌握Junit5常用annotation的使用 创建测试套件 代码如下: package lab4; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @DisplayName("内嵌测试类") public class NestUnitTest { @BeforeEach//在每个测试执行之前执行 void init() {System.out.println("测试方法执行前准备");} @Nested//定义内嵌测试类 @DisplayName("第一个内嵌测试类")//定义用例在测试报告中的展示名称 class FirstNestTest { @Test//定义测试方法 void test1() {System.out.println("第一个内嵌测试类执行测试1");} @Test//定义测试方法 void test2() {System.out.println("第一个内嵌测试类执行测试2");} } @Nested//定义内嵌测试类 @DisplayName("第二个内嵌测试类")//定义用例在测试报告中的展示名称 class SecondNestTest { @Test//定义测试方法 void test1() {System.out.println("第二个内嵌测试类执行测试1");} @Test//定义测试方法 void test2() {System.out.println("第二个内嵌测试类执行测试2");} } } 运行测试套件 运行结果截图 任务3、Junit5新的应用 创建文件 代码如下: package lab4; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @DisplayName("内嵌测试类") public class NestUnitTest { @BeforeEach//在每个测试执行之前执行 void init() {System.out.println("测试方法执行前准备");} @Nested//定义内嵌测试类 @DisplayName("第一个内嵌测试类")//定义用例在测试报告中的展示名称 class FirstNestTest { @Test//定义测试方法 void test1() {System.out.println("第一个内嵌测试类执行测试1");} @Test//定义测试方法 void test2() {System.out.println("第一个内嵌测试类执行测试2");} } @Nested//定义内嵌测试类 @DisplayName("第二个内嵌测试类")//定义用例在测试报告中的展示名称 class SecondNestTest { @Test//定义测试方法 void test1() {System.out.println("第二个内嵌测试类执行测试1");} @Test//定义测试方法 void test2() {System.out.println("第二个内嵌测试类执行测试2");} } } package lab4; import static org.junit.jupiter.api.Assertions.*; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.DisplayName; public class AssertThrowsExceptionTest { @Test @DisplayName("测试捕获的异常") void assertThrowsException() { String str = null; //1、断言抛出异常,2,抛出IllegalArgumentException异常 Assertions.assertThrows(IllegalArgumentException.class, () -> { Integer.valueOf(str); }); } } package lab4; import java.time.Duration; import java.time.temporal.ChronoUnit; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.DisplayName; public class AssertTimeoutTest { @Test @DisplayName("超时方法测试") void test_should_complete_in_one_second() { //断言超时 Assertions.assertTimeoutPreemptively(Duration.of(1, ChronoUnit.SECONDS), () -> Thread.sleep(2000)); } } 逐一运行测试套件 实验结果截图 任务4、Junit5参数化测试 创建ParameterizedUnitTest文件 创建 输入文件名 打开该文件进行编辑 代码如下: package lab4; import static org.junit.jupiter.api.Assertions.*; import java.util.concurrent.TimeUnit; import java.util.stream.Stream; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.provider.CsvFileSource; import org.junit.jupiter.params.provider.CsvSource; import org.junit.jupiter.params.provider.EnumSource; import org.junit.jupiter.params.provider.MethodSource; import org.junit.jupiter.params.provider.NullAndEmptySource; import org.junit.jupiter.params.provider.ValueSource; public class ParameterizedUnitTest { @ParameterizedTest @ValueSource(ints = {2, 4, 8}) void testNumberShouldBeEven(int num) { Assertions.assertEquals(0, num % 2); } @ParameterizedTest @ValueSource(strings = {"Effective Java", "Code Complete", "Clean Code"}) void testPrintTitle(String title) { System.out.println(title); } @ParameterizedTest @CsvSource({"1,One", "2,Two", "3,Three"}) void testDataFromCsv(long id, String name) { System.out.printf("id: %d, name: %s", id, name); } /*@ParameterizedTest @CsvSource(value = {"1|2","3|4"},delimiter = '|') public void parameterizedCvsSourceTest(String fruit, int rank) { System.out.println(fruit); System.out.println(rank); }*/ @ParameterizedTest @CsvFileSource(resources = {"/lab4/CsvSource.csv"}) public void parameterizedCsvFileSourceTest(String id,String name){ System.out.println(id); System.out.println(name); } /*@ParameterizedTest @EnumSource(value = TimeUnit.class,mode = EnumSource.Mode.INCLUDE,names = {"DAYS","SECONDS"}) public void parameterizedEnumSourceTest(TimeUnit timeUnit){ System.out.println(timeUnit); }*/ @ParameterizedTest @EnumSource(value = TimeUnit.class,mode = EnumSource.Mode.MATCH_ANY, names = {"^(M|N).+SECONDS$","SECONDS"}) public void parameterizedEnumSourceTest1(TimeUnit timeUnit){ System.out.println(timeUnit); } /*@ParameterizedTest @MethodSource("methodSourceTestFactory") public void parameterizedMethodSourceTest(Student student){ System.out.println(student.getName()); } public static Stream<Student> methodSourceTestFactory(){ Student student = new Student("Junit5",23); Stream<Student> student1 = Stream.of(student); return student1; }*/ /*@ParameterizedTest @NullAndEmptySource //(等同于@NullSource和@EmptySource 两个) public void parameterizedNullAndEmptySourceTest(String nullSource){ System.out.println(nullSource.length()); }*/ } 实验结果如下: |
四、实验结果分析与总结实验代码量和工作量比较大,花费了大量时间完成,不断修改调试,解决报错,期间出现了无法使用测试用例的情况,折腾好久后通过重启软件解决。在运行结果时出现了和的测试结果打叉叉,暂时没有解决。 |