在 ISuite class (TestNG) 中获取控制台参数

Get console parameters in ISuite class (TestNG)

我正在编写一个新的侦听器,以在套件开始和结束时打开和关闭数据库连接。我在 testng.xml 文件中定义了几个参数来存储数据库凭据,例如:

<parameter name="DB.user" value="user"/>

现在,我正在尝试在侦听器中获取此参数:

public class DatabaseListener implements ISuiteListener {
@Override
public void onStart(ISuite suite) {

    System.out.println( suite.getXmlSuite().getParameter("DB.user"));
}

这工作正常,但我还需要如果我通过命令行覆盖值,这个参数将被更新:

-DDB.user=test

我总是得到 testng.xml(用户)中定义的值,而不是我在控制台(测试)中设置的值。

例如,在测试中我执行下一步以获取运行时值:

@BeforeClass()
@Parameters({"DB.user"})
public void beforeClass(String DBUser)

如何在侦听器中执行此操作?

感谢和问候。

TestNG 能够通过使用它们的名称更新 <parameters>,然后使用通过 JVM 参数 (-D) 提供的值覆盖它们的值。但这发生在更晚的阶段,远在实际 @Test 方法被调用之前。

但是当 TestNG 正在调用套件级别的侦听器时,情况并非如此,而这正是您正在做的。此时,TestNG 仍只是构建套件文件,上述参数值解析尚未发生。这就解释了为什么您总是看到套件文件中存在的值。

处理此问题的一种方法是执行以下操作:

public class DatabaseListener implements ISuiteListener {
@Override
public void onStart(ISuite suite) {

    String fromSuite = suite.getXmlSuite().getParameter("DB.user");
    String parameter = System.getProperty("DB.user", fromSuite);
    System.out.println( parameter);
}

如您所见,您正在从系统属性中明确查询,同时定义来自您的套件的默认值。有点像 TestNG 解析参数的方式(但在稍后阶段)