在 Test NG 中第一次 class 执行后,全局变量设置为空
Global variables are set to null after first class execution in Test NG
我正在尝试使用 TestNG 构建一个自动化框架,在其中我可以 运行 多个 class 一个接一个地放在一个套件中。我有一个基础 class (TestBase.java),其中我有所有全局 (class) 变量以及 BeforeSuite 和 AfterSuite 方法,它们正在初始化和销毁这些全局变量,例如将在整个过程中使用的 WebDriver 对象所有测试 classes.
我的testng.xml是这样的:
<suite name="ShunyaAutomation" >
<test name="ShunyaAutomation_Firefox" preserve-order="true" >
<parameter name="browser" value="firefox"/>
<parameter name="runType" value="local"/>
<classes >
<class name="org.shunya.Test1" />
<class name="org.shunya.Test2" />
</classes>
</test>
</suite>
我希望@BeforeSuite 方法初始化 WebDriver 对象和其他方法,它确实这样做了,然后 Test1.java 和 Test2.java 中的所有 @Test 方法都应该能够使用 Webdriver 对象。
当我 运行 这个时,Test1.java class 中的 @Test 方法成功 运行 但是当执行到达 Test2.java 时,所有这些对象包括由 @BeforeSuite 方法初始化的 WebDriver 对象被取消,我在这些对象上得到一个 NullPointer 异常。谁能建议如何实现这一目标?
*我可以通过将所有变量声明为静态变量来实现。但是我不想将所有这些变量都设置为静态,因为我希望能够 运行 使用 Selenium Grid 和 TestNG 并行执行同时执行多个套件。
@BeforeSuite
方法对所有套件总是 运行 只有一次。
如果您在 Test1
和 Test2
之间有一个 TestBase
class,它具有 @BeforeSuite
方法,TestNG 将:
- 创建一个
Test1
实例
- 创建一个
Test2
实例
- 仅从
TestBase
调用 @BeforeSuite
方法一次,并将为此获取 Test1
OR Test2
实例。
最后,一个实例会初始化 WebDriver 对象,另一个不会。
正如@Mona 所建议的那样,您应该改用 @BeforeClass
。
我正在尝试使用 TestNG 构建一个自动化框架,在其中我可以 运行 多个 class 一个接一个地放在一个套件中。我有一个基础 class (TestBase.java),其中我有所有全局 (class) 变量以及 BeforeSuite 和 AfterSuite 方法,它们正在初始化和销毁这些全局变量,例如将在整个过程中使用的 WebDriver 对象所有测试 classes.
我的testng.xml是这样的:
<suite name="ShunyaAutomation" >
<test name="ShunyaAutomation_Firefox" preserve-order="true" >
<parameter name="browser" value="firefox"/>
<parameter name="runType" value="local"/>
<classes >
<class name="org.shunya.Test1" />
<class name="org.shunya.Test2" />
</classes>
</test>
</suite>
我希望@BeforeSuite 方法初始化 WebDriver 对象和其他方法,它确实这样做了,然后 Test1.java 和 Test2.java 中的所有 @Test 方法都应该能够使用 Webdriver 对象。
当我 运行 这个时,Test1.java class 中的 @Test 方法成功 运行 但是当执行到达 Test2.java 时,所有这些对象包括由 @BeforeSuite 方法初始化的 WebDriver 对象被取消,我在这些对象上得到一个 NullPointer 异常。谁能建议如何实现这一目标?
*我可以通过将所有变量声明为静态变量来实现。但是我不想将所有这些变量都设置为静态,因为我希望能够 运行 使用 Selenium Grid 和 TestNG 并行执行同时执行多个套件。
@BeforeSuite
方法对所有套件总是 运行 只有一次。
如果您在 Test1
和 Test2
之间有一个 TestBase
class,它具有 @BeforeSuite
方法,TestNG 将:
- 创建一个
Test1
实例 - 创建一个
Test2
实例 - 仅从
TestBase
调用@BeforeSuite
方法一次,并将为此获取Test1
ORTest2
实例。
最后,一个实例会初始化 WebDriver 对象,另一个不会。
正如@Mona 所建议的那样,您应该改用 @BeforeClass
。