我有以下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版本实际上是正确的。这有什么不对?
答案 0 :(得分:4)
我和@BeforeSuite有类似的问题,并使用xml来定义我的测试 - 在xml文件中我的所有测试的空指针,但是最后一个。 TestNG使用反射创建一个运行测试所需的类 - 从xml文件中,它为我的案例中的xml中的每个'test'反射创建一个新对象。我怀疑你的场景中你有2个班级。在第一个中,空指针是因为sm未在第一个测试中初始化(因此您获得空指针),但是在第二个测试的实例中发生了初始化。
我的解决办法是让我的参考静态(在你的情况下保护静态SeleniumMngr sm;
换句话说,你不需要使用@BeforeTest或@BeforeClass(无论如何都不能正常工作,因为它会保持实例化sm对象)。
答案 1 :(得分:1)
如果你需要在执行每个类之前运行该方法,那么你应该使用@BeforeClass
@BeforeSuite
只执行一次 - 在套件被触发之前。