2011-06-27 57 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对象)