2011-06-27 92 views
0

我有以下的testng.xmlTestNG的BeforeSuite只運行一個測試類

<test name="CommonReportingTests" preserve-order="true"> 
<classes> 
    <class name="com.blah.ReportRunTests"> 
     <methods> 
      <include name="login" /> 
      <include name="checkHomeTab" /> 
      <include name="checkReportsTab" /> 
      <include name="checkReportsExist" /> 
      <include name="reportsCleanup" />    
     </methods> 
    </class> 

    <class name="com.blah.RestoreActivityTests"> 
     <methods> 
      <include name="login" /> 
      <include name="checkHomeTab" /> 
      <include name="checkReportsTab" /> 
      <include name="checkReportsExist" />    
      <include name="expandReportsTabAndClickRestoreActivity" />  
     </methods> 
    </class> 
</classes> 

我TestBase類有這樣的:

@Parameters({ "webconsoleStartupURL" }) 
@BeforeSuite(description = "Perform class setup tasks") 
public void beforeClass(final String webconsoleStartupURL) 
     throws ClassNotFoundException, InstantiationException, 
     IllegalAccessException { 
    sm = new SeleniumMgr(webconsoleStartupURL); 
    sm.startSelenium(); 
} 

@AfterSuite(description = "Perform class teardown tasks") 
public void afterClass() { 
    sm.stopSelenium(); 
} 

當我執行測試,只有在xml中的第二個測試,即RestoreActivityTests似乎運行和t當它退出套件時。第一個類沒有執行,我在第一個測試中看到了NullPointerException。

我只想要瀏覽器的一個實例並執行多個測試。 testng文檔建議我上面使用的xml版本實際上是正確的。這裏有什麼問題?

+0

這是使用Selenium 2.0嗎? – LarsH

回答

1

如果您需要在執行每個類之前運行的方法,那麼您應該使用@BeforeClass@BeforeSuite將僅執行一次 - 在套件觸發之前。

+0

不,使用@BeforeClass會再次實例化Selenium,即我會在每個測試類中看到一個新的實例我累了,那有效,但它不是我想要的。我希望瀏覽器只出現一次,在xml中指定的多個類中完成所有測試,然後退出 – Jai

+0

爲什麼你說「NO」?AJ在他的描述中絕對正確@BeforeSuite。回到你的問題,你可能想要使用@BeforeTest並將你的類放在單獨的標籤中。 –

4

我有與@BeforeSuite類似的問題,並使用XML來定義我的測試 - 空指針的所有我的測試在xml文件,但最後。 TestNG使用反射來創建它運行測試所需的類 - 從xml文件中,它爲xml中的每個「測試」創建一個新對象,在我的情況下爲&我懷疑在您的場景中您有兩個類。在第一個空指針是因爲sm沒有在第一個測試中初始化(所以你得到空指針),但是在第二次測試的實例中發生了初始化。

我的解決辦法是讓我參考靜態(在你的情況下受保護的靜態SeleniumMngr平方米;

。換句話說,你並不需要使用@BeforeTest或是否仍要因爲意志@BeforeClass(將無法正常工作繼續實例化sm對象)