使用TestNG类将动态值传递给测试方法参数

时间:2017-07-04 06:55:43

标签: selenium automated-tests testng testng-dataprovider

我正在自动化在多线程环境中运行的网页,因此我将每个测试结果导出到文件系统中,并且我希望将每个测试结果保持唯一以供将来参考。那么有没有办法在从TestNG类调用它时动态地将文件名作为参数传递给测试方法。

我知道我们可以从 .xml 文件中传递参数但是如果我这样做,那么值将更像静态,并且可以被并行运行的所有线程看到。

测试类将从主方法调用,如下所示

public class Test  {

    public static void main(String[] args) throws ParseException {

        try
        {
            TestNG testng = new TestNG();
            testng.setTestClasses(new Class[] { Testing.class });
            testng.run(); 
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

    }
}

Bellow代码是我的测试方法

公共课测试{

@Test
@Parameters("filename")
public void testMethod(String fileName){

    System.out.println("filename is: "+fileName);

   // ---- remaining test logic -----
}

}

或者我们可以使用 TestListenerAdapter onStart()方法来注入参数值......?。

3 个答案:

答案 0 :(得分:1)

如果您想要唯一的文件名,可以添加时间戳

Date date = new Date();
Format formatter = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss");
String timeStamp = formatter.format(date);

String fileName = "TestResults-" + timeStamp;

答案 1 :(得分:1)

您可以将值存储到ITestContext,以便所有测试都可用。

您可以在配置方法(例如@BeforeSuite)或监听器中设置值。

答案 2 :(得分:0)

在运行时将动态参数传递给TestNG套件

以下代码的作用: 我想在运行时为每个测试添加参数列表。这些参数作为maven运行时参数传递。使用System.getProperty()方法读取它们,如下所示。然后将这些参数添加到套件内部的测试中,并成功运行testng。这在其他情况下也非常有用。

下面的代码读取testng.xml文件并将参数添加到

List<String> parameters = new ArrayList<>();
parameters = Arrays.asList(System.getProperty("parameters").split(",");

TestNG tng = new TestNG();
File initialFile = new File("testng.xml");
InputStream inputStream = FileUtils.openInputStream(initialFile);
Parser p = new Parser(inputStream);
List<XmlSuite> suites = p.parseToList();
for(XmlSuite suite:suites){
    List<XmlTest> tests = suite.getTests();
    for (XmlTest test : tests) {
         for (int i = 0; i < parameters.size(); i++) {
            HashMap<String, String> parametersMap = new HashMap<>();
            parametersMap.put("parameter",parameters.get(i));
            test.setParameters(parametersMap);
        }
    }
}
tng.setXmlSuites(suites);
tng.run();