473

之间的主要区别是什么

  • @Before@BeforeClass
    • 在 JUnit 5@BeforeEach@BeforeAll
  • @After@AfterClass

根据JUnit Api @Before在以下情况下使用:

在编写测试时,通常会发现多个测试需要创建类似的对象才能运行。

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

4

7 回答 7

696

标记的代码@Before在每次测试之前执行,而@BeforeClass在整个测试夹具之前运行一次。如果您的测试类有十个测试,@Before代码将执行十次,但@BeforeClass只会执行一次。

通常,@BeforeClass当多个测试需要共享相同的计算量大的设置代码时,您会使用它。建立数据库连接属于这一类。您可以将代码从@BeforeClass移至@Before,但您的测试运行可能需要更长时间。请注意,标记的代码@BeforeClass作为静态初始化程序运行,因此它将在创建测试夹具的类实例之前运行。

JUnit 5中,标签@BeforeEach和是和在 JUnit 4@BeforeAll中的等价物。它们的名称更能说明它们何时运行,松散地解释为:“在每个测试之前”和“在所有测试之前”。@Before@BeforeClass

于 2013-11-30T01:50:15.330 回答
154

每个注释之间的区别是:

+-------------------------------------------------------------------------------------------------------+
¦                                       Feature                            ¦   Junit 4    ¦   Junit 5   ¦
¦--------------------------------------------------------------------------+--------------+-------------¦
¦ Execute before all test methods of the class are executed.               ¦ @BeforeClass ¦ @BeforeAll  ¦
¦ Used with static method.                                                 ¦              ¦             ¦
¦ For example, This method could contain some initialization code          ¦              ¦             ¦
¦-------------------------------------------------------------------------------------------------------¦
¦ Execute after all test methods in the current class.                     ¦ @AfterClass  ¦ @AfterAll   ¦
¦ Used with static method.                                                 ¦              ¦             ¦
¦ For example, This method could contain some cleanup code.                ¦              ¦             ¦
¦-------------------------------------------------------------------------------------------------------¦
¦ Execute before each test method.                                         ¦ @Before      ¦ @BeforeEach ¦
¦ Used with non-static method.                                             ¦              ¦             ¦
¦ For example, to reinitialize some class attributes used by the methods.  ¦              ¦             ¦
¦-------------------------------------------------------------------------------------------------------¦
¦ Execute after each test method.                                          ¦ @After       ¦ @AfterEach  ¦
¦ Used with non-static method.                                             ¦              ¦             ¦
¦ For example, to roll back database modifications.                        ¦              ¦             ¦
+-------------------------------------------------------------------------------------------------------+

两个版本中的大多数注释都是相同的,但很少有不同。

参考

执行顺序。

虚线框 -> 可选注释。

在此处输入图像描述

于 2017-07-11T14:49:25.947 回答
14

JUnit 中的 Before 和 BeforeClass

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

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

样本类

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

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

样品测试

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

六月 5

@Before = @BeforeEach
@BeforeClass = @BeforeAll
@After = @AfterEach
@AfterClass = @AfterAll
于 2018-08-13T11:05:38.370 回答
4

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

@After(JUnit4) -> (JUnit5) -每次测试@AfterEach调用方法

@BeforeClass(JUnit4) -> @BeforeAll(JUnit5) -在执行此类中的所有测试之前调用静态方法。启动服务器、读取文件、建立数据库连接可能是一项艰巨的任务......

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

于 2021-01-19T20:50:11.387 回答
2
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())
    }
}
于 2019-02-27T15:05:16.487 回答
1

所有这些注释之间的基本区别如下 -

  1. @BeforeEach - 用于在(例如 setUp)每个测试方法执行之前运行公共代码。类似于 JUnit 4 的 @Before。
  2. @AfterEach - 用于在(例如,tearDown)每个测试方法执行之后运行公共代码。类似于 JUnit 4 的 @After。
  3. @BeforeAll - 用于在任何测试执行之前为每个类运行一次。类似于 JUnit 4 的 @BeforeClass。
  4. @AfterAll - 用于在所有测试执行后每个类运行一次。类似于 JUnit 4 的 @AfterClass。

所有这些注释以及用法都在Codingeek - Junit5 Test Lifecycle上定义

于 2021-01-02T18:05:31.003 回答
0

@BeforeClass将在整个测试套件之前运行,而@Beforewill be run 在每个测试之前执行,而@BeforeClass在整个测试夹具之前运行一次。如果您的测试类有十个测试,@Before代码将执行十次,但@BeforeClass只会执行一次。

于 2021-09-27T23:40:47.947 回答