将.properties文件设置为testng.xml

时间:2017-09-14 17:15:54

标签: java testng

我有一个 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");

2 个答案:

答案 0 :(得分:1)

在这里,它是a data provider的完美用例。

@DataProvider
public Object[][] dp() {
  Properties properties = new Properties();
  properties.load(....);
  ....
  String login = properties.getProperty("data.login");
  String password = properties.getProperty("data.password");
  return new Object[][] { new Object[]{login, password} };
}

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

答案 1 :(得分:1)

如果您不想使用@juherr提供的数据提供程序方法,那么这是另一种方法。

属性文件表示键/值对,因此基本上是一个映射。所以你要做到以下几点:

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

    以下是所有这些内容的样本。

    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注释获取参数值。由于我们的监听器负责读取所有属性并将它们作为参数映射注入,因此TestNG不会抱怨。

相关问题