TestNG @AfterGroups 注解

目录

使用@AfterGroups注释的方法

例如

什么时候@AfterGroups注释的方法会相对于其他@AfterXXX注释执行?

假设情景

如果我们把属于一个组的测试用例放在不同的包中会怎么样?

这里发生了什么

Q -当@AfterGroups注释放在超类上时,它将如何工作?


@AfterGroups注释的方法在提到的组内的测试用例执行后执行。

使用@AfterGroups注释的方法
@AfterGroups(groups = {"group1","group2","...."})
public void afterGroups() {
}

我们必须在“groups”属性中传递组的列表,我们希望为其运行@AfterGroups注释方法。

例如

我们将采用一个由两个测试用例组成的CodekruTest类。这两个病例都属于一个称为“第1组”的组。

package Test;
 
import org.testng.Assert;
import org.testng.annotations.AfterGroups;
import org.testng.annotations.Test;
 
public class CodekruTest {
 
    @AfterGroups(groups = "group1")
    public void afterGroup() {
        System.out.println("afterGroup method executed");
    }
 
    @Test(groups = { "group1" })
    public void test1() {
        System.out.println("Executing test1 in CodekruTest class");
        Assert.assertTrue(true);
    }
 
    @Test(groups = { "group1" })
    public void test2() {
        System.out.println("Executing test2 in CodekruTest class");
        Assert.assertTrue(true);
    }
 
}

现在,要运行组的案例,我们必须执行下面的XML文件。


    
        
            
                
            
        
        
            
        
    

运行上述XML文件后的输出-

Executing test1 in CodekruTest class
Executing test2 in CodekruTest class
afterGroup method executed

===============================================
codekru
Total tests run: 2, Passes: 2, Failures: 0, Skips: 0
什么时候@AfterGroups注释的方法会相对于其他@AfterXXX注释执行?
package Test;
 
import org.junit.AfterClass;
import org.testng.Assert;
import org.testng.annotations.AfterGroups;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.AfterTest;
import org.testng.annotations.Test;
 
public class CodekruTest {
 
    @AfterSuite
    public void afterSuite() {
        System.out.println("afterSuite method executed");
    }
 
    @AfterClass
    public void afterClass() {
        System.out.println("afterClass method executed");
    }
 
    @AfterMethod
    public void afterMethod() {
        System.out.println("afterMethod method executed");
    }
 
    @AfterTest
    public void afterTest() {
        System.out.println("afterTest method executed");
    }
 
    @AfterGroups(groups = "group1")
    public void afterGroup() {
        System.out.println("afterGroup method executed");
    }
 
    @Test(groups = { "group1" })
    public void test1() {
        System.out.println("Executing test1 in CodekruTest class");
        Assert.assertTrue(true);
    }
 
}

下面是运行CodekruTest类的XML文件。


 

    
        
            
                
            
        
        
            
        
    

运行上述XML文件后的输出-

Executing test1 in CodekruTest class
afterGroup method executed

为什么除了afterGroup()之外的带注释的方法不被执行?

这是因为他们没有在注释中使用“groups”属性。但是,如果我们使用它,我们将能够看到@AfterGroups注释相对于其他注释的执行顺序

package Test;
 
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterGroups;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.AfterTest;
import org.testng.annotations.Test;
 
public class CodekruTest {
 
    @AfterSuite(groups = "group1")
    public void afterSuite() {
        System.out.println("afterSuite method executed");
    }
 
    @AfterClass(groups = "group1")
    public void afterClass() {
        System.out.println("afterClass method executed");
    }
 
    @AfterMethod(groups = "group1")
    public void afterMethod() {
        System.out.println("afterMethod method executed");
    }
 
    @AfterTest(groups = "group1")
    public void afterTest() {
        System.out.println("afterTest method executed");
    }
 
    @AfterGroups(groups = "group1")
    public void afterGroup() {
        System.out.println("afterGroup method executed");
    }
 
    @Test(groups = { "group1" })
    public void test1() {
        System.out.println("Executing test1 in CodekruTest class");
        Assert.assertTrue(true);
    }
 
}

重新运行XML文件后的输出

Executing test1 in CodekruTest class
afterMethod method executed
afterGroup method executed
afterClass method executed
afterTest method executed
afterSuite method executed

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

这样可以清楚地了解各种注释的执行顺序。

假设情景
如果我们把属于一个组的测试用例放在不同的包中会怎么样?

我们将采用两个类(CodekruTest 1和CodekruTest 2)并将它们放在不同的包中,然后尝试使用@AfterGroups注释。

Practice.Test1包中的CodekruTest1.java

package Practice.Test1;
 
import org.testng.Assert;
import org.testng.annotations.AfterGroups;
import org.testng.annotations.Test;
 
public class CodekruTest1 {
 
    @AfterGroups(groups = "group1")
    public void afterGroup() {
        System.out.println("afterGroup method executed");
    }
 
    @Test(groups = { "group1" })
    public void test1() {
        System.out.println("Executing test1 in CodekruTest1 class");
        Assert.assertTrue(true);
    }
}

Practice.Test2包中的CodekruTest2.java

package Practice.Test2;
 
import org.testng.Assert;
import org.testng.annotations.Test;
 
public class CodekruTest2 {
     
    @Test(groups = { "group1" })
    public void test1() {
        System.out.println("Executing test1 in CodekruTest2 class");
        Assert.assertTrue(true);
    }
}

我们将运行下面的XML文件,看看现在会发生什么。


 

    
        
            
                
            
        
        
            
            
        
    

以上XML文件的输出-

Executing test1 in CodekruTest1 class
Executing test1 in CodekruTest2 class
afterGroup method executed

===============================================
codekru
Total tests run: 2, Passes: 2, Failures: 0, Skips: 0
===============================================
这里发生了什么

默认情况下,TestNG将按照XML文件中的顺序运行我们的测试。下面是执行XML文件的顺序:

  • TestNG遇到CodekruTest 1类并执行了属于group 1的cases。所有属于group 1的case都还没有执行,所以@AfterGroups注释的方法还没有执行。
  • 然后,TestNG遇到了CodekruTest2类,并执行了属于group1的case。
  • 在cases执行完毕并且没有找到更多的类之后,TestNG现在将执行@AfterGroups注释的方法。
Q -当@AfterGroups注释放在超类上时,它将如何工作?
class CodekruTest{
    @AfterGroups(groups = "group1")
    public void afterGroup() {
        System.out.println("afterGroup method executed in superclass");
    }
     
}
 
public class CodekruTestSubclass extends CodekruTest{
 
    @Test(groups = { "group1" })
    public void test1() {
        System.out.println("Executing test1 in CodekruTestSubclass");
        Assert.assertTrue(true);
    }
 
}

下面是运行子类的XML文件。



    
        
            
            
        
    

产出-

Executing test1 in CodekruTestSubclass
afterGroup method executed in superclass

我们可以在这里看到,afterGroup()方法被执行,因为子类继承了超类方法。因此,如果我们将afterGroup()设置为私有,它将不会被执行。

你可能感兴趣的:(unit,testing,java)