TestNG中BeforeClass和BeforeTest之间的区别

时间:2015-06-02 04:38:39

标签: selenium selenium-webdriver testng

50%

As we know from official TestNG documentation: 带注释的方法将在调用当前类中的第一个测试方法之前运行。

@BeforeClass:在运行属于@BeforeTest:标记内的类的任何测试方法之前,将运行带注释的方法。

以上testng注释在功能上看起来都相似。 但是,该功能应该有一个独特的区别。 有人可以强调一下吗?

7 个答案:

答案 0 :(得分:90)

SeleniumAbstractTest.class

public abstract class SeleniumAbstractTest {

  @BeforeSuite
  public void beforeSuite() {
    System.out.println("BeforeSuite");
  }

  @BeforeTest
  public void beforeTest() {
    System.out.println("BeforeTest");
  }

  @BeforeClass
  public void beforeClass() {
    System.out.println("BeforeClass");
  }

  @BeforeMethod
  public void beforeMethod() {
    System.out.println("BeforeMethod");
  }

  @AfterMethod
  public void afterMethod() {
    System.out.println("AfterMethod");
  }

  @AfterClass
  public void afterClass() {
    System.out.println("AfterClass");
  }

  @AfterTest
  public void afterTest() {
    System.out.println("AfterTest");
  }

  @AfterSuite
  public void afterSuite() {
    System.out.println("AfterSuite");
  }

}

MyTestClass1.class

public class MyTestClass1 extends SeleniumAbstractTest {

  @Test
  public void myTestMethod1() {
    System.out.println("myTestMethod1");
  }

  @Test
  public void myTestMethod2() {
    System.out.println("myTestMethod2");
  }
}

MyTestClass2.class

public class MyTestClass2 extends SeleniumAbstractTest {

  @Test
  public void myTestMethod3() {
    System.out.println("myTestMethod3");
  }

  @Test
  public void myTestMethod4() {
    System.out.println("myTestMethod4");
  }
}

如果您有以下测试套件......

<suite name="Suite">
  <test name="Test1" >
    <classes>
       <class name="MyTestClass2" />
    </classes>
  </test>

  <test name="Test2">
    <classes>
      <class name="MyTestClass1"/>
      <class name="MyTestClass2"/>
    </classes>
  </test>
</suite>

...然后输出[缩进以便于阅读]将是

BeforeSuite
'   BeforeTest
'   '   BeforeClass
'   '   '   BeforeMethod
'   '   '   '   myTestMethod3
'   '   '   AfterMethod
'   '   '   BeforeMethod
'   '   '   '   myTestMethod4
'   '   '   AfterMethod
'   '   AfterClass
'   AfterTest
'   BeforeTest
'   '   BeforeClass
'   '   '   BeforeMethod
'   '   '   '   myTestMethod1
'   '   '   AfterMethod
'   '   '   BeforeMethod
'   '   '   '   myTestMethod2
'   '   '   AfterMethod
'   '   AfterClass
'   '   BeforeClass
'   '   '   BeforeMethod
'   '   '   '   myTestMethod3
'   '   '   AfterMethod
'   '   '   BeforeMethod
'   '   '   '   myTestMethod4
'   '   '   AfterMethod
'   '   AfterClass
'   AfterTest
AfterSuite

希望有所帮助:)

答案 1 :(得分:6)

@BeforeMethod - 在每个测试方法之前执行,例如使用@Test注释的方法

@BeforeTest - 仅在testng.xml文件中给出的标记之前执行。

简而言之,@ ByMethod适用于Java类中定义的测试。 @BeforeTest适用于testng.xml中定义的测试,即XML文件。

答案 2 :(得分:1)

如果你从另一个类扩展,那就是结果:

parentTest - BeforeTest- parent     
testClass1 - BeforeTest- test1    
parentTest - BeforeClass- parent    
testClass1 - BeforeClass- test1    
parentTest - BeforeMethod- parent    
testClass1 - BeforeMethod- test1    
testClass1 - myTestMethod1    
testClass1 - AfterMethod- test1    
parentTest - AfterMethod- parent    
parentTest - BeforeMethod- parent    
testClass1 - BeforeMethod- test1    
testClass1 - myTestMethod2    
testClass1 - AfterMethod- test1    
parentTest - AfterMethod- parent
testClass1 - AfterClass- test1    
parentTest - AfterClass- parent
testClass1 - AfterTest- test1
parentTest – AfterTest- parent

答案 3 :(得分:1)

我的意见:

@BeforeClass:在调用当前类中的第一个测试方法之前,将运行带注释的方法

@BeforeTest:在运行当前套件中的任何测试方法之前,将运行带注释的方法

答案 4 :(得分:0)

在解释差异之前,首先是一些测试术语

Test suite –由一个或多个测试标签组成。

Test tag-包含一个或多个测试类。

Test class –包含一种或多种方法。

说明

<suite name="suit1">
  <test name="TestTag1">
    <classes>
      <class name="TestClass1"/>
    </classes>
  </test>
  <test name="TestTag2">
    <classes>
      <class name="TestClass2"/>
      <class name="TestClass3"/>
    </classes>
  </test>
</suite>

@BeforeTest:将在任何测试标签之前仅调用一次,无论该标签中有多少个测试类或用@Test注释的方法有多少次,都将仅调用一次。在前面的XML示例@BeforeTest中,每个测试标签将被调用两次,一次在TestTag1之前,第二次在TestTag2之前,因此它可用于初始化内部不同测试类之间的公共对象一个测试标签。

@BeforeClass:将仅在任何测试之前调用一次,无论该测试类中有多少用@Test注释的方法,都将仅调用它。每个测试类别一次,在上一个XML示例中,@BeforeClass将被调用三次,一次在TestClass1之前,第二次在TestClass2之前,第三次在{ {1}},因此可用于初始化一个测试类中不同测试方法之间的公共对象。

TestClass3将为@BeforeSuite套装被调用

通话顺序如下

suit1

要了解有关@BeforeSuite @BeforeTest @BeforeClass @BeforeMethod @Test 的更多信息,请参考答案https://stackoverflow.com/a/52331616/1973933

答案 5 :(得分:0)

@BeforeClass: The annotated method will be run before the first test method in the current class is invoked. 
@BeforeMethod: The annotated method will be run before each test method.

The annotations above will also be honored (inherited) when placed on a superclass of a TestNG class. This is useful for example to centralize test setup for multiple test classes in a common superclass.

In that case, TestNG guarantees that the "@Before" methods are executed in inheritance order (highest superclass first, then going down the inheritance chain), and the "@After" methods in reverse order (going up the inheritance chain).

要了解有关TestNG批注的更多信息:https://testng.org/doc/documentation-main.html#annotations

答案 6 :(得分:0)

上述答案缺少的是@BeforeClass@BeforeTest批注之间的用法差异。

很明显,用@BeforeClass注释的方法(最常见的是设置方法)仅在该类中编写的所有测试用例之前执行一次。注释为'@BeforeTest'的方法将在每个测试用例之前执行,无论其计数/顺​​序/下划线逻辑如何。

因此,当我们的方法具有较长的调用且执行时间较长并且这些调用的输出在任何测试用例中都不会更改时,将使用@BeforeClass。例如,在设置方法中获取API响应,该方法将在所有测试中使用。 而@BeforeTest@是在我们需要做一些清理工作时使用的,并且每个测试都需要一些新鲜的资源来开始。例如,一个新创建的订单等。