TestNG中的@AfterSuite注释

目录

什么是@AfterSuite annotation?

代码示例

是时候来点头脑风暴了

我们可以在一个类中使用多个@AfterSuite注释方法吗?

@AfterSuite放在超类上时如何工作?


TestNG是Java中广泛使用的测试框架,用于进行单元,功能和集成测试。它包括几个注释,有助于管理测试生命周期和报告结果。@AfterSuite就是这样一个注释的例子,它使您能够在TestNG套件中的所有测试完成后执行特定的操作。

在TestNG中,与@BeforeXXX和@AfterXXX注释相比,@AfterSuite注释具有最低的优先级。

什么是@AfterSuite annotation?

@AfterSuite是TestNG注释套件的一部分,用于在套件中的所有测试运行后执行清理任务。对于关闭数据库连接、删除临时文件和生成测试报告等任务,它是一个有用的注释。@AfterSuite注释仅在套件中的所有测试完成后执行一次。

代码示例

正如我们所知,@AfterSuite注释的执行发生在所有测试执行之后。下面提到的TestNG.xml文件指定了@AfterSuite注释的确切执行点,以便更清楚地说明。

<!-- @BeforeSuite annoated method will execute here  -->
<suite name="codekru">
    <test name="codekru">
        <classes>
            <class name="Test.CodekruTestFirst" />
            <class name="Test.CodekruTestSecond" />
        </classes>
    </test>
</suite>
<!-- @AfterSuite annoated method will execute here -->

因此,@AfterSuite注释的方法将在suite标记之后执行。

让我们使用两个类(CodekruTestOne和CodekruTestSecond),我们将在CodekruTestSecond类中定义@AfterSuite注释方法。

CodekruTestOne.java

package Test;
  
import org.testng.Assert;
import org.testng.annotations.Test;
  
public class CodekruTestFirst {
  
    @Test
    public void test() {
        System.out.println("Executing the test in CodekruTestFirst class");
        Assert.assertTrue(true);
    }
      
}

CodekruTestSecond.java

package Test;
 
import org.testng.Assert;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.Test;
 
public class CodekruTestSecond {
 
    @AfterSuite
    public void afterSuite() {
        System.out.println("In afterSuite method");
    }
 
    @Test
    public void test() {
        System.out.println("Executing the test in CodekruTestSecond class");
        Assert.assertTrue(true);
    }
 
}

现在,我们将运行下面的testng.xml文件,看看会发生什么

<suite name="codekru">
    <test name="codekru">
        <classes>
            <class name="Test.CodekruTestSecond" />
            <class name="Test.CodekruTestFirst" />
        </classes>
    </test>
</suite>

产出-

Executing the test in CodekruTestSecond class
Executing the test in CodekruTestFirst class
In afterSuite method

===============================================
codekru
Total tests run: 2, Failures: 0, Skips: 0
===============================================

我们可以看到afterSuite方法在套件中的所有测试之后运行。

是时候来点头脑风暴了
我们可以在一个类中使用多个@AfterSuite注释方法吗?

答案是肯定的。我们可以在一个类中使用多个@AfterSuite注释的方法,然后所有这些方法都会在该套件中的所有测试之后运行。让我们看一个例子。

package Test;
 
import org.testng.Assert;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.Test;
 
public class CodekruTestSecond {
 
    @AfterSuite
    public void afterSuite1() {
        System.out.println("In afterSuite1 method");
    }
 
    @AfterSuite
    public void afterSuite2() {
        System.out.println("In afterSuite2 method");
    }
 
    @Test
    public void test() {
        System.out.println("Executing the test in CodekruTestSecond class");
        Assert.assertTrue(true);
    }
 
}

现在运行下面的XML文件。

<suite name="codekru">
    <test name="codekruTest">
        <classes>
            <class name="Test.CodekruTestSecond" />
        </classes>
    </test>
</suite>
<!-- @AfterSuite annoated method will execute here -->

产出-

Executing the test in CodekruTestSecond class
In afterSuite1 method
In afterSuite2 method

===============================================
codekru
Total tests run: 1, Passes: 1, Failures: 0, Skips: 0
@AfterSuite放在超类上时如何工作?

让我们看一个例子。

package Test;
 
import org.testng.Assert;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.Test;
 
class CodekruTest {
 
    @AfterSuite
    public void afterSuiteMethod() {
        System.out.println("afterSuite method 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
afterSuite method called

===============================================
codekru
Total tests run: 1, Failures: 0, Skips: 0

因此,afterSuiteMethod即使被放置在超类上也可以运行,因为子类继承了所有方法。但是如果我们将afterSuiteMethod设置为私有,afterSuiteMethod方法将不会运行,因为私有方法不能被子类继承。