目录
那么,这个@AfterClass注释的方法什么时候执行呢?
那么,我们可以在一个类中放置多个@AfterClass注释方法吗?
@AfterClass注释放在超类上时如何工作?
在这篇文章中,我们将讨论TestNG中的@AfterClass注释。@AfterClass注释的方法将在特定类中的所有测试用例运行后运行。这可以帮助我们在运行了一个类中的所有测试用例之后进行一些清理或重置活动。
那么,这个@AfterClass注释的方法什么时候执行呢?
<suite name="codekru"><test name="codekru"><classes><class name="Test.CodekruTestFirst"> <!-- @BeforeClass method of CodekruTestFirst class will execute here --><methods><include name="testMethod" /></methods></class> <!-- @AfterClass method of CodekruTestFirst class will execute here --><class name="Test.CodekruTestSecond"> <!-- @BeforeClass method of CodekruTestSecond class will execute here --><methods><include name="testMethod" /></methods></class> <!-- @AfterClass method of CodekruTestSecond class will execute here --></classes></test>
</suite>
现在,我们将采用两个类(CodekruTestFirst和CodekruTestSecond),并在每个类中保留一个带@AfterClass注释的方法。
CodekruTestFirst.java
package Test;import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.Test;public class CodekruTestFirst {@AfterClasspublic void afterClass() {System.out.println("afterClass method in CodekruTestFirst class");}@Testpublic void testMethod() {System.out.println("Executing the test in CodekruTestFirst class");Assert.assertTrue(true);}}
CodekruTestSecond.java
package Test;import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.Test;public class CodekruTestSecond {@AfterClasspublic void afterClass() {System.out.println("afterClass method in CodekruTestSecond class");}@Testpublic void testMethod() {System.out.println("Executing the test in CodekruTestSecond class");Assert.assertTrue(true);}}
现在,我们将运行下面的XML文件
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd" ><suite name="codekru"><test name="codekru"><classes><class name="Test.CodekruTestFirst"><methods><include name="testMethod" /></methods></class> <!-- @AfterClass method of CodekruTestFirst class will execute here --><class name="Test.CodekruTestSecond"><methods><include name="testMethod" /></methods></class> <!-- @AfterClass method of CodekruTestFirst class will execute here --></classes></test>
</suite>
产出-
Executing the test in CodekruTestFirst class
afterClass method in CodekruTestFirst class
Executing the test in CodekruTestSecond class
afterClass method in CodekruTestSecond class===============================================
codekru
Total tests run: 2, Failures: 0, Skips: 0
这里发生了什么
- 默认情况下,TestNG将按照XML文件中的顺序运行测试。&因此,它获取了CodekruTestFirst类,运行了它的test方法,然后运行了它的@AfterClass注释方法。
- 在那之后,它去了CodekruTestSecond类,运行了它的测试用例,然后是它的@AfterClass注释方法。
那么,我们可以在一个类中放置多个@AfterClass注释方法吗?
是的,我们可以在一个类中放置多个@AfterClass注释的方法,然后所有这些注释的方法都将在该类的所有测试用例执行后运行。让我们看一个例子。
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.Test;public class CodekruTestSecond {@AfterClasspublic void afterClass1() {System.out.println("in afterClass1 method");}@AfterClasspublic void afterClass2() {System.out.println("in afterClass2 method");}@Testpublic void testMethod() {System.out.println("Executing the test in CodekruTestSecond class");Assert.assertTrue(true);}}
我们将运行下面的XML文件来执行CodekruTestSecond类。
<suite name="codekru"><test name="codekruTest"><classes><class name="Test.CodekruTestSecond" /></classes></test>
</suite>
运行XML文件后的输出-
Executing the test in CodekruTestSecond class
in afterClass1 method
in afterClass2 method===============================================
codekru
Total tests run: 1, Passes: 1, Failures: 0, Skips: 0
@AfterClass注释放在超类上时如何工作?
让我们通过一个例子来看看这个问题。
package Test;import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.Test;class CodekruTest {@AfterClasspublic void afterClassMethod() {System.out.println("afterClassMethod called");}}public class CodekruTestSubclass extends CodekruTest {@Test()public void test() {System.out.println("Executing the subclass test");Assert.assertTrue(true);}}
现在,我们将在testng.xml下面运行,看看会发生什么。
<suite name="codekru"><test name="codekru"><classes><class name="Test.CodekruTestSubclass" /></classes></test>
</suite>
产出-
Executing the subclass test
afterClassMethod called===============================================
codekru
Total tests run: 1, Passes: 1, Failures: 0, Skips: 0
因此,即使afterClassMethod存在于超类中,它也会被执行。这是因为afterClassMethod被子类继承了。但是,如果我们将afterClassMethod设置为私有,它将不会运行,因为私有方法不能被子类继承。