动态TestNG XML创建。错误的XML。哪里我错了

时间:2018-04-14 17:52:04

标签: java selenium automated-tests testng testng-eclipse

动态TestNG XML创建。错误的XML。哪里我错了。

我希望我的testNG xml打印如下所示。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="App Automation Testing">
  <parameter name="BrowserName" value="chrome"/>
  <test name="MyTest1">
    <classes>
      <class name="etaf.tests.LaunchApp"/>
      <class name="etaf.tests.LoginTests"/>
    </classes>
  </test> <!-- MyTest1 -->
  <test name="MyTest2">
    <classes>
      <class name="etaf.tests.LaunchApp"/>
    </classes>
  </test> <!-- MyTest2 -->
</suite> <!-- App Automation Testing -->

但是使用下面的Java代码;此代码的数组类似于下面显示的数组

|testclass|testname|
|class1   |TC_LOGIN|
|class2   |TC_LOGIN|
|class1   |TC_WORK |
public void sample(String[][] dbArr, Map<String,String> parameters ) {

        //Create an instance on TestNG
        TestNG myTestNG = new TestNG();

        //Create an instance of XML Suite and assign a name for it.
        XmlSuite suite = new XmlSuite();
        suite.setName("App Automation Testing");
        suite.setParameters(parameters);

        String dummyName = "";
        List<XmlClass> classes1 = null;
        List<XmlTest> tests = new ArrayList<XmlTest>();
        XmlTest test1 = null;


        for(int i=0;i<dbArr.length;i++) {
            if(!dummyName.equalsIgnoreCase(dbArr[i][1])) {
                test1 = new XmlTest(suite);
                test1.setName(dbArr[i][1]);
                classes1 = new ArrayList<XmlClass> ();
                classes1.add(new XmlClass(dbArr[i][0]));
                dummyName = dbArr[i][1];

            } else if(dummyName.equalsIgnoreCase(dbArr[i][1])) {
                classes1.add(new XmlClass(dbArr[i][0]));
                dummyName = dbArr[i][1];
            }
            test1.setXmlClasses(classes1);
            tests.add(test1);
        }

        //add the list of tests to your Suite.
        suite.setTests(tests);

        //Add the suite to the list of suites.
        List<XmlSuite> suites = new ArrayList<XmlSuite>();
        suites.add(suite);

        System.out.println(suite.toXml());

        //Set the list of Suites to the testNG object you created earlier.
        myTestNG.setXmlSuites(suites);

        //invoke run() - this will run your class.
        myTestNG.run();
    }

就像这样打印。哪里错了。?请帮忙。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="App Automation Testing">
  <parameter name="BrowserName" value="chrome"/>
  <test name="TC_LOGIN">
    <classes>
      <class name="etaf.tests.LaunchApp"/>
      <class name="etaf.tests.LoginTests"/>
    </classes>
  </test> <!-- TC_LOGIN -->
  <test name="TC_LOGIN">
    <classes>
      <class name="etaf.tests.LaunchApp"/>
      <class name="etaf.tests.LoginTests"/>
    </classes>
  </test> <!-- TC_LOGIN -->
  <test name="TC_WORK">
    <classes>
      <class name="etaf.tests.LaunchApp"/>
    </classes>
  </test> <!-- TC_WORK -->
</suite> <!-- App Automation Testing -->

1 个答案:

答案 0 :(得分:2)

我认为问题在于你在迭代2D数组的方式。

这样做更容易。

import org.testng.TestNG;
import org.testng.xml.XmlClass;
import org.testng.xml.XmlSuite;
import org.testng.xml.XmlTest;

import java.util.*;

public class TestClassExample {
    public static void main(String[] args) {
        String[][] data = new String[][]{
                {"class1", "TC_LOGIN"},
                {"class2", "TC_LOGIN"},
                {"class1", "TC_WORK"}
        };
        sample(transformToMap(data), Collections.emptyMap());
    }

    private static Map<String, List<String>> transformToMap(String[][] data) {
        Map<String, List<String>> map = new HashMap<>();
        for (String[] aData : data) {
            String key = aData[1];
            List<String> classes = map.computeIfAbsent(key, k -> new ArrayList<>());
            classes.add(aData[0]);
        }
        return map;
    }

    private static void sample(Map<String, List<String>> dbArr, Map<String, String> parameters) {

        //Create an instance on TestNG
        TestNG myTestNG = new TestNG();

        //Create an instance of XML Suite and assign a name for it.
        XmlSuite suite = new XmlSuite();
        suite.setName("App Automation Testing");
        suite.setParameters(parameters);
        dbArr.forEach((key, value) -> {
            XmlTest xmlTest = new XmlTest(suite);
            xmlTest.setName(key);
            value.forEach(eachValue -> {
                XmlClass xmlClass = new XmlClass(eachValue, false);
                xmlTest.getClasses().add(xmlClass);
            });
        });

        //Add the suite to the list of suites.
        List<XmlSuite> suites = new ArrayList<>();
        suites.add(suite);

        System.out.println(suite.toXml());

        //Set the list of Suites to the testNG object you created earlier.
        myTestNG.setXmlSuites(suites);
    }
}

输出如下:

objc[59296]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/bin/java (0x102a554c0) and /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/lib/libinstrument.dylib (0x102ae14e0). One of the two will be used. Which one is undefined.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="App Automation Testing">
  <test thread-count="5" name="TC_WORK">
    <classes>
      <class name="class1"/>
    </classes>
  </test> <!-- TC_WORK -->
  <test thread-count="5" name="TC_LOGIN">
    <classes>
      <class name="class1"/>
      <class name="class2"/>
    </classes>
  </test> <!-- TC_LOGIN -->
</suite> <!-- App Automation Testing -->


Process finished with exit code 0