gpt4 book ai didi

java - 将 .properties 文件设置为 testng.xml

转载 作者:行者123 更新时间:2023-11-30 02:23:32 24 4
gpt4 key购买 nike

我有一个 data.properties 文件,其中包含以下几行:

data.login=login
data.password=password

我有一个简单的测试(使用 testng):

@Test
@Parameters({"data.login","data.password"})
public void testSimpleExample(String login, String password) throws Exception {
Assert.assertTrue(login.equals("login"));
Assert.assertTrue(password.equals("password"));
}

在 testng.xml 文件中,我可以编写下一个字符串:

<parameter name="data.login" value="login" />
<parameter name="data.password" value="password" />

但我想使用我的 data.properties 文件。我可以以某种方式将此文件设置到 testng.xml 并使用此属性文件中的参数吗?当然使用下一个代码:

Properties properties = new Properties();
properties.load(....);
....
properties.getProperty("data.login");

最佳答案

如果您不想使用 @juherr 提出的数据提供程序方法,可以使用另一种方法。

属性文件代表一个键/值对,因此本质上它是一个映射。因此,您执行以下操作:

  1. 确保您使用的是 TestNG v6.11(或)更高版本。
  2. 使用@Parameters注释就像您要从 TestNG 套件 xml 文件中获取值一样。
  3. 构建 org.testng.IAlterSuiteListener其中您读取属性文件,提取映射,然后将此映射作为参数注入(inject)到您的 XmlSuite 中。对象。
  4. 您可以通过 <listeners> 连接在 (3) 中创建的监听器。在您的套件 xml 中标记(或)通过服务加载器机制。

现在您可以继续使用@Parameters注释,但所有属性都是动态注入(inject)的。

这是所有这些操作的示例。

TestClass 如下所示

package com.rationaleemotions.stackoverflow.qn46224926;

import org.testng.annotations.Parameters;
import org.testng.annotations.Test;

public class TestClass {
@Test
@Parameters("name")
public void testMethod(String name) {
System.err.println("Hello " + name);
}
}

IAlterSuiteListener实现如下所示:

package com.rationaleemotions.stackoverflow.qn46224926;

import org.testng.IAlterSuiteListener;
import org.testng.xml.XmlSuite;

import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;

public class PropertyInjectorListener implements IAlterSuiteListener {
@Override
public void alter(List<XmlSuite> suites) {
XmlSuite suite = suites.get(0);
Properties properties = new Properties();
try {
properties.load(new FileReader("src/test/resources/46224926/qn46224926.properties"));
} catch (IOException e) {
throw new RuntimeException(e);
}
Map<String, String> params = new HashMap<>();
for (Map.Entry<Object, Object> each : properties.entrySet()) {
params.put(each.getKey().toString(), each.getValue().toString());

}
suite.setParameters(params);
}
}

示例属性文件如下所示:

name=Jack

套件 xml 文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="46224926_Suite" verbose="2">
<listeners>
<listener class-name="com.rationaleemotions.stackoverflow.qn46224926.PropertyInjectorListener"/>
</listeners>
<test name="46224926_test">
<classes>
<class name="com.rationaleemotions.stackoverflow.qn46224926.TestClass"/>
</classes>
</test>
</suite>

当您运行此命令时,您应该看到如下输出:

...
... TestNG 6.12 by Cédric Beust (cedric@beust.com)
...
Hello Jack
PASSED: testMethod("Jack")

===============================================
46224926_test
Tests run: 1, Failures: 0, Skips: 0
===============================================

===============================================
46224926_Suite
Total tests run: 1, Failures: 0, Skips: 0
===============================================

如您所见,套件 xml 文件不包含任何 <parameters>根本没有标签。但是@Test方法仍然假设它将通过 @Parameters 获取参数值注解。由于我们的监听器负责读取所有属性并将它们作为参数映射注入(inject),因此 TestNG 不会提示。

关于java - 将 .properties 文件设置为 testng.xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46224926/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com