简体   繁体   English

通过Maven / Testng通过动态自定义TestNG文件运行测试

[英]Run Tests through a Dynamic Custom TestNG File through Maven/Testng

I'm trying to setup my testng.xml in way where it points to a dynamically customized testng xml file to determine what needs to be tested based on how many mobile devices are connected, (drivers.xml). 我正在尝试设置testng.xml,使其指向动态自定义的testng xml文件,以便根据连接的移动设备数量(drivers.xml)来确定需要测试的内容。 I have a Java Class the creates and contains Appium Drivers, then pass those values for each driver into another Java class to setup parameters and values for each driver, so that I can use @Parameters annotation to pass the required driver info for parallel testing. 我有一个Java类,该类创建并包含Appium驱动程序,然后将每个驱动程序的值传递到另一个Java类中,以设置每个驱动程序的参数和值,以便我可以使用@Parameters批注传递所需的驱动程序信息以进行并行测试。

Currently the way I have testng.xml file setup doesn't seem to run any tests at all. 目前,我安装testng.xml文件的方式似乎根本没有运行任何测试。 I've tried looking for answers online, but for TestNG, there doesn't seem to be much of getting values from other custom xml files. 我尝试过在线寻找答案,但是对于TestNG,似乎没有太多从其他自定义xml文件获取值的方法。 (I'm not sure if I'm phrasing my question correctly or not.) Has anyone encountered problems for this setup? (我不确定我的措词是否正确。)有人遇到此设置问题吗?

Here are the Xml files and the Java class that creates the custom xml file: 这是Xml文件和创建自定义xml文件的Java类:

testNG.xml: testNG.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">

<suite name="All-Tests">

    <suite-files>

        <suite-file path="./drivers.xml"></suite-file>

    </suite-files>

</suite>

drivers.xml (custom xml file): drivers.xml(自定义xml文件):

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">

-<suite name="suite">


-<test name="driver1">

<parameter name="platform" value="Android"/>
<parameter name="udid" value="192.168.174.102:5555"/>

<parameter name="URL" value="http://127.0.0.1:5000/wd/hub"/>


-<parameter name="port" value="8200">

<package name="BaseTest"/>

</parameter>

</test>


-<test name="driver2">

<parameter name="platform" value="Android"/>

<parameter name="udid" value="192.168.174.101:5555"/>

<parameter name="URL" value="http://127.0.0.1:5000/wd/hub"/>


-<parameter name="port" value="2801">

<package name="BaseTest"/>

</parameter>

</test>

</suite>

Xml Maker Java Class: Xml Maker Java类:

public class XMLMaker {

    private boolean docTypeDeclared = false;

    public DocumentBuilderFactory docDriverSetup;

    public DocumentBuilder driverSetup;

    public int connectedDevices = 0;

    Document doc;

    TransformerFactory transformerFactory;

    Transformer transformer;

    public void setupDriverXMLFile(List <AppiumDriver<MobileElement>> driverList) {

        try {

            docDriverSetup = DocumentBuilderFactory.newInstance();

            driverSetup = docDriverSetup.newDocumentBuilder();

            doc = driverSetup.newDocument();


            transformerFactory = TransformerFactory.newInstance();
            transformer = transformerFactory.newTransformer();

            if(docTypeDeclared == false) {
                DOMImplementation domImpl = doc.getImplementation();
                DocumentType docType = domImpl.createDocumentType("suite", "","http://testng.org/testng-1.0.dtd");
                doc.appendChild(docType);
                docTypeDeclared = true;
            }

            Element suiteElement = doc.createElement("suite");


            for(AppiumDriver<MobileElement> driver: driverList) {

                Element rootElement = doc.createElement("test");
                suiteElement.appendChild(rootElement);
                rootElement.setAttribute("name", (String) driver.getCapabilities().getCapability("deviceName"));

                Element deviceNameEle = doc.createElement("parameter");
                deviceNameEle.setAttribute("name", "deviceName");
                deviceNameEle.setAttribute("value", (String) driver.getCapabilities().getCapability("deviceName"));
                rootElement.appendChild(deviceNameEle);

                Element platformEle = doc.createElement("parameter");
                platformEle.setAttribute("name", "platform");
                platformEle.setAttribute("value", driver.getPlatformName()+"");
                rootElement.appendChild(platformEle);

                Element udidEle = doc.createElement("parameter");
                udidEle.setAttribute("name", "udid");
                udidEle.setAttribute("value", (String)driver.getCapabilities().getCapability("udid"));
                rootElement.appendChild(udidEle);

                Element urlPort = doc.createElement("parameter");
                urlPort.setAttribute("name", "URL");
                urlPort.setAttribute("value", (String)driver.getCapabilities().getCapability("appiumURL"));
                rootElement.appendChild(urlPort);

                Element devicePort = doc.createElement("parameter");

                if((driver.getPlatformName()+"").
                        toLowerCase().contains("android")) {
                        devicePort.setAttribute("name", "port");
                        devicePort.setAttribute("value", (String)driver.getCapabilities().getCapability("systemPort"));

                }
                if ((driver.getPlatformName()+"").
                        toLowerCase().contains("ios")) {
                        devicePort.setAttribute("name", "port");
                        devicePort.setAttribute("value", (String)driver.getCapabilities().getCapability("wdaLocalPort"));
                }

                rootElement.appendChild(devicePort);

                Element packageName = doc.createElement("package");
                packageName.setAttribute("name", "BaseTest");
                devicePort.appendChild(packageName);

                connectedDevices++;
            }   
            suiteElement.setAttribute("parallel", "tests");
            suiteElement.setAttribute("thread-count", connectedDevices+"");
            doc.appendChild(suiteElement);

        } catch(ParserConfigurationException pce) {
            pce.printStackTrace();
        } catch (TransformerConfigurationException e) {
            e.printStackTrace();
        } 

    }


    public void createDriverFile() throws TransformerConfigurationException {
        transformerFactory = TransformerFactory.newInstance();
        transformer = transformerFactory.newTransformer();
        DOMSource source = new DOMSource(doc);
        StreamResult result = new StreamResult(new File("./drivers.xml"));

        try {
            transformer.transform(source, result);

            System.out.println("File Updated");
        } catch (TransformerException e) {
            e.printStackTrace();
        }

    }

}

Figured out the Issue. 找出问题。 First, the name for the Suite File path needed to be "drivers.xml" instead "./drivers.xml". 首先,套件文件路径的名称必须是“ drivers.xml”而不是“ ./drivers.xml”。

  <?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">

<suite name="All-Tests">

<suite-files>

    <suite-file path="drivers.xml"></suite-file>

</suite-files>

</suite>

Second, my XmlMaker Class wasn't setting up the Xml file creation, such as a name is required with the Suite tags, declaring doctype, plus how I had to do some tweaks with how to do Element objects when constructing my custom xml file. 其次,我的XmlMaker类没有设置Xml文件的创建,例如Suite标签需要一个名称,声明doctype,以及在构造自定义xml文件时如何对Element对象进行一些调整。

public class XMLMaker {



    public DocumentBuilderFactory docDriverSetup;

    public DocumentBuilder driverSetup;

    public int connectedDevices = 0;

    Document doc;

    TransformerFactory transformerFactory = TransformerFactory.newInstance();

    Transformer transformer;

    public void setupDriverXMLFile(List <AppiumDriver<MobileElement>> driverList) {

        System.out.println("List size: "+ driverList.size());
        try {

            docDriverSetup = DocumentBuilderFactory.newInstance();

            driverSetup = docDriverSetup.newDocumentBuilder();

            doc = driverSetup.newDocument();

            transformer = transformerFactory.newTransformer();

            transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "http://testng.org/testng-1.0.dtd");

            Element suiteElement = doc.createElement("suite");
            suiteElement.setAttribute("name", "All-tests");

            for(AppiumDriver<MobileElement> driver: driverList) {

                Element rootElement = doc.createElement("test");
                suiteElement.appendChild(rootElement);
                rootElement.setAttribute("name", (String) driver.getCapabilities().getCapability("deviceName"));

                Element deviceNameEle = doc.createElement("parameter");
                deviceNameEle.setAttribute("name", "deviceName");
                deviceNameEle.setAttribute("value", (String) driver.getCapabilities().getCapability("deviceName"));
                rootElement.appendChild(deviceNameEle);

                Element platformEle = doc.createElement("parameter");
                platformEle.setAttribute("name", "platform");
                platformEle.setAttribute("value", driver.getPlatformName()+"");
                rootElement.appendChild(platformEle);

                Element udidEle = doc.createElement("parameter");
                udidEle.setAttribute("name", "udid");
                udidEle.setAttribute("value", (String)driver.getCapabilities().getCapability("udid"));
                rootElement.appendChild(udidEle);

                Element urlPort = doc.createElement("parameter");
                urlPort.setAttribute("name", "URL");
                urlPort.setAttribute("value", (String)driver.getCapabilities().getCapability("appiumURL"));
                rootElement.appendChild(urlPort);

                Element devicePort = doc.createElement("parameter");

                if((driver.getPlatformName()+"").
                        toLowerCase().contains("android")) {
                        devicePort.setAttribute("name", "port");
                        devicePort.setAttribute("value", driver.getCapabilities().getCapability("systemPort")+"");

                }
                if ((driver.getPlatformName()+"").
                        toLowerCase().contains("ios")) {
                        devicePort.setAttribute("name", "port");
                        devicePort.setAttribute("value", (String)driver.getCapabilities().getCapability("wdaLocalPort"));
                }

                rootElement.appendChild(devicePort);

                Element packages = doc.createElement("packages");
                rootElement.appendChild(packages);
                Element packageName = doc.createElement("package");
                packageName.setAttribute("name", "BaseTest");
                packages.appendChild(packageName);


                connectedDevices++;
            }   
            suiteElement.setAttribute("parallel", "tests");
            suiteElement.setAttribute("thread-count", connectedDevices+"");
            doc.appendChild(suiteElement);

        } catch(ParserConfigurationException pce) {
            pce.printStackTrace();
        } catch (TransformerConfigurationException e) {
            e.printStackTrace();
        } 

    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM