setUp()和setUpBeforeClass()之间的区别


159

使用JUnit进行单元测试时,有两种相似的方法setUp()setUpBeforeClass()。这些方法有什么区别?另外,tearDown()和之间有什么区别tearDownAfterClass()

这是签名:

@BeforeClass
public static void setUpBeforeClass() throws Exception {
}

@AfterClass
public static void tearDownAfterClass() throws Exception {
}

@Before
public void setUp() throws Exception {
}

@After
public void tearDown() throws Exception {
}

Answers:


204

@BeforeClass@AfterClass注解的方法将你的测试运行期间只有一次运行-在测试整体的开始和结束,什么都运行之前。实际上,它们是在构建测试类之前运行的,这就是为什么必须声明它们的原因static

@Before@After方法将在每次测试案例之前和之后运行,所以在测试运行期间可能会多次运行。

因此,假设您在类中进行了三个测试,方法调用的顺序为:

setUpBeforeClass()

  (Test class first instance constructed and the following methods called on it)
    setUp()
    test1()
    tearDown()

  (Test class second instance constructed and the following methods called on it)
    setUp()
    test2()
    tearDown()

  (Test class third instance constructed and the following methods called on it)
    setUp()
    test3()
    tearDown()

tearDownAfterClass()

15

将“ BeforeClass”视为您的测试用例的静态初始化器-将其用于初始化静态数据-在您的测试用例中不会改变的事情。您绝对要注意线程安全的静态资源。

最后,使用“ AfterClass”注释方法清理您在“ BeforeClass”注释方法中所做的所有设置(除非它们的自毁能力足够好)。

“之前”和“之后”是针对单元测试的特定初始化。我通常使用这些方法来初始化/重新初始化依赖项的模拟。显然,这种初始化不是特定于单元测试的,而是通用于所有单元测试的。


顺便说一句,如果您开始编写单元测试,我会从我的博客中推荐这个锅。它也指向有关单元测试的其他重要材料:madhurtanwani.blogspot.com/search/label/mock
madhurtanwani 2010年

7

setUpBeforeClass在构造函数之后的任何方法执行之前运行(仅运行一次)

setUp在每个方法执行之前运行

在每次执行方法后都将运行tearDown

tearDownAfterClass在所有其他方法执行之后运行,是要执行的最后一个方法。(仅运行一次解构器)


5

Javadoc

有时,一些测试需要共享计算量大的设置(例如登录数据库)。尽管这可能会损害测试的独立性,但有时这是必要的优化。注释public static voidno-arg方法@BeforeClass会导致它在类中的任何测试方法之前运行一次。@BeforeClass超类的方法将在当前类之前运行。


区别在于setUpBeforeClass在任何测试之前运行,并且运行一次;setUp在每次测试之前运行一次(通常用于在两次测试之间将测试状态重置为已知值)。
语法
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.