TestNG BeforeTest和BeforeMethod的区别

TestNG BeforeTest和BeforeMethod的区别

一个TestNG类可以有多个TestNG方法,比如:@BeforeTest, @AfterTest, @BeforeSuite, @BeforeClass, @BeforeMethod, @Test等等。

根据执行顺序,BeforeTest先执行,然后是BeforeMethod。

然而,如果一个类中有多个TestNG测试,这些方法的行为是有意义的。BeforeTest只在第一个@Test方法运行之前运行一次,而BeforeMethod在每个@Test运行之前都会执行。

  • @BeforeTest: 这个方法在整个执行过程中只执行一次,在调用第一个@Test方法之前执行。不管有多少@Test标签,或者有多少包含@Test标签的类,或者多个类有多个测试标签,根据testing.xml文件,一旦执行开始,BeforeTest方法只在第一个@Test方法和BeforeClass和BeforeMethod(如果存在)之前执行。

  • @BeforeMethod: 这个方法每个@Test执行一次,即@BeforeMethod的执行次数=要执行的@Test方法的数量。根据testing.xml,如果有10个@Test需要执行,那么@BeforeMethod将在每个@Test开始运行之前执行。

这些差异的关键点是:

  • BeforeTest方法在第一个@Test方法之前只执行一次。

  • BeforeMethod在每个@Test方法之前执行。

  • 如果在不同的类中有单独的BeforeTest和BeforeMethod方法,则所有BeforeTest方法都会先执行,但BeforeMethod方法会根据各自的类和它们的@Test方法执行。

  • 如果所有的测试类都继承了单独类中的公共BeforeTest和BeforeMethod方法,则BeforeTest只会执行一次,但是同样的BeforeMethod方法会在每个@Test方法之前执行。

场景1

当有2个TestNG类,每个类中有2个@Test标签。每个类都扩展了包含BeforeTest和BeforeMethod的公共类。在这种情况下,BeforeTest只会执行一次,但是BeforeMethod会执行2*2次,每次在每个@Test之前执行。

步骤

  • 步骤1 - 创建一个公共的TestNG类 – beforemethods,并编写@BeforeTest和@BeforeMethod方法。

  • 步骤2 - 创建两个TestNG类,每个类都继承自公共类(beforemethods) – OrderofTestExecutionInTestNG和NewTestngClass。

  • 步骤3 - 在这两个类中的每个类中编写2个不同的@Test方法 – OrderofTestExecutionInTestNG和NewTestngClass。

  • 步骤4 - 现在根据以下示例创建testNG.xml,以运行除公共类之外的2个TestNG类。

  • 步骤5 - 现在,在IDE中运行testNG.xml或直接运行testNG类,或使用命令行编译和运行它。

示例

以下是公共TestNG类 – beforemethods的代码示例。

import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeTest;

public class beforemethods {
    @BeforeMethod
    public void beforeMethod() {
        System.out.println("in beforeMethod");
    }
    @BeforeTest
    public void beforeTest() {
        System.out.println("in beforeTest");
    }
}

以下是TestNG类OrderofTestExecutionInTestNG的代码:

import org.testng.annotations.Test;

public class OrderofTestExecutionInTestNG extends beforemethods {
    // test case 1
    @Test
    public void testCase1() {
        System.out.println("in test case 1 of OrderofTestExecutionInTestNG");
    }
    // test case 2
    @Test
    public void testCase2() {
        System.out.println("in test case 2 of OrderofTestExecutionInTestNG");
    }
}

下面是常见的TestNG类的代码 – NewTestngClass

import org.testng.annotations.Test;

public class NewTestngClass extends beforemethods{
    @Test
    public void testCase1() {
        System.out.println("in test case 1 of NewTestngClass");
    }
    @Test
    public void testCase2() {
        System.out.println("in test case 2 of NewTestngClass");
    } 
}

testng.xml

这是一个配置文件,用于组织和运行TestNG测试用例。

当需要执行有限的测试而不是全部套件时,它非常方便使用。

<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name = "Suite1">
   <test name = "test1">
      <classes>
         <class name = "OrderofTestExecutionInTestNG"/>
    <class name = "NewTestngClass"/>
      </classes>
   </test>
</suite>

输出

in beforeTest
in beforeMethod
in test case 1 of OrderofTestExecutionInTestNG
in beforeMethod
in test case 2 of OrderofTestExecutionInTestNG
in beforeMethod
in test case 1 of NewTestngClass
in beforeMethod
in test case 2 of NewTestngClass

===============================================
Suite1
Total tests run: 4, Passes: 4, Failures: 0, Skips: 0
===============================================

场景2

当有2个TestNG类时,每个类都有2个@Test标记,并且分别有@BeforeTest和@BeforeMethod。在此场景中,所有的@BeforeTest方法将首先执行,但@BeforeMethod将根据各自的类和@Test执行。

步骤

  • 步骤1 −创建2个TestNG类−OrderofTestExecutionInTestNG和NewTestngClass。

  • 步骤2 −在这2个类中的每个类中编写2个不同的@Test方法−OrderofTestExecutionInTestNG和NewTestngClass。

  • 步骤3 −在这2个类中编写不同的@BeforeTest方法−OrderofTestExecutionInTestNG和NewTestngClass。

  • 步骤4 −在这2个类中编写不同的@BeforeMethod−OrderofTestExecutionInTestNG和NewTestngClass。

  • 步骤5 −现在按照以下方式创建testNG.xml以运行2个TestNG类。

  • 步骤6 −现在,在IDE中运行testNG.xml或直接运行testNG类,或者使用命令行编译和运行它。

例子

以下是TestNG类OrderofTestExecutionInTestNG的代码。

import org.testng.annotations.*;

public class OrderofTestExecutionInTestNG {
    // test case 1
    @Test
    public void testCase1() {
        System.out.println("in test case 1 of OrderofTestExecutionInTestNG");
    }
    // test case 2
    @Test
    public void testCase2() {
        System.out.println("in test case 2 of OrderofTestExecutionInTestNG");
    }
    @BeforeMethod
    public void beforeMethod() {
        System.out.println("in beforeMethod of OrderofTestExecutionInTestNG");
    }
    @BeforeTest
    public void beforeTest() {
        System.out.println("in beforeTest of OrderofTestExecutionInTestNG");
    }
}

以下是常见TestNG类的代码 – NewTestngClass。

import org.testng.annotations.*;

public class NewTestngClass {

    @Test
    public void testCase1() {
        System.out.println("in test case 1 of NewTestngClass");
    }
    @Test
    public void testCase2() {
        System.out.println("in test case 2 of NewTestngClass");
    }

    @BeforeTest
    public void beforeTest() {
        System.out.println("in beforeTest of NewTestngClass");
    }
    @BeforeMethod
    public void beforeMethod() {
        System.out.println("in beforeMethod of NewTestngClass");
 }
}

testng.xml

这是一个用于组织和运行TestNG测试用例的配置文件。

当只需要执行有限的测试而不是整个套件时,它非常方便。

<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name = "Suite1">
   <test name = "test1">
      <classes>
         <class name = "OrderofTestExecutionInTestNG"/>
    <class name = "NewTestngClass"/>
      </classes>
   </test>
</suite>

输出

in beforeTest of NewTestngClass
in beforeTest of OrderofTestExecutionInTestNG
in beforeMethod of OrderofTestExecutionInTestNG
in test case 1 of OrderofTestExecutionInTestNG
in beforeMethod of OrderofTestExecutionInTestNG
in test case 2 of OrderofTestExecutionInTestNG
in beforeMethod of NewTestngClass
in test case 1 of NewTestngClass
in beforeMethod of NewTestngClass
in test case 2 of NewTestngClass

===============================================
Suite1
Total tests run: 4, Passes: 4, Failures: 0, Skips: 0
===============================================

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程