当前位置: 首页 > 知识库问答 >
问题:

Junit5参数化测试生命周期。为什么@BeforeAll和static block在所有测试之后运行

丁文轩
2023-03-14

我在下面贴了一个简单的代码,为什么@BeforeAll带注释的方法和静态块在参数化测试之后运行?在这种情况下,我如何在Junit5中加载参数化测试之前注册一个公共对象或数据库连接,或者利用@BeforeAll或static block的功能。(参考:Junit4中参数化测试的等效代码在所有测试之前运行静态块。但不是@BeforeClass注释方法。)

package com.something;

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

import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.junit.jupiter.params.provider.MethodSource;
import org.junit.jupiter.params.provider.ValueSource;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;


public class Example {
    MathUtils utils;

    static{
        System.out.println("Static Block------");
    }

    @BeforeAll
    static void beforeAllInit(){
        System.out.println("This will run Before all tests");
    }

    @BeforeEach //fresh instance before each test method
    void Init(){
        utils = new MathUtils();
        System.out.println("utils init()");
    }

    @AfterEach
    void cleanup(){
        System.out.println("Cleaning Up...");
    }

    //@Test
    @ParameterizedTest
    @CsvSource(value={"1,2,3","10,10,20","5,9,14"})
    void testAdd(int num1, int num2, int exp){
        //MathUtils utils = new MathUtils();
        //int exp = 3;
        int actual = utils.add(num1,num2);
        assertEquals(exp,actual,"Adding two numbers");
    }

    @ParameterizedTest
    @MethodSource("createDataCollection")
    void testMethod(ReadJson rj) {
        assertNotNull(rj);
    }

    public Stream<ReadJson> createDataCollection() {
        //beforeAllInit();

        final List<ReadJson> testInputs = new ArrayList<>();

        testInputs.add(new ReadJson("one","something","Miami","ABC"));
        testInputs.add(new ReadJson("two","something","New York","ABC"));
        testInputs.add(new ReadJson("three","something","Redlands","ABC"));

        return testInputs.stream();
    }

}

utils init()

正在清理。。。

utils init()

正在清理。。。

utils init()

正在清理。。。

静态块------

这将在所有测试之前运行

进程结束,退出代码为0

共有1个答案

朱阳晖
2023-03-14

不能复制。以下测试文件

package com.example;

import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;

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

class JUnitTests {

  static {
    System.out.println("Static initializer...");
  }

  @BeforeAll
  static void beforeAll() {
    System.out.println("Before all...");
  }

  @BeforeEach
  void beforeEach() {
    System.out.println("Before each...");
  }

  @ParameterizedTest
  @CsvSource(value = {"5,5,10", "2,3,5"})
  void parameterizedTest(int x, int y, int r) {
    System.out.printf("Parameterized test (%d, %d, %d)...%n", x, y, r);
    assertEquals(r, x + y, () -> String.format("%d + %d expected to equal %d", x, y, r));
  }

  @AfterEach
  void afterEach() {
    System.out.println("After each...");
  }

  @AfterAll
  static void afterAll() {
    System.out.println("After all...");
  }
}

使用以下 Gradle 构建脚本编译和执行:

plugins {
    java
}

repositories {
    mavenCentral()
}

dependencies {
    testImplementation("org.junit.jupiter:junit-jupiter:5.8.2")
}

tasks.test {
    useJUnitPlatform()
    testLogging {
        showStandardStreams = true
    }
}

给出以下输出:

> Task :test

JUnitTests STANDARD_OUT
    Static initializer...
    Before all...

JUnitTests > parameterizedTest(int, int, int) > com.example.JUnitTests.parameterizedTest(int, int, int)[1] STANDARD_OUT
    Before each...
    Parameterized test (5, 5, 10)...
    After each...

JUnitTests > parameterizedTest(int, int, int) > com.example.JUnitTests.parameterizedTest(int, int, int)[2] STANDARD_OUT
    Before each...
    Parameterized test (2, 3, 5)...
    After each...

JUnitTests STANDARD_OUT
    After all...

BUILD SUCCESSFUL in 3s
3 actionable tasks: 3 executed

如您所见,一切都是按照预期的顺序执行的。

 类似资料:
  • 主要内容:1. 需求分析,2. 测试计划创建,3. 环境设置,4. 测试用例执行,5. 缺陷记录,6. 测试周期关闭软件测试的过程也称为STLC(软件测试生命周期),其中包括测试过程的各个阶段。测试过程以精心策划和系统的方式执行。所有活动都是为了提高软件产品的质量。 下面来看看STLC的不同阶段。 软件测试生命周期包含以下阶段: 1. 需求分析 手动测试程序的第一步是需求分析。在此阶段,测试人员分析SDLC(软件开发生命周期)的需求文档,以检查客户所述的要求。在检查要求后,测试人员制定测试计划以

  • 本文向大家介绍测试生命周期模型?相关面试题,主要包含被问及测试生命周期模型?时的应答技巧和注意事项,需要的朋友参考一下 V模型、W模型、瀑布模型、 螺旋模型、敏捷H模型 软件测试流程 1、需求分析,需求评审 2、制定测试计划、计划评审 3、编写测试用例、用例评审 4、测试实施阶段、执行测试用例 按照设计好的用例、准备好的数据和制定的测试策略,实施进行具体的测试过程 5、测试评估阶段 测试总结、缺陷

  • 对于测试证据,我想将我写到特定目录中的所有测试工件(例如服务器调用和响应)存档。我得到了压缩目录的方法,但我没有找到合适的地方来执行它。 测试生命周期回调似乎不是正确的位置,因为@AfterAll在每个测试类之后被调用,但是存档应该在所有测试类中的所有测试终止后生成。 在阅读了诸如如何在模块中执行之前和之后分别编码一次的帖子之后?似乎没有希望在jUnit中执行调用。 我找到了一个扩展TestLau

  • 为了允许隔离执行单个的测试方法,并避免由于可变测试实例状态而产生的意外副作用,JUnit在执行每个测试方法之前创建每个测试类的新实例(请参阅下面的讲解,何为测试方法)。这个"per-method"测试实例生命周期是JUnit Jupiter中的默认行为,类似于JUnit以前的所有版本。 如果您希望JUnit Jupiter在同一个测试实例上执行所有测试方法,只需使用@TestInstance(Li

  • TestInstancePostProcessor defines the API for Extensions that wish to post process test instances. Common use cases include injecting dependencies into the test instance, invoking custom initializatio

  • 我想在maven测试期间在Java14中运行spock 2.0-M2-Groovy-3.0和junit 5.6.2测试。我的pom看起来: 如果我跑 在maven生命周期中运行spock和junit测试是否可能没有上述警告?