@BeforeClass注释:Junit vs TestNG

dej*_*avu 10 java junit testng

为什么@BeforeClass在方法JUnitstatic,而在TestNG它的non-staticTestNG开发是为了改进JUnit,为什么他们选择这种实施方式?

因为@BeforeClass只运行一次,所以使它static比使它非静态更有意义.同样在TestNG中,@BeforeClass调用该方法的实例是什么?有人能引用一个例子来更好地理解吗?

See*_*ose 12

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

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

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

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

  • 唯一的区别是在JUnit中你可以使用实例字段并保持隔离,在TestNG中你不能.如果你想破坏隔离,你仍然可以在JUnit中使用静态字段......或者在TestNG中使用静态字段.如果他们想要保持测试隔离,没有TestNG用户遇到问题.当他们想要进行相关测试(无论什么原因)时会出现问题,TestNG会更好地支持它,尽管你必须知道成本.将TestNG测试视为一个servlet - 你可以在那里准备东西,但它是共享的.是坏还是好?这只是一个事实. (3认同)

Shi*_*mar 1

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

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