JUnit在@BeforeClass上使用@Before

时间:2015-10-30 17:18:52

标签: java junit

根据此answer@Before注释在每次测试之前执行一次,而@BeforeClass注释仅在之前执行一次测试。

我的直觉告诉我要始终使用@BeforeClass,所以问题是,为什么要使用@Before?是否存在@Before注释比@BeforeClass注释执行得更好/更快的情况?

3 个答案:

答案 0 :(得分:3)

每个测试都应该是隔离的。通过使用BeforeClass,之前测试的状态可能会悬而未决,并且会破坏后面的测试。

一个人通常使用BeforeClass来设置昂贵的外部资源,Before来重置世界(无论是外部资源还是本地资源)。

最后一点说明:

  

表现更好/更快

在这种情况下,我会说这两个属性应该在这里独立处理(更好!=更快)。只要运行完整测试套件的总时间不到10分钟,那么"更快"根本不重要。

一旦你超过那个神奇的十分钟(此时你肯定会谈论集成测试而不是单元测试)然后开始寻找制作事物的方法"更快"。

答案 1 :(得分:3)

我会举个例子:

假设您需要在Web应用程序中验证表单。你将使用Selenium。

您的测试类将进行10次测试。每次启动测试套件时,都无需打开和关闭webdriver浏览器。在这种情况下,您可以使用@BeforeClass方法来暂停webdrive浏览器。

但是,对于每个验证测试,您需要重置表单。您将使用@Before方法执行此操作。

这是一个非常简单的例子,但可能会让事情更清楚。

答案 2 :(得分:1)

当您使用@BeforeClass时,它建议您在所有测试之前进行初始化。所以一个测试可能依赖于另一个测试(例如,如果测试改变了字段的状态),所以我鼓励使用@Before,甚至更好地为方法本身内的测试方法做准备。 当你的测试需要完全相同的初始状态时,很少有这种情况,为什么要将它们结合在一起?