2012-03-21 128 views
1

我試圖以確定的順序運行測試用例,但沒有運氣。當我看到之後,從另一個測試方法與@AfterClass運行註解的方法:爲什麼@AfterClass在其他類的測試之後調用?

Configuring TestNG with: [email protected]e9d6 
RUN class com.example.testng.ITCaseOne.beforeClass() 
RUN class com.example.testng.ITCaseOne.someCase() 
RUN class com.example.testng.ITCaseTwo.beforeClass() 
RUN class com.example.testng.ITCaseTwo.someCase() 
RUN class com.example.testng.ITCaseOne.anotherCase() 
RUN class com.example.testng.ITCaseOne.afterClass() 
RUN class com.example.testng.ITCaseTwo.anotherCase() 
RUN class com.example.testng.ITCaseTwo.afterClass() 
Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.25 sec 

它失敗,因爲從ITCaseTwo所有@Test必須被調用後,才ITCaseOne.afterClass()(因爲我用從一個案例硒和測試應該檢查相應的頁面) 。

我的簡單的類:

public class ITCaseOne { 

    @BeforeClass 
    public void beforeClass() { 
     System.out.printf("RUN %s.beforeClass()\n", getClass()); 
    } 

    @AfterClass(alwaysRun = true) 
    public void afterClass() { 
     System.out.printf("RUN %s.afterClass()\n", getClass()); 
    } 

    @Test(groups = "std-one") 
    public void someCase() { 
     System.out.printf("RUN %s.someCase()\n", getClass()); 
    } 

    @Test(groups = "logic-one", dependsOnGroups = "std-one") 
    public void anotherCase() { 
     System.out.printf("RUN %s.anotherCase()\n", getClass()); 
    } 

} 

public class ITCaseTwo { 

    @BeforeClass 
    public void beforeClass() { 
     System.out.printf("RUN %s.beforeClass()\n", getClass()); 
    } 

    @AfterClass(alwaysRun = true) 
    public void afterClass() { 
     System.out.printf("RUN %s.afterClass()\n", getClass()); 
    } 

    @Test(groups = "std-two") 
    public void someCase() { 
     System.out.printf("RUN %s.someCase()\n", getClass()); 
    } 

    @Test(groups = "logic-two", dependsOnGroups = "std-two") 
    public void anotherCase() { 
     System.out.printf("RUN %s.anotherCase()\n", getClass()); 
    } 

} 

如果它是重要的我使用maven-failsafe-plugin 2.12和testng 6.4

(順便說一句,我也嘗試使用套件文件與preserve-order="true"但它不適用於我)。

在此先感謝!

回答

1

本質上你有依賴方法的要求。如果你將它們放在不同的班級中,那麼你可以讓第二班的@Test第二班,依靠第一班中的組中的一個。 所以,如果你保持 @Test(組=「STD-二」,dependsOnGroups =「邏輯1」),事情應該工作,U希望的方式..

+0

哎呀。我剛剛在我的問題中解決了錯誤,以澄清我期望的內容。我只需要在第一課的所有方法之後執行第二課的所有方法。 – 2012-03-22 14:23:32

+0

答案仍然成立。 – 2012-03-22 14:35:52

+0

是的,它的工作原理,謝謝。但它有一些缺點:所有類都應該用這種方式鏈接,當第一個測試用例中的一個測試失敗時,所有其他類都將被跳過。此解決方案也爲測試執行添加了嚴格的順序,但實際上我並不在乎誰會首先被調用 - 「ITCaseOne」或「ITCaseTwo」。 – 2012-03-23 12:29:57

2

我能重現此問題,這是一個錯誤。我會研究它。與此同時,評論出兩個dependsOnGroups之一應該修復不正確的行爲。

+0

是的,它只有在*註釋*'dependsOnGroups'屬性時纔有效。 – 2012-03-23 12:22:54

1

我發現又一種方式如何解決它與測試套件和preserve-order="true"(啓發When needing to run tests from 2 classes from testng.xml, why does TestNG pick mehods randomly from classes?)。

通過maven-failsafe-plugin

<plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-failsafe-plugin</artifactId> 
     <version>2.12</version> 
     <configuration> 
       <suiteXmlFiles> 
          <suiteXmlFile>${basedir}/src/test/config/testng.xml</suiteXmlFile> 
       </suiteXmlFiles> 
     </configuration> 
</plugin> 

與以下內容

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > 
<suite name="Selenium tests" preserve-order="true"> 
    <test name="Test #1"> 
     <classes> 
      <class name="com.example.testng.ITCaseOne" /> 
     </classes> 
    </test> 
    <test name="Test #2"> 
     <classes> 
      <class name="com.example.testng.ITCaseTwo" /> 
     </classes> 
    </test> 
</suite> 

處理它創建src/test/config/testng.xml而現在它按預期工作:

RUN class com.example.testng.ITCaseOne.beforeClass() 
RUN class com.example.testng.ITCaseOne.someCase() 
RUN class com.example.testng.ITCaseOne.anotherCase() 
RUN class com.example.testng.ITCaseOne.afterClass() 
RUN class com.example.testng.ITCaseTwo.beforeClass() 
RUN class com.example.testng.ITCaseTwo.someCase() 
RUN class com.example.testng.ITCaseTwo.anotherCase() 
RUN class com.example.testng.ITCaseTwo.afterClass() 
相關問題