50%
As we know from official TestNG documentation:
带注释的方法将在调用当前类中的第一个测试方法之前运行。
@BeforeClass:
在运行属于@BeforeTest:
标记内的类的任何测试方法之前,将运行带注释的方法。
以上testng注释在功能上看起来都相似。 但是,该功能应该有一个独特的区别。 有人可以强调一下吗?
答案 0 :(得分:90)
SeleniumAbstractTest.class
public abstract class SeleniumAbstractTest {
@BeforeSuite
public void beforeSuite() {
System.out.println("BeforeSuite");
}
@BeforeTest
public void beforeTest() {
System.out.println("BeforeTest");
}
@BeforeClass
public void beforeClass() {
System.out.println("BeforeClass");
}
@BeforeMethod
public void beforeMethod() {
System.out.println("BeforeMethod");
}
@AfterMethod
public void afterMethod() {
System.out.println("AfterMethod");
}
@AfterClass
public void afterClass() {
System.out.println("AfterClass");
}
@AfterTest
public void afterTest() {
System.out.println("AfterTest");
}
@AfterSuite
public void afterSuite() {
System.out.println("AfterSuite");
}
}
MyTestClass1.class
public class MyTestClass1 extends SeleniumAbstractTest {
@Test
public void myTestMethod1() {
System.out.println("myTestMethod1");
}
@Test
public void myTestMethod2() {
System.out.println("myTestMethod2");
}
}
MyTestClass2.class
public class MyTestClass2 extends SeleniumAbstractTest {
@Test
public void myTestMethod3() {
System.out.println("myTestMethod3");
}
@Test
public void myTestMethod4() {
System.out.println("myTestMethod4");
}
}
如果您有以下测试套件......
<suite name="Suite">
<test name="Test1" >
<classes>
<class name="MyTestClass2" />
</classes>
</test>
<test name="Test2">
<classes>
<class name="MyTestClass1"/>
<class name="MyTestClass2"/>
</classes>
</test>
</suite>
...然后输出[缩进以便于阅读]将是
BeforeSuite
' BeforeTest
' ' BeforeClass
' ' ' BeforeMethod
' ' ' ' myTestMethod3
' ' ' AfterMethod
' ' ' BeforeMethod
' ' ' ' myTestMethod4
' ' ' AfterMethod
' ' AfterClass
' AfterTest
' BeforeTest
' ' BeforeClass
' ' ' BeforeMethod
' ' ' ' myTestMethod1
' ' ' AfterMethod
' ' ' BeforeMethod
' ' ' ' myTestMethod2
' ' ' AfterMethod
' ' AfterClass
' ' BeforeClass
' ' ' BeforeMethod
' ' ' ' myTestMethod3
' ' ' AfterMethod
' ' ' BeforeMethod
' ' ' ' myTestMethod4
' ' ' AfterMethod
' ' AfterClass
' AfterTest
AfterSuite
希望有所帮助:)
答案 1 :(得分:6)
@BeforeMethod - 在每个测试方法之前执行,例如使用@Test注释的方法
@BeforeTest - 仅在testng.xml文件中给出的标记之前执行。
简而言之,@ ByMethod适用于Java类中定义的测试。 @BeforeTest适用于testng.xml中定义的测试,即XML文件。
答案 2 :(得分:1)
如果你从另一个类扩展,那就是结果:
parentTest - BeforeTest- parent
testClass1 - BeforeTest- test1
parentTest - BeforeClass- parent
testClass1 - BeforeClass- test1
parentTest - BeforeMethod- parent
testClass1 - BeforeMethod- test1
testClass1 - myTestMethod1
testClass1 - AfterMethod- test1
parentTest - AfterMethod- parent
parentTest - BeforeMethod- parent
testClass1 - BeforeMethod- test1
testClass1 - myTestMethod2
testClass1 - AfterMethod- test1
parentTest - AfterMethod- parent
testClass1 - AfterClass- test1
parentTest - AfterClass- parent
testClass1 - AfterTest- test1
parentTest – AfterTest- parent
答案 3 :(得分:1)
我的意见:
@BeforeClass:在调用当前类中的第一个测试方法之前,将运行带注释的方法
@BeforeTest:在运行当前套件中的任何测试方法之前,将运行带注释的方法
答案 4 :(得分:0)
在解释差异之前,首先是一些测试术语
Test suite
–由一个或多个测试标签组成。
Test tag
-包含一个或多个测试类。
Test class
–包含一种或多种方法。
说明
<suite name="suit1">
<test name="TestTag1">
<classes>
<class name="TestClass1"/>
</classes>
</test>
<test name="TestTag2">
<classes>
<class name="TestClass2"/>
<class name="TestClass3"/>
</classes>
</test>
</suite>
@BeforeTest
:将在任何测试标签之前仅调用一次,无论该标签中有多少个测试类或用@Test
注释的方法有多少次,都将仅调用一次。在前面的XML示例@BeforeTest
中,每个测试标签将被调用两次,一次在TestTag1
之前,第二次在TestTag2
之前,因此它可用于初始化内部不同测试类之间的公共对象一个测试标签。
@BeforeClass
:将仅在任何测试类之前调用一次,无论该测试类中有多少用@Test
注释的方法,都将仅调用它。每个测试类别一次,在上一个XML
示例中,@BeforeClass
将被调用三次,一次在TestClass1
之前,第二次在TestClass2
之前,第三次在{ {1}},因此可用于初始化一个测试类中不同测试方法之间的公共对象。
TestClass3
将为@BeforeSuite
套装被调用
通话顺序如下
suit1
要了解有关@BeforeSuite
@BeforeTest
@BeforeClass
@BeforeMethod
@Test
的更多信息,请参考答案https://stackoverflow.com/a/52331616/1973933
答案 5 :(得分:0)
@BeforeClass: The annotated method will be run before the first test method in the current class is invoked.
@BeforeMethod: The annotated method will be run before each test method.
The annotations above will also be honored (inherited) when placed on a superclass of a TestNG class. This is useful for example to centralize test setup for multiple test classes in a common superclass.
In that case, TestNG guarantees that the "@Before" methods are executed in inheritance order (highest superclass first, then going down the inheritance chain), and the "@After" methods in reverse order (going up the inheritance chain).
要了解有关TestNG批注的更多信息:https://testng.org/doc/documentation-main.html#annotations
答案 6 :(得分:0)
上述答案缺少的是@BeforeClass
和@BeforeTest
批注之间的用法差异。
很明显,用@BeforeClass
注释的方法(最常见的是设置方法)仅在该类中编写的所有测试用例之前执行一次。注释为'@BeforeTest'的方法将在每个测试用例之前执行,无论其计数/顺序/下划线逻辑如何。
因此,当我们的方法具有较长的调用且执行时间较长并且这些调用的输出在任何测试用例中都不会更改时,将使用@BeforeClass
。例如,在设置方法中获取API响应,该方法将在所有测试中使用。
而@BeforeTest@
是在我们需要做一些清理工作时使用的,并且每个测试都需要一些新鲜的资源来开始。例如,一个新创建的订单等。