0

我有以下 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 文档表明我上面使用的 xml 版本实际上是正确的。这里有什么问题?

4

2 回答 2

4

我在@BeforeSuite 和使用 xml 定义我的测试时遇到了类似的问题 - 我在 xml 文件中的所有测试的空指针,但最后一个。TestNG 正在使用反射来创建运行测试所需的类 - 在我的情况下,它从 xml 文件中为 xml 中的每个“测试”反射地创建一个新对象,我怀疑对于你有 2 个类的场景也是如此. 在第一个中,空指针是因为 sm 在第一次测试中没有初始化(所以你得到空指针)但是初始化发生在第二次测试的实例中。

我的解决方案是使我的参考静态(在你的情况下受保护的静态 SeleniumMngr sm;

换句话说,您不需要使用 @BeforeTest 或 @BeforeClass (无论如何都不会按您的意愿工作,因为将继续实例化 sm 对象)。

于 2012-10-04T20:45:16.173 回答
1

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

于 2011-06-27T20:22:59.957 回答