TestNG Параллельное выполнение с селеном

Если мне нужно запустить один и тот же метод в двух разных браузерах одновременно, как я его реализую? Например:

public class AppTest2{

@parameters("browser")
@Test(dataProvider="loginData")
public void login(String userName , String password, String param){
  if(param.equals("firefox"){
         //do something
    }
  if(param.equals("chrome"){
        //do something else
    }
 }

}

в моем файле testng.xml содержится:

    <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
    <suite name ="My sutie" parallel = "methods",  thread-count="5">
   <parameter name="browser"  value="firefox"/> 
   <test name ="My Test1">
     <classes>
        <class name="mq.demo.selenium.AppTest2"/>
     </classes>
    </test>
    </suite>

Итак, моя цель - запустить метод входа в систему в двух разных браузерах одновременно, используя два разных потока.

Кто-нибудь может помочь?

Спасибо


person user1459497    schedule 11.03.2017    source источник
comment
Имеет ли ваш поставщик данных loginData значение parallel = true?   -  person Aaron Davis    schedule 11.03.2017
comment
Нет, у него нет значения parallel = true.   -  person user1459497    schedule 12.03.2017
comment
Ой, подождите, вы определяете имя браузера в xml. Иметь параллельного поставщика данных, который возвращает данные для входа и имя браузера, если вы хотите передать отдельные имена браузеров так, как вы их уже настроили.   -  person Aaron Davis    schedule 12.03.2017
comment
Почему бы вам не попробовать Selenium Grid? Он делает именно то, что вам нужно.   -  person shank087    schedule 12.03.2017


Ответы (1)


Вы можете рассматривать что-то вроде нижеприведенного как возможное решение

package com.rationaleemotions.stackoverflow;

import org.testng.IAlterSuiteListener;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
import org.testng.collections.Maps;
import org.testng.xml.XmlClass;
import org.testng.xml.XmlSuite;
import org.testng.xml.XmlTest;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class MultiBrowserSample {

    @Test
    @Parameters("browser")
    public void testMethod(String browser) {
        System.err.println("Browser : " + browser + " on Thread [" + Thread.currentThread().getId() + "]");
    }

    public static class MySuiteAlterer implements IAlterSuiteListener {

        @Override
        public void alter(List<XmlSuite> suites) {
            XmlSuite suite = suites.get(0);
            //Check if there was a parameter named "browserFlavors" defined at the suite
            String browserFlavors = suite.getParameter("browserFlavors");
            if (browserFlavors == null || browserFlavors.trim().isEmpty()) {
                //If no such parameter was found, then Try querying the JVM arguments to see if it contains
                //value for it. Just to ensure we don't end up in a situation wherein there's no JVM also provided
                //Lets add a default value for the JVM argument which in our case is "firefox"
                browserFlavors = System.getProperty("browserFlavors", "firefox");
            }
            String[] browsers = browserFlavors.split(",");
            List<XmlTest> xmlTests = new ArrayList<>();
            for (String browser : browsers) {
                XmlTest xmlTest = new XmlTest(suite);
                xmlTest.setName(browser + "_test");
                Map<String, String> parameters = Maps.newHashMap();
                parameters.put("browser", browser);
                xmlTest.setParameters(parameters);
                XmlClass xmlClass = new XmlClass();
                xmlClass.setName(MultiBrowserSample.class.getCanonicalName());
                xmlTest.getClasses().add(xmlClass);
                xmlTests.add(xmlTest);
            }
            suite.setTests(xmlTests);
        }
    }
}

Файл xml пакета может выглядеть следующим образом

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="1265_Suite" parallel="tests" verbose="2">
    <listeners>
        <listener class-name="com.rationaleemotions.stackoverflow.MultiBrowserSample$MySuiteAlterer"/>
    </listeners>
    <!--
    If the below line gets uncommented, then 3 <test> tags will be formed one for each browser flavor.
    Since its now commented, you will have to provide a value for it via the JVM argument 
    -DbrowserFlavors=firefox,chrome,ie (or) the system will default to just working with firefox
    -->
    <!--<parameter name="browserFlavors" value="firefox,chrome,ie"/>-->
</suite>

Итак, как вы можете видеть, здесь мы прибегаем к использованию прослушивателя TestNG под названием IAlterSuiteListener implementation, который поможет нам динамически создавать теги <test> в XML-файле пакета, а количество тегов <test> в XML-файле пакета будет прямо равно количество браузеров, указанное либо через параметр уровня пакета browserFlavors (или) через аргумент JVM -DbrowserFlavors

Результат будет таким, как показано ниже

[TestNG] Running:
  /Users/krmahadevan/githome/PlayGround/testbed/src/test/resources/multi-browsers.xml
[ThreadUtil] Starting executor timeOut:2147483647ms workers:3 threadPoolSize:5
Browser : ie on Thread [13]
Browser : chrome on Thread [12]
Browser : firefox on Thread [11]
PASSED: testMethod("firefox")
PASSED: testMethod("ie")
PASSED: testMethod("chrome")

===============================================
    ie_test
    Tests run: 1, Failures: 0, Skips: 0
===============================================


===============================================
    firefox_test
    Tests run: 1, Failures: 0, Skips: 0
===============================================


===============================================
    chrome_test
    Tests run: 1, Failures: 0, Skips: 0
===============================================

===============================================
1265_Suite
Total tests run: 3, Failures: 0, Skips: 0
===============================================
person Krishnan Mahadevan    schedule 12.03.2017
comment
хорошее объяснение! - person shank087; 12.03.2017
comment
@Krishnan Mahadevan, как добавить несколько параметров внутри тестового тега? - person Chinthaka Devinda; 13.05.2019