目录
@BeforeXXX和@AfterXXX注释放在超类上时如何工作?
使用@BeforeXXX和@AfterXXX TestNG注释
TestNG是一个测试框架,旨在简化广泛的测试需求,从单元测试(隔离测试一个类)到集成测试(测试由几个类、几个包甚至几个外部框架组成的整个系统,如应用程序服务器)。
在TestNG中,NG代表下一代测试
TestNG为我们提供了许多注释,允许在某个点之前和之后执行一些Java逻辑以及更多。
那么,什么是注解呢?注释是元数据的一种形式,它提供有关程序的数据,而这些数据不是程序本身的一部分。注释对它们所注释的代码的操作没有直接影响。
注释名称 | 它有什么用? |
---|---|
@BeforeSuite | 带注释的方法将在此套件中的所有测试运行之前运行 |
@AfterSuite | 带注释的方法将在此套件中的所有测试运行之后运行。 |
@BeforeTest | 带注释的方法将在任何属于标记中的类的测试方法运行之前运行<test>。 |
@测试后 | 带注释的方法将在所有属于标记中的类的测试方法运行之后运行<test>。 |
@BeforeGroups | 此配置方法将在其之前运行的组的列表。此方法保证在调用属于任何这些组的第一个测试方法之前不久运行。 |
@AfterGroups | 此配置方法将在其之后运行的组的列表。此方法保证在调用属于这些组中任何一个的最后一个测试方法后不久运行。 |
@BeforeClass | 带注释的方法将在调用当前类中的第一个测试方法之前运行。 |
@AfterClass | 带注释的方法将在当前类中的所有测试方法运行之后运行。 |
@BeforeMethod | 注释方法将在每个测试方法之前运行。 |
@AfterMethod | 注释方法将在每个测试方法之后运行。 |
@DataProvider | 将方法标记为提供测试方法的数据。带注释的方法必须返回一个Object[][],其中每个Object[]可以被分配测试方法的参数列表。想要从这个DataProvider接收数据的@Test方法需要使用一个与这个annotation的名称相等的dataProvider名称。 |
@Factory | 将方法标记为工厂,该工厂返回将由TestNG用作Test类的对象。方法必须返回Object[]。 |
@Listeners | 定义测试类上的侦听器。 |
@Parameters | 描述如何将参数传递给@Test方法。 |
@Test | Marks a class or a method as part of the test. |
如果将这些注释放在超类上,则子类也将继承这些注释。这对于将多个测试类的测试设置集中在一个公共超类中非常有用。在这种情况下,TestNG保证@Before方法按照继承顺序执行(首先是最高的超类,然后沿着继承链向下),而@After方法则按照相反的顺序执行(沿着继承链向上)。
现在,我们将创建两个类,其中CodekruTest将是CodekruTestSubclass的超类,并具有以下结构
CodekruTest.java
?
package Test;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
public class CodekruTest {
@BeforeClass
public void beforeSuperClassMethod() {
System.out.println("In before method of Superclass");
Assert.assertTrue(true);
}
@AfterClass
public void AfterSuperClassMethod() {
System.out.println("In after method of Superclass");
Assert.assertTrue(true);
}
}
CodekruTestSubclass.java
package Test;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
public class CodekruTestSubclass extends CodekruTest {
@BeforeClass
public void beforeSubClassMethod() {
System.out.println("In before method of Subclass");
Assert.assertTrue(true);
}
@AfterClass
public void AfterSubClassMethod() {
System.out.println("In after method of Subclass");
Assert.assertTrue(true);
}
@Test
public void test() {
System.out.println("Executing the test");
Assert.assertTrue(true);
}
}
现在,我们将只运行CodekruTestSubclass,看看会发生什么。下面是用于此的testng.xml
<suite name="codekru">
<test name="codekru">
<classes>
<class name="Test.CodekruTestSubclass" />
</classes>
</test>
</suite>
输出-
In before method of Superclass
In before method of Subclass
Executing the test
In after method of Subclass
In after method of Superclass
===============================================
codekru
Total tests run: 1, Failures: 0, Skips: 0
===============================================
?
因此,我们可以看到超类的before方法首先运行,after方法随后运行。
层级是-
下面是一个小例子,以演示上述层级-
package Test;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
public class CodekruTest {
@BeforeSuite
public void beforeSuiteMethod() {
System.out.println("before Suite");
Assert.assertTrue(true);
}
@BeforeTest
public void beforeTestMethod() {
System.out.println("before Test");
Assert.assertTrue(true);
}
@BeforeClass
public void beforeClassMethod() {
System.out.println("before Class");
Assert.assertTrue(true);
}
@BeforeMethod
public void beforeMethod() {
System.out.println("before Method");
Assert.assertTrue(true);
}
@AfterSuite
public void afterSuiteMethod() {
System.out.println("after Suite");
Assert.assertTrue(true);
}
@AfterTest
public void afterTestMethod() {
System.out.println("after Test");
Assert.assertTrue(true);
}
@AfterClass
public void afterClassMethod() {
System.out.println("after Class");
Assert.assertTrue(true);
}
@AfterMethod
public void afterMethod() {
System.out.println("after Method");
Assert.assertTrue(true);
}
@Test()
public void test() {
System.out.println("Executing the test");
Assert.assertTrue(true);
}
}
现在,我们将在testng.xml文件下面运行,看看会发生什么以及输出的打印顺序
<suite name="codekru">
<test name="codekru">
<classes>
<class name="Test.CodekruTest" />
</classes>
</test>
</suite>
输出-
before Suite
before Test
before Class
before Method
Executing the test
after Method
after Class
after Test
after Suite
===============================================
codekru
Total tests run: 1, Failures: 0, Skips: 0