[跟着官方文档学JUnit5][二][WritingTests][学习笔记]

举报
John2021 发表于 2022/04/22 06:47:11 2022/04/22
【摘要】 以下示例提供了在JUnit Jupiter中编写测试的最少要求。package com.example.util;public class Calculator { public int add(int number1, int number2) { return number1 + number2; }}package com.example;import com...

以下示例提供了在JUnit Jupiter中编写测试的最少要求。

package com.example.util;

public class Calculator {
    public int add(int number1, int number2) {
        return number1 + number2;
    }
}
package com.example;

import com.example.util.Calculator;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;

public class MyFirstJUnitJupiterTests {
    private final Calculator calculator = new Calculator();

    @Test
    void addition() {
        assertEquals(2, calculator.add(1, 1));
    }
}

1.注解总览

JUnit Jupiter支持以下用于配置测试和拓展框架的注解。除非另外说明,所有核心注解都位于org.junit.jupiter.api包中,这个包在junit-jupiter-api模块中。

注解 描述
@Test 表示这个方法为测试方法。不同于JUnit4的注解,这个注解没有声明任何属性,因为JUnit Jupiter中的测试拓展基于其自己的专用注释运行。除非被覆盖,否则将继承此类方法。
@ParameterizedTest 表明这个方法是一个参数化测试。除非被覆盖,否则将继承此类方法。
@RepeatedTest 表示方法是重复测试的测试模板。除非被覆盖,否则将继承此类方法。
@TestFactory 表示方法是动态测试的测试工厂。除非被覆盖,否则将继承此类方法。
@TestTemplate 表示方法是测试用例的模板,这些测试用例设计为根据已注册的提供程序返回的调用上下文的数据进行多次调用。
@TestClassOrder 用于为带注解的测试类中@Nested测试类配置测试类执行顺序。这个类注解将被继承
@TestMethodOrder 用于配置带注解的测试类的测试方法执行顺序;类似于JUnit4的@FixMethodOrder。此类注解将被继承
@TestInstance 用于带注解的测试类配置测试实例生命周期。这个类注解将被继承。
@DisplayName 声明测试类或测试方法的自定义显示名称。此类注解不会继承。
@DisplayNameGeneration 为测试类声明自定义显示名称生成器。此类注解将被继承。
@BeforeEach 表示注解的方法应在当前类中的每个@Test、@RepeatedTest、@ParameterizedTest或@TestFactory方法之前执行;类似JUnit4的@Before。除非被覆盖,否则将继承此类方法。
@AfterEach 表示注解的方法应在当前类中的每个@Test、@RepeatedTest、@ParameterizedTest或@TestFactory方法之后执行;类似JUnit4的@After。除非被覆盖,否则将继承此类方法。
@BeforeAll 表示注解的方法应在当前类中的所有@Test、@RepeatedTest、@ParameterizedTest和@TestFactory方法之前执行;类似于JUnit4的@BeforeClass。此类方法是继承的(除非他们被隐藏或覆盖),并且必须是静态的(除非使用"每类per-class"测试实例生命周期)
@AfterAll 表示注解的方法应在当前类中的所有@Test、@RepeatedTest、@ParameterizedTest和@TestFactory方法之后执行;类似于JUnit4的@AfterClass。此类方法是继承的(除非他们被隐藏或覆盖),并且必须是静态的(除非使用"每类per-class"测试实例生命周期)
@Nested 表示带注解的类是非静态嵌套测试类。除非使用"每类per-class"测试实例生命周期,否则不能直接在@Nested测试类中使用@BeforehandAll和@AfterAll方法。此类注解不会继承。
@Tag 用于在类或方法级别声明用于过滤测试的标记;类似于TestNG中的测试组或JUnit4中的Category。此类注解在类级别继承,但不在方法级别继承。
@Disabled 用于禁用测试类或测试方法;类似于JUnit4的@Ignore。此类注解不会继承。
@Timeout 用于在测试、测试工厂、测试模板或生命周期方法的执行超过给定持续时间时使其失败。此类注解将被继承。
@ExtendWith 用于以声明方式注册拓展。此类注解将被继承。
@RegisterExtension 用于通过字段以编程方式注册拓展。除非这些字段被隐藏,否则将继承这些字段。
@TempDir 用于在生命周期方法或测试方法中通过字段注入或参数注入提供临时目录;位于org.junit.jupiter.api.io包中。

2.元注解和组合注解

JUnit Jupiter注解可以用作元注解。意味着可以定义自己的组合注解,该注解将自动继承其元注解的语义。
比如,你可以创建名的为@Tag(“fast”)的自定义组合注解,而不是整个代码库中复制和粘贴@Tag(“fast”),如下所示。然后@Fast可以用作@Tag(“fast”)的直接替代品。

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.junit.jupiter.api.Tag;

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Tag("fast")
public @interface Fast {
}

下面这个@Test方法描述了@Fast注解的用法

@Fast
@Test
void myFastTest(){
    //...
}

3.测试类和方法

测试类:任何包含至少一个测试方法的顶级类、静态成员类或@Nested类。测试类不能是抽象的,并且必须具有单个构造函数。
测试方法:使用@Test、@RepeatedTest、@ParameerizedTest、@TestFactory或@TestTemplate直接注解或元注解的任何实例方法。
生命周期方法:使用@BeforeAll、@AfterAll、@BeforeEach或@AfterEach直接注解或元注解的任何方法。
测试方法和生命周期方法可以在当前测试类中本地声明,从超类继承,也可以从接口继承(参考测试接口和默认方法)。此外,测试方法和生命周期方法不得抽象,并且不得返回值(返回值所需的@TestFactory方法除外)。
类和方法的可见性:测试类、测试方法和生命周期方法不要求public,但不能为private。通常建议省略测试类、测试方法和生命周期方法的public修饰符,除非有技术原因这样做。例如,当一个测试类被另一个包中的测试类拓展时。类和方法加上public的另一个技术原因是,在使用Java模块系统时,简化模块路径上的测试。
以下的测试类演示了使用@Test方法和所有受支持的生命周期方法。更多信息在测试执行顺序和回调包装行为。
例子:设定为测试不通过

import org.junit.jupiter.api.*;
import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assumptions.*;

class StandardTests {
    @BeforeAll
    static void initAll() {
    }
    @BeforeEach
    void init() {
    }
    @Test
    void succeedingTest() {
    }
    @Test
    void failingTest() {
        fail("a failing test");
    }
    @Test
    @Disabled("for demonstration purposes")
    void skippedTest(){
        //not executed
    }
    @Test
    void abortedTest() {
        assumeTrue("abc".contains("Z"));
        fail("test should have been aborted");
    }
    @AfterEach
    void tearDown() {
    }
    @AfterAll
    static void tearDownAll() {
    }
}

输出结果

例子:设定为测试通过

import org.junit.jupiter.api.*;
import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assumptions.*;

class StandardTests {
    @BeforeAll
    static void initAll() {
    }
    @BeforeEach
    void init() {
    }
    @Test
    void succeedingTest() {
    }
    @Test
    void failingTest() {
        //fail("a failing test");
    }
    @Test
    @Disabled("for demonstration purposes")
    void skippedTest(){
        //not executed
    }
    @Test
    void abortedTest() {
        assumeTrue("abc".contains("c"));
        //fail("test should have been aborted");
    }
    @AfterEach
    void tearDown() {
    }
    @AfterAll
    static void tearDownAll() {
    }
}

输出结果

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。