TestNG中BeforeClass和BeforeTest之间的区别

Pra*_*ams 25 testng selenium selenium-webdriver

As we know from official TestNG documentation:
Run Code Online (Sandbox Code Playgroud)

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

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

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

pee*_*tya 103

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");
  }

}
Run Code Online (Sandbox Code Playgroud)

MyTestClass1.class

public class MyTestClass1 extends SeleniumAbstractTest {

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

  @Test
  public void myTestMethod2() {
    System.out.println("myTestMethod2");
  }
}
Run Code Online (Sandbox Code Playgroud)

MyTestClass2.class

public class MyTestClass2 extends SeleniumAbstractTest {

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

  @Test
  public void myTestMethod4() {
    System.out.println("myTestMethod4");
  }
}
Run Code Online (Sandbox Code Playgroud)

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

<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>
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你 :)

  • 这个答案的底部正是我正在寻找的,太棒了! (2认同)

小智 6

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

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

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


Mel*_*ius 6

在解释区别之前,首先这是一些测试术语

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>
Run Code Online (Sandbox Code Playgroud)

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

@BeforeClass: 它只会在任何测试之前调用一次,无论@Test这个测试类内部注释了多少方法,每个测试类只会调用一次,在前面的XML例子中@BeforeClass会调用三次,一次之前TestClass1之前第二次TestClass2和第三次之前,TestClass3因此它可以用于初始化一个测试类中不同测试方法之间的公共对象。

@BeforeSuite将被称为一次suit1诉讼

调用顺序如下

@BeforeSuite
    @BeforeTest
        @BeforeClass
            @BeforeMethod
                @Test
Run Code Online (Sandbox Code Playgroud)

要了解更多@BeforeMethod,请参考答案/sf/answers/3663213151/