Выполнить тесты через файл динамического настраиваемого TestNG через Maven / Testng - PullRequest
0 голосов
/ 11 октября 2018

Я пытаюсь настроить свой testng.xml таким образом, чтобы он указывал на динамически настраиваемый xml-файл testng, чтобы определить, что нужно тестировать на основе количества подключенных мобильных устройств (drivers.xml).У меня есть Java-класс, который создает и содержит драйверы Appium, а затем передает эти значения для каждого драйвера в другой класс Java для настройки параметров и значений для каждого драйвера, чтобы я мог использовать аннотацию @Parameters для передачи необходимой информации о драйвере для параллельного тестирования.

В настоящее время способ установки файла testng.xml, похоже, вообще не запускает никаких тестов.Я пытался искать ответы в Интернете, но для TestNG, кажется, не так много значений для других пользовательских XML-файлов.(Я не уверен, правильно ли я формулирую свой вопрос или нет.) Кто-нибудь сталкивался с проблемами для этой настройки?

Вот файлы Xml и класс Java, который создает пользовательский файл 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 (пользовательский файл 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>

Класс Java Xml Maker:

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();
        }

    }

}

1 Ответ

0 голосов
/ 27 октября 2018

Разобрался с проблемой.Во-первых, имя пути к файлу пакета должно быть «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>

Во-вторых, мой класс XmlMaker не настраивал создание файла Xml, например, для тегов Suite требуется имя, объявление типа документа, плюс то, как мне пришлось сделать некоторые настройки, как это сделать.Объекты-элементы при создании моего пользовательского XML-файла.

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();
        } 

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...