主要的区别是什么

@Before和@BeforeClass 在JUnit 5中@BeforeEach和@BeforeAll @课后和@课后

根据JUnit Api, @Before用于以下情况:

在编写测试时,经常会发现几个测试在运行之前需要创建类似的对象。

而@BeforeClass可以用来建立数据库连接。但是@Before不能做同样的事情吗?


当前回答

JUnit中的Before和BeforeClass

函数@Before注释将在具有@Test注释的类中的每个测试函数之前执行,但是具有@BeforeClass注释的函数将只在类中的所有测试函数之前执行一次。

类似地,带有@After注释的函数将在具有@Test注释的类中的每个测试函数之后执行,但带有@AfterClass的函数将只在类中的所有测试函数之后执行一次。

SampleClass

public class SampleClass {
    public String initializeData(){
        return "Initialize";
    }

    public String processDate(){
        return "Process";
    }
 }

SampleTest

public class SampleTest {

    private SampleClass sampleClass;

    @BeforeClass
    public static void beforeClassFunction(){
        System.out.println("Before Class");
    }

    @Before
    public void beforeFunction(){
        sampleClass=new SampleClass();
        System.out.println("Before Function");
    }

    @After
    public void afterFunction(){
        System.out.println("After Function");
    }

    @AfterClass
    public static void afterClassFunction(){
        System.out.println("After Class");
    }

    @Test
    public void initializeTest(){
        Assert.assertEquals("Initailization check", "Initialize", sampleClass.initializeData() );
    }

    @Test
    public void processTest(){
        Assert.assertEquals("Process check", "Process", sampleClass.processDate() );
    }

}

输出

Before Class
Before Function
After Function
Before Function
After Function
After Class

在Junit 5中

@Before = @BeforeEach
@BeforeClass = @BeforeAll
@After = @AfterEach
@AfterClass = @AfterAll

其他回答

@BeforeClass将在整个测试套件之前运行,而@Before将在每个测试之前运行,而@BeforeClass将在整个测试fixture之前运行一次。如果测试类有10个测试,@Before代码将执行10次,但@BeforeClass将只执行一次。

标记为@Before的代码在每次测试之前执行,而@BeforeClass在整个测试装置之前运行一次。如果测试类有10个测试,@Before代码将执行10次,但@BeforeClass将只执行一次。

一般来说,当多个测试需要共享相同的计算成本高昂的设置代码时,您可以使用@BeforeClass。建立数据库连接就属于这一类。您可以将代码从@BeforeClass移到@Before,但测试运行可能会花费更长的时间。注意,标记为@BeforeClass的代码是作为静态初始化器运行的,因此它将在创建测试fixture的类实例之前运行。

在JUnit 5中,标签@BeforeEach和@BeforeAll相当于JUnit 4中的@Before和@BeforeClass。它们的名称更能说明它们的运行时间,可以粗略地解释为:“在每次测试之前”和“在所有测试之前一次”。

JUnit @BeforeEach, @AfterEach, @BeforeAll, @AfterAll

@BeforeEach(JUnit5) -在每次测试之前调用方法

@AfterEach(JUnit5) -方法在每次测试后被调用

@BeforeClass(JUnit4) -> @BeforeAll(JUnit5) -在执行该类中的所有测试之前调用静态方法。它可以是一个大的任务启动服务器,读取文件,使db连接…

@AfterClass(JUnit4) -> @AfterAll(JUnit5) -在执行该类中的所有测试后调用静态方法。

JUnit中的Before和BeforeClass

函数@Before注释将在具有@Test注释的类中的每个测试函数之前执行,但是具有@BeforeClass注释的函数将只在类中的所有测试函数之前执行一次。

类似地,带有@After注释的函数将在具有@Test注释的类中的每个测试函数之后执行,但带有@AfterClass的函数将只在类中的所有测试函数之后执行一次。

SampleClass

public class SampleClass {
    public String initializeData(){
        return "Initialize";
    }

    public String processDate(){
        return "Process";
    }
 }

SampleTest

public class SampleTest {

    private SampleClass sampleClass;

    @BeforeClass
    public static void beforeClassFunction(){
        System.out.println("Before Class");
    }

    @Before
    public void beforeFunction(){
        sampleClass=new SampleClass();
        System.out.println("Before Function");
    }

    @After
    public void afterFunction(){
        System.out.println("After Function");
    }

    @AfterClass
    public static void afterClassFunction(){
        System.out.println("After Class");
    }

    @Test
    public void initializeTest(){
        Assert.assertEquals("Initailization check", "Initialize", sampleClass.initializeData() );
    }

    @Test
    public void processTest(){
        Assert.assertEquals("Process check", "Process", sampleClass.processDate() );
    }

}

输出

Before Class
Before Function
After Function
Before Function
After Function
After Class

在Junit 5中

@Before = @BeforeEach
@BeforeClass = @BeforeAll
@After = @AfterEach
@AfterClass = @AfterAll
import org.junit.Assert
import org.junit.Before
import org.junit.BeforeClass
import org.junit.Test

class FeatureTest {
    companion object {
        private lateinit var heavyFeature: HeavyFeature
        @BeforeClass
        @JvmStatic
        fun beforeHeavy() {
            heavyFeature = HeavyFeature()
        }
    }

    private lateinit var feature: Feature

    @Before
    fun before() {
        feature = Feature()
    }

    @Test
    fun testCool() {
        Assert.assertTrue(heavyFeature.cool())
        Assert.assertTrue(feature.cool())
    }

    @Test
    fun testWow() {
        Assert.assertTrue(heavyFeature.wow())
        Assert.assertTrue(feature.wow())
    }
}

一样

import org.junit.Assert
import org.junit.Test

 class FeatureTest {
    companion object {
        private val heavyFeature = HeavyFeature()
    }

    private val feature = Feature()

    @Test
    fun testCool() {
        Assert.assertTrue(heavyFeature.cool())
        Assert.assertTrue(feature.cool())
    }

    @Test
    fun testWow() {
        Assert.assertTrue(heavyFeature.wow())
        Assert.assertTrue(feature.wow())
    }
}