七、springboot 单元测试阶段 (4、前置条件(assumptions)5、嵌套测试 6、参数化测试 7、迁移指南)

news/2024/5/19 4:09:47 标签: spring boot, 单元测试, java, Junit5, 前端

目录

 4、前置条件(assumptions)

 5、嵌套测试

6、参数化测试

7、迁移指南


 4、前置条件(assumptions)

JUnit 5 中的前置条件(assumptions【假设】)类似于断言,不同之处在于不满足的断言会使得测试方法失败,而不满足的前置条件只会使得测试方法的执行终止。前置条件可以看成是测试方法执行的前提,当该前提不满足时,就没有继续执行的必要。

java">@DisplayName("前置条件")
public class AssumptionsTest {
 private final String environment = "DEV";

 @Test
 @DisplayName("simple")
 public void simpleAssume() {
    assumeTrue(Objects.equals(this.environment, "DEV"));
    assumeFalse(() -> Objects.equals(this.environment, "PROD"));
 }
 
 @Test
 @DisplayName("assume then do")
 public void assumeThenDo() {
    assumingThat(
       Objects.equals(this.environment, "DEV"),
       () -> System.out.println("In DEV")
    );
 }
}

assumeTrue 和 assumFalse 确保给定的条件为 true 或 false,不满足条件会使得测试执行终止。assumingThat 的参数是表示条件的布尔值和对应的 Executable 接口的实现对象。只有条件满足时,Executable 对象才会被执行;当条件不满足时,测试执行并不会终止。

 5、嵌套测试

JUnit 5 可以通过 Java 中的内部类和@Nested 注解实现嵌套测试,从而可以更好的把相关的测试方法组织在一起。在内部类中可以使用@BeforeEach 和@AfterEach 注解,而且嵌套的层次没有限制。

java">@DisplayName("A stack")
class TestingAStackDemo {
    Stack<Object> stack;
    @Test
    @DisplayName("is instantiated with new Stack()")
    void isInstantiatedWithNew() {
        new Stack<>();
       } //注意括号
    @Nested  //嵌套在内部
    @DisplayName("when new")
    class WhenNew {
        @BeforeEach
        void createNewStack() {
            stack = new Stack<>();
        }
        @Test
        @DisplayName("is empty")
        void isEmpty() {
            assertTrue(stack.isEmpty());
        }
        @Test
        @DisplayName("throws EmptyStackException when popped")
        void throwsExceptionWhenPopped() {
            assertThrows(EmptyStackException.class, stack::pop);
        }
        @Test
        @DisplayName("throws EmptyStackException when peeked")
        void throwsExceptionWhenPeeked() {
            assertThrows(EmptyStackException.class, stack::peek);
        }
        @Nested
        @DisplayName("after pushing an element")
        class AfterPushing {

            String anElement = "an element";
            @BeforeEach
            void pushAnElement() {
                stack.push(anElement);
            }
            @Test
            @DisplayName("it is no longer empty")
            void isNotEmpty() {
                assertFalse(stack.isEmpty());
            }
            @Test
            @DisplayName("returns the element when popped and is empty")
            void returnElementWhenPopped() {
                assertEquals(anElement, stack.pop());
                assertTrue(stack.isEmpty());
            }
            @Test
            @DisplayName("returns the element when peeked but remains not empty")
            void returnElementWhenPeeked() {
                assertEquals(anElement, stack.peek());
                assertFalse(stack.isEmpty());
            }
        }
    }
}

6、参数化测试

参数化测试是JUnit5很重要的一个新特性,它使得用不同的参数多次运行测试成为了可能,也为我们的单元测试带来许多便利。

利用@ValueSource等注解,指定入参,我们将可以使用不同的参数进行多次单元测试,而不需要每新增一个参数就新增一个单元测试,省去了很多冗余代码。

@ValueSource: 为参数化测试指定入参来源,支持八大基础类以及String类型,Class类型

@NullSource: 表示为参数化测试提供一个null的入参

@EnumSource: 表示为参数化测试提供一个枚举入参

@CsvFileSource:表示读取指定CSV文件内容作为参数化测试入参

@MethodSource:表示读取指定方法的返回值作为参数化测试入参(注意方法返回需要是一个流)

当然如果参数化测试仅仅只能做到指定普通的入参还达不到让我觉得惊艳的地步。让我真正感到他的强大之处的地方在于他可以支持外部的各类入参。如:CSV,YML,JSON 文件甚至方法的返回值也可以作为入参。只需要去实现ArgumentsProvider接口,任何外部文件都可以作为它的入参。

java">@ParameterizedTest
@ValueSource(strings = {"one", "two", "three"})
@DisplayName("参数化测试1")
public void parameterizedTest1(String string) {
    System.out.println(string);
    Assertions.assertTrue(StringUtils.isNotBlank(string));
}

@ParameterizedTest
@MethodSource("method")    //指定方法名
@DisplayName("方法来源参数")
public void testWithExplicitLocalMethodSource(String name) {
    System.out.println(name);
    Assertions.assertNotNull(name);
}

static Stream<String> method() {
    return Stream.of("apple", "banana");
}

7、迁移指南

在进行迁移的时候需要注意如下的变化:

  • 注解在 org.junit.jupiter.api 包中,断言在 org.junit.jupiter.api.Assertions 类中,前置条件在 org.junit.jupiter.api.Assumptions 类中。
  • 把@Before 和@After 替换成@BeforeEach 和@AfterEach。
  • 把@BeforeClass 和@AfterClass 替换成@BeforeAll 和@AfterAll。
  • 把@Ignore 替换成@Disabled。
  • 把@Category 替换成@Tag。
  • 把@RunWith、@Rule 和@ClassRule 替换成@ExtendWith。

http://www.niftyadmin.cn/n/1712962.html

相关文章

八. springboot 的指标监控 (1.SpringBoot Actuator 2.Actuator Endpoint)

目录 1、SpringBoot Actuator 1.1、简介 1.2、1.x与2.x的不同 1.3、如何使用 1.4、可视化 2、Actuator Endpoint 2.1、最常使用的端点 2.2、Health Endpoint 2.3、Metrics Endpoint 2.4、管理Endpoints 2.4.1、开启与禁用Endpoints 2.4.2、暴露Endpoints 1、SpringBoot Actua…

Occlusion

简介&#xff1b; 遮挡剔除&#xff1a;剔除视椎体内被其他游戏对象所遮住的物体 静态物体的遮挡剔除&#xff1a; 将需要自动遮挡的对象勾选 为Occluder Static/Occludee Static&#xff0c;然后在 Occlusion 中进行简单的设置 Bake 即可。最后可以在 Visualization 模式下…

八. springboot 的指标监控 (3、定制 Endpoint )

3、定制 Endpoint 3.1、定制 Health 信息 import org.springframework.boot.actuate.health.Health; import org.springframework.boot.actuate.health.HealthIndicator; import org.springframework.stereotype.Component; Component public class MyHealthIndicator implemen…

字符编码笔记

ASCII码&#xff1a;一个英文字母&#xff08;不分大小写&#xff09;占一个字节的空间&#xff0c;一个中文汉字占两个字节的空间。一个二进制数字序列&#xff0c;在计算机中作为一个数字单元&#xff0c;一般为8位二进制数&#xff0c;换算为十进制。最小值-128&#xff0c;…

unity中so文件的导出及其使用

1、在unity中的使用 在 Assets下创建Plugins/Android文件夹&#xff0c;里面可以区分arm64-v8a&#xff0c;armeabi-v7a&#xff0c;x86针对Android各个平台的so文件 2、各个平台的区别 armv7架构---是arm的32位 armv8架构-----是arm的64位 x86指令是很早的指令集 Android…

Unity中路径的使用

1、Resources文件夹&#xff1a;里面文件会原封不动的达到apk包中&#xff0c;其中的文件可以读&#xff0c;写 StreamingAssets文件夹&#xff1a;里面文件会原封不动的达到apk包中&#xff0c;其中的文件可以读&#xff0c;不能写入 persistentDataPath文件夹&#xff1a;路…

线段相交算法

在判断线段的相交时我们可以利用向量的叉积。当两条向量在一条直线上时&#xff0c;向量的叉积等于 0 &#xff0c;即上面的第二种情况&#xff0c;所以判断两条线段相交就分为两种情况讨论&#xff1a;1.向量的叉积不等于 0 &#xff1b;2.向量的叉积等于 0 。 一.叉积不等于…

最炫表白网站html5源码_七夕程序员的十款表白源码

❤ 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f482; 作者主页: 【进入主页—&#x1f680;获取更多源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;HTML5网页期末作业 (1000套) 】 &#x1…