@BeforeClass注释:Junit vs TestNG

时间:2013-12-05 08:17:21

标签: java junit testng

为什么@BeforeClass中的JUnit方法为staticTestNG non-staticTestNGJUnit的开发是对@BeforeClass的改进,所以他们为什么选择这种实施方式呢?

由于static仅运行一次,因此使其@BeforeClass比使其非静态更有意义。同样在TestNG中,调用{{1}}方法的实例?有人能引用一个例子来更好地理解吗?

2 个答案:

答案 0 :(得分:12)

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

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

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

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

答案 1 :(得分:1)

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

使方法静态可防止它访问类的非静态成员。但是通过使用非静态@BeforeClass方法,您还可以访问非静态成员,为您提供更多访问类变量的范围。也许这就是为什么testng删除了@BeforeClass方法的静态限制的原因。