web-dev-qa-db-ja.com

TestNGのBeforeClassとBeforeTestの違い

As we know from official TestNG documentation:

@BeforeClass:注釈付きメソッドは、現在のクラスの最初のテストメソッドが呼び出される前に実行されます。

@BeforeTest:注釈付きメソッドは、<test>タグ内のクラスに属するテストメソッドが実行される前に実行されます。

上記のtestngアノテーションは両方とも機能的に似ています。ただし、機能には独自の違いがあるはずです。誰もこれを強調してもらえますか?

22
Prashanth Sams

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

それが役に立てば幸い :)

95
peetya

@BeforeMethod-すべてのテストメソッドの前に実行されます。 @Testアノテーションを使用するメソッド

@BeforeTest-testng.xmlファイルで指定されたタグの前でのみ実行されます。

簡単に言えば、@ BeforeMethodは、Javaクラスで定義されたテストで動作します。@ BeforeTestは、testng.xmlで定義されたテスト、つまりXMLファイルで動作します。

6
Dinesh Nikam

私の意見:

@BeforeClass:注釈付きメソッドは、最初のテストメソッド現在のクラス内が呼び出される前に実行されます

@BeforeTest:注釈付きメソッドは、テストメソッド現在のスイート内が実行される前に実行されます

1
MorganChen

別のクラスから拡張する場合、結果は次のとおりです。

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
1
David_Garcia

違いを説明する前に、まずこれはいくつかのテスト用語です

_Test suite_ – 1つ以上のテストタグで構成されます。

_Test tag_-1つ以上のテストクラスで構成されます。

_Test class_ – 1つ以上のメソッドで構成されます。

例として

_<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_:テストタグの前に1回だけ呼び出されます。タグ内のテストクラスの数や_@Test_アノテーションが付けられたメソッドの数に関係なく、テストタグごとに1回だけ呼び出されます。 、前のXMLの例では_@BeforeTest_が2回呼び出されます。1回はbefore _TestTag1_の前に、2回目は_TestTag2_の前に呼び出されます。

_@BeforeClass_:テストの前に1回だけ呼び出されますclass、この中に_@Test_アノテーションが付けられたメソッドの数に関係なくテストクラスは、各テストクラスに対して1回だけ呼び出されます。前のXMLの例では_@BeforeClass_が3回呼び出され、1回は_TestClass1_の前に2回_TestClass2_および_TestClass3_の前の3回目なので、1つのテストクラス内の異なるテストメソッド間の共通オブジェクトを初期化するために使用できます。

_@BeforeSuite_スーツに対して_suit1_が1回呼び出されます

呼び出しの順序は次のようになります

_@BeforeSuite
    @BeforeTest
        @BeforeClass
            @BeforeMethod
                @Test
_

_@BeforeMethod_の詳細については、回答を参照してください https://stackoverflow.com/a/52331616/19739

0
Melad Basilius