Junit 4 执行顺序与 Junit 5

Junit 4 execution order vs Junit 5

我在使用 Junit 5 时发现一些不需要的行为。 我有以下结构:

website
    config
        BaseTest.java
    tests
        package a
            Test 1
            Test 2
        package b
            Test 3
            Test 4

BaseTest 包含一个带有一些一次性设置的 @BeforeAll 和一个 @BeforeEach@AfterEach 在每次测试前后设置和拆卸一些数据。 每个测试都从 BaseTest.

延伸

我对Junit 4的习惯是BaseTest中的@BeforeAll在一次执行所有包中的所有测试时只运行一次。但是,对于 Junit 5,当来自另一个包的测试为 运行 时,似乎会重复 @BeforeAll。为了澄清,我得到这样的东西:

BeforeAll
    BeforeEach
        Package 1 Test 1
    AfterEach
    BeforeEach
        Package 1 Test 2
    AfterEach
AfterAll
BeforeAll
    BeforeEach
        Package 2 Test 1
    AfterEach
    BeforeEach
        Package 2 Test 2
    AfterEach
AfterAll

提前致谢! 问候

The way I am used to with Junit 4 is that the @BeforeAll in BaseTest is only run once when executing all the tests in all the packages at once.

这是不正确的。

我使用 JUnit 4 注释重新创建了您的示例,结果如下:

BeforeClass
    Before
        Package 1 Test 1
    After
    Before
        Package 1 Test 2
    After
AfterClass
BeforeClass
    Before
        Package 2 Test 1
    After
    Before
        Package 2 Test 2
    After
AfterClass

因此,所讨论的行为在 JUnit 4 和 JUnit Jupiter 中是相同的。

我设法通过覆盖 BeforeAllCallback 并将其注册到我的 BaseTest 来修复它,如下所示:

JunitExtensions.class

import com.codeborne.selenide.Configuration;
import org.junit.jupiter.api.extension.BeforeAllCallback;
import org.junit.jupiter.api.extension.ExtensionContext;

public class JunitExtensions implements BeforeAllCallback {

    @Override
    public void beforeAll(ExtensionContext extensionContext) throws Exception {
        //Code that needs to be ran before all tests goes here
    }
}

Basetest.java

@ExtendWith(JunitExtensions.class)
public class BaseTest {
        //code goes here
    }
}