t.me/atinfo_chat Telegram группа по автоматизации тестирования

Selenium Grid. Как запустить в параллельном режиме тесты


(bobby2008) #1

Всем привет. Нужен совет как запустить тесты используя связку Selenium Grid+RC+TestNG в параллельном режиме. Сейчас тесты запускаются следующим образом(для двух классов в которых по одному тесту): открывается 4 окна браузера(2 для RC и два для проведения самых тестов) и вроде все ок, НО сразузапускается один тест(одна пара браузеров) а второй ждет окончания первого и запускается в оставшейся паре браузеров только после того, как первый отработает. Затем благополучно закрываются все браузеры и тесты комплитед. Помогите запустить их одновременно.

 

 

 

Тест1:

package ololo;
import org.testng.AssertJUnit;
import com.thoughtworks.selenium.*;

import org.testng.annotations.*;
//import org.testng.Assert.*;
//import java.util.regex.Pattern;

public class fotttest {
    
    public Selenium selenium;
    //@BeforeMethod
    @BeforeTest()
    public void setUp() throws Exception {
        selenium = new DefaultSelenium("localhost", 4444, "*firefox", "http://www.google.com.ua/");
        selenium.start();
    }
    
    @AfterTest()
    public void tearDown() {
    selenium.stop();
    }
    
    @Test(description="FottballUATest")
    public void TestOne() throws Exception {
        selenium.open("/");
        Thread.sleep(3000);
        selenium.type("id=gbqfq", "football.ua");
        selenium.click("id=gbqfb");
        for (int second = 0;; second++) {
            if (second >= 60) AssertJUnit.fail("timeout");
            try { if (selenium.isElementPresent("link=Football.ua - все о футболе")) break; } catch (Exception e) {}
            Thread.sleep(1000);
        }

        selenium.click("css=em");
        selenium.waitForPageToLoad("30000");
        for (int second = 0;; second++) {
            if (second >= 60) AssertJUnit.fail("timeout");
            try { if (selenium.isElementPresent("link=Лига чемпионов")) break; } catch (Exception e) {}
            Thread.sleep(1000);
        }

        selenium.click("link=Лига чемпионов");
        selenium.waitForPageToLoad("30000");
        for (int second = 0;; second++) {
            if (second >= 60) AssertJUnit.fail("timeout");
            try { if (selenium.isElementPresent("link=календарь игр")) break; } catch (Exception e) {}
            Thread.sleep(1000);
        }

        selenium.click("link=календарь игр");
        selenium.waitForPageToLoad("30000");
        selenium.select("id=ctl00_ctl17_ddlTeam", "label=Барселона");
        selenium.click("css=#ctl00_ctl17_ddlTeam > option[value=\"51\"]");
        selenium.waitForPageToLoad("30000");
        for (int second = 0;; second++) {
            if (second >= 60) AssertJUnit.fail("timeout");
            try { if (selenium.isElementPresent("xpath=(//a[contains(text(),'2')])[9]")) break; } catch (Exception e) {}
            Thread.sleep(1000);
        }

        selenium.click("xpath=(//a[contains(text(),'2')])[8]");
        selenium.waitForPageToLoad("30000");
        for (int second = 0;; second++) {
            if (second >= 60) AssertJUnit.fail("timeout");
            try { if (selenium.isTextPresent("Матч завершен! Челси проходит Барселону!")) break; } catch (Exception e) {}
            Thread.sleep(1000);
        }
        
    }   
}

 

 

Тест2:

package ololo;

import org.testng.AssertJUnit;
import com.thoughtworks.selenium.*;

import org.testng.annotations.*;
//import org.testng.Assert.*;
//import org.testng.Assert;
//import java.util.regex.Pattern;

public class NewTest {
    
    public Selenium selenium;
    
    @BeforeTest()
    public void setUp() throws Exception {
        selenium = new DefaultSelenium("localhost", 4444, "*firefox", "http://www.google.com.ua/");
        selenium.start();
    }
    
    @AfterTest()
    public void tearDown() {
    selenium.stop();
    }
    
        
        @Test (description="IsportTest")
        public void TestTwo() throws Exception {
            selenium.open("/");
            selenium.type("id=gbqfq", "isport.ua");
            selenium.click("id=gbqfb");
            for (int second = 0;; second++) {
                if (second >= 60) AssertJUnit.fail("timeout");
                try { if (selenium.isElementPresent("css=em")) break; } catch (Exception e) {}
                Thread.sleep(1000);
            }

            selenium.click("css=em");
            selenium.waitForPageToLoad("30000");
            for (int second = 0;; second++) {
                if (second >= 60) AssertJUnit.fail("timeout");
                try { if (selenium.isElementPresent("link=БОКС+ММА")) break; } catch (Exception e) {}
                Thread.sleep(1000);
            }

            selenium.click("link=БОКС+ММА");
            selenium.waitForPageToLoad("30000");
            for (int second = 0;; second++) {
                if (second >= 60) AssertJUnit.fail("timeout");
                try { if (selenium.isElementPresent("link=Котто: \"Все это время Мейвезер был джентльменом\"")) break; } catch (Exception e) {}
                Thread.sleep(1000);
            }

            selenium.click("link=Котто: \"Все это время Мейвезер был джентльменом\"");
            selenium.waitForPageToLoad("30000");
        }
}

 

 

TestNG.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite thread-count="2" name="Suite" parallel="tests">
  <test name="Test" preserve-order="true">
    <classes>
      <class name="ololo.NewTest"/>
      <class name="ololo.fotttest"/>
    </classes>
  </test> <!-- Test -->
</suite> <!-- Suite -->


(null) #2

Попробуйте в testng.xml вместо parallel="tests" использовать parallel="classes". Поскольку Вы указали уровень распараллеливания tests, а секция <test> у Вас одна - так и будет запускаться один тест с двумя классами внутри один за другим. Если укажете уровень распараллеливания classes, то при наличии двух классов должно запуститься два сразу. Если не сработает, укажите, как вы запускаете хаб и ноды.


(bobby2008) #3

Большое спасибо. Ваш способ не сработал, но я методом научного тыка попытался раскрутить Вашу идею и сделал просто два теста по одному класу в каждом - сработало. Запускается все ок. Если кому интересно вот testng.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite thread-count="2" name="Suite" parallel="tests">
  <test name="Test1">
    <classes>
      <class name="ololo.NewTest"/>     
    </classes>
  </test> <!-- Test -->

<test name="Test2" >
    <classes>
        <class name="ololo.fotttest"/>
    </classes>
  </test> <!-- Test -->
</suite> <!-- Suite -->


(null) #4

Странно, что не сработало.. У нас именно так и работало, правда пришлось отказаться от распараллеливания средствами TestNG, ибо на выходе получается один репорт на все классы, а при количестве тестов под 700 это не очень удобно. Теперь используем Ant для распараллеливания - там объявлены все классы как таргеты с указанием, куда складывать репорты, и один таргет для параллельного запуска всех тестов - запускает отлично, репорты по классово. Единственное, что не нравится - кривовато решили проблему с очередностью запуска, но все-таки решили :)


(bobby2008) #5

Это очень интересно. У меня как бы главная задача - толково обработать результаты. Средствами Ant мы получаем другие результаты(я имею в виду результатов больше или меньше) или просто в более удобном виде?


(bobby2008) #6

Теперь имею следующую проблему. Нужны результаты выполнения тестов в любом виде но чтобы было отдельно по каждому assert/verity результат. Можно так сделать? Может средствами Selenium Grid или TestNG репортеров разных или еще как...


(Mykhailo Poliarush) #7

а почему у вас возникла проблема с очередностью запуска тестов? есть какие-то зависимости?


(Mykhailo Poliarush) #8

что означает результаты по каждому асерту? 

ты хочешь, чтобы на каждую проверку был отдельный файл?

кстати, если на счет отчетности, то рекомендую посмотреть в эту сторону http://reportng.uncommons.org/


(null) #9

что мы имеем: 25 <antcall target="target_name"/> в блоке <parallel> и по моим наблюдениям все они запускаются рандомно, если не указан treadсount. А если такая ситуация, что парочку таргетов гоняются 1час, и запускаются они в конце, в то время, как все остальные инстансы простаивают и ждут завершения последнего сьюта. Решили проблему вызовом больших сьютов в самом начале (посредством antcall) и указанием threadcount, равным количеству инстансов браузеров - в этом случае первые запускаются первые 10 таргетов (правда запускаются они тоже рандомно, если судить по логам). Особо времени не было гуглить более детально, но если есть какая-то возможность в структуре 

<target name="parallel_run">

  <parallel>

        <antcall target="..."/>

        <antcall target="..."/>

        <antcall target="..."/>

      ....

  </parallel>

</target>

 

указать порядок запуска таргетов, буду очень благодарен!