Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将.properties文件设置为testng.xml_Java_Testng - Fatal编程技术网

Java 将.properties文件设置为testng.xml

Java 将.properties文件设置为testng.xml,java,testng,Java,Testng,我有一个带有以下行的data.properties文件: data.login=login data.password=password 我有一个简单的测试(使用testng): 在testng.xml文件中,我可以编写下一个字符串: <parameter name="data.login" value="login" /> <parameter name="data.password" value="password" /> 在这里,它是的完美用例 如果您不想使用@

我有一个带有以下行的data.properties文件:

data.login=login
data.password=password
我有一个简单的测试(使用testng):

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

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

在这里,它是的完美用例


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

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

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

    这是一个正在运行的示例

    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);
        }
    }
    
    <?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文件根本不包含任何
    标记。但是
    @Test
    方法仍然假设它将通过
    @Parameters
    注释获取参数值。由于我们的侦听器负责读取所有属性并将它们作为参数映射注入,因此TestNG不会抱怨。

    您需要手动执行此操作,xml可以包含文件名,您可以使用属性读取它。好的,但是需要@Parameters注释做什么呢?例如,如果我有100个参数,我是否应该像单独的行一样将所有参数都放入testng.xml中?在哪里可以找到支持XML配置值的@Parameters注释的文档?您从哪里获得
    语法?我在这里找到的文档说,必须为xml参数的初始化注释构造函数,如:@XMLParameters(“/path/to/testing.xml”)。此外,我认为JunitExt库不支持将属性从属性文件导入testing.xml文件。看起来您应该在Junit构造函数中加载属性,或者在xml中定义属性。@squarephoenix-我相信这里的测试运行者是TestNG而不是Junit。@Krishnan Mahadevan您是对的,这是关于TestNG而不是Junit的,这是我需要的!非常感谢你!你好@juherr,你能帮我发帖子吗:谢谢
    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);
        }
    }
    
    <?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
    ===============================================