Testng BeforeSuite只运行一个测试类

时间:2011-06-27 19:08:12

标签: xml selenium testng suite

我有以下testng.xml

<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似乎运行,然后它退出套件。第一个类没有执行,我看到第一个中的每个测试都有NullPointerException。

我只想要一个浏览器实例并执行多个测试。 testng doc建议我上面使用的xml版本实际上是正确的。这有什么不对?

2 个答案:

答案 0 :(得分:4)

我和@BeforeSuite有类似的问题,并使用xml来定义我的测试 - 在xml文件中我的所有测试的空指针,但是最后一个。 TestNG使用反射创建一个运行测试所需的类 - 从xml文件中,它为我的案例中的xml中的每个'test'反射创建一个新对象。我怀疑你的场景中你有2个班级。在第一个中,空指针是因为sm未在第一个测试中初始化(因此您获得空指针),但是在第二个测试的实例中发生了初始化。

我的解决办法是让我的参考静态(在你的情况下保护静态SeleniumMngr sm;

换句话说,你不需要使用@BeforeTest或@BeforeClass(无论如何都不能正常工作,因为它会保持实例化sm对象)。

答案 1 :(得分:1)

如果你需要在执行每个类之前运行该方法,那么你应该使用@BeforeClass @BeforeSuite只执行一次 - 在套件被触发之前。