在 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 方法对所有套件总是 运行 只有一次。

如果您在 Test1Test2 之间有一个 TestBase class,它具有 @BeforeSuite 方法,TestNG 将:

  1. 创建一个Test1实例
  2. 创建一个Test2实例
  3. 仅从 TestBase 调用 @BeforeSuite 方法一次,并将为此获取 Test1 OR Test2 实例。

最后,一个实例会初始化 WebDriver 对象,另一个不会。

正如@Mona 所建议的那样,您应该改用 @BeforeClass