【问题标题】:@BeforeClass annotation: Junit vs TestNG@BeforeClass 注解:Junit vs TestNG
【发布时间】:2013-12-05 08:17:21
【问题描述】:

为什么JUnit 中的@BeforeClass 方法是static 而TestNG 中的non-static? TestNG 是对JUnit 的改进,那么他们为什么选择这种实现方式呢?

因为@BeforeClass 只运行一次,所以设置static 比设置为非静态更有意义。同样在 TestNG 中,在哪个实例上调用了 @BeforeClass 方法?有人可以举个例子更好地理解吗?

【问题讨论】:

  • 请注意,TestNG 的注解是在 JUnit 之前开发的; TestNG 是对 JUnit v3.* 的改进,但现在它们看起来大致相同,因为 JUnit 也有注释(在 JUnit v4.*)。

标签: java junit testng


【解决方案1】:

JUnit 和 TestNG 的主要区别在于测试类的实例化。 JUnit 总是为每个测试方法运行创建一个新的测试类实例。 TestNG 只创建一个测试类实例,然后运行该实例的所有测试方法。

JUnit 方法保证了所有测试方法的独立性。它们运行的​​顺序无关紧要。此外,对于每种测试方法,所有实例字段始终设置相同。对所有测试方法都通用的初始化数据必须在类级别进行,因此它必须是静态的。这就是为什么@BeforeClass 方法必须是静态的原因。

TestNG 方法不保证独立性。事实上,您不能像在 JUnit 测试中那样使用实例字段。如果您在一种测试方法中更改此类字段,则更改的值在另一种测试方法中仍然是可观察的。但是,这种行为也有一个优点:有时某些测试方法之间存在依赖关系。使用 TestNG,测试人员可以表达它们。

由于 TestNG 的单实例方法,@BeforeClass 设置也可以是非静态方法,但它仍然只运行一次。这是一个设计决定,但使用 TestNG 的测试人员必须意识到这一点。

【讨论】:

  • 唯一的区别是在 JUnit 中你可以使用实例字段并保持隔离,而在 TestNG 中你不能。如果您想破坏隔离,您仍然可以在 JUnit 中使用静态字段...或 TestNG 中的任何字段。如果 TestNG 用户想要保持测试隔离,他们不会有这个问题。当他们想要进行依赖测试(无论是什么原因)时,问题就来了,TestNG 更好地支持它,尽管你必须知道成本。把 TestNG 测试想象成一个 servlet——你可以在那里准备东西,但它是共享的。它是坏的还是好的?这只是事实。
  • @virgo47 - 可以在“@BeforeClass”中初始化非静态类变量吗?
  • 好吧,您应该始终查阅文档并自行决定 - 但如果您相信我的话;对于非静态,它在 JUnit 和 TestNG 中都有。 :-)(区别在于静态字段。)新年快乐。
【解决方案2】:

将方法设为静态或非静态与一开始只能调用一次该方法无关。您可以根据需要多次调用静态方法。您可以完全调用一个非静态方法。两者之间没有必要的关联:静态和调用一次。至少,我不知道将方法设为静态以使其仅被调用一次的任何直接后果。 static 与单个类正确关联,但与单个调用无关。

将方法设为静态可防止其访问类的非静态成员。但是通过非静态@BeforeClass 方法,您还可以访问非静态成员,从而为您提供更多访问类变量的范围。或许这就是为什么 testng 去掉了@BeforeClass 方法是静态的限制的原因。

【讨论】:

  • 我的问题与调用它一次或多次无关。 '@BeforeClass' 在测试用例(不是每个测试用例)开始时执行,因此它不能与任何实例关联。 Junit 为每个测试方法创建一个新的类实例。由于'@beforeclass' 在 testNG 中是非静态的,因此它必须与实例相关联。这是否意味着在 testNG 中,每个测试都会执行 @beforeclass ?如果没有,那么它是如何工作的?
  • @BeforeClass 只是一个注解。 junit 运行器只需要获取使用此方法注释的所有方法的列表,并在执行每个测试之前执行它们一次。在 testng 中,@BeforeClass 对整个测试类也只执行一次。据我所知,Junit 收集了所有用@Test 注释的方法,并反射性地调用它们。我不确定 junit 是否真的为每个测试用例创建了一个新实例。
  • 它为每个测试用例创建一个新实例:stackoverflow.com/a/3353183/808203
猜你喜欢
  • 1970-01-01
  • 2010-09-05
  • 1970-01-01
  • 2012-12-17
  • 1970-01-01
  • 2015-08-15
  • 1970-01-01
  • 1970-01-01
  • 2021-05-26
相关资源
最近更新 更多