Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Параллельный запуск разных тестов в разных браузерах


(Rommy1204) #1

Добрый день, столкнулся с такой проблемой:

Есть ряд тестов, тест1, тест2, тест3, тест4, которые являются методами одного класса с аннотацией @Test

Тесты запускаются с помощью TestNG и выполняюстя параллельно сразу в 2 браузерах

Но как мне сделать запуск тестов так, чтобы (к примеру) два из них запускались в первом браузере, а два другие во втором.

Пробовал через следующие 3 вещи:

package tests;

import java.sql.SQLException;

import org.apache.xpath.operations.Equals;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;

public class NewTest {
WebDriver driver;
@BeforeTest
@Parameters(“browser”)
public void openBroswer(String browser){

if(browser.equalsIgnoreCase(“FF”))
{
System.out.println(“Firefox driver would be used”);
driver = new FirefoxDriver();
}
else if (browser.equalsIgnoreCase(“IE”))
{
System.out.println(“Ie webdriver would be used”);
System.setProperty(“webdriver.ie.driver”, “./IEDriverServer.exe”);
driver = new InternetExplorerDriver();
}
}

@Test(parameters = “FF”)
public void test1() {
System.out.println("Started: test1 in " + ((RemoteWebDriver) driver).getCapabilities().getBrowserName());
driver.get(“http://ya.ru”);

System.out.println("Finished: test1 " + ((RemoteWebDriver) driver).getCapabilities().getBrowserName());;
}

@Test(testName = “Test_ff”)
public void test2() {
System.out.println("Started: test2 in " + ((RemoteWebDriver) driver).getCapabilities().getBrowserName());
driver.get(“http://google.ru”);
System.out.println("Finished: test2 in " + ((RemoteWebDriver) driver).getCapabilities().getBrowserName());
}

@Test(groups = “FFonly”)
public void test3() {
System.out.println("Started: test3 in " + ((RemoteWebDriver) driver).getCapabilities().getBrowserName());
driver.get(“http://mail.ru”);
System.out.println("Finished: test3 in " + ((RemoteWebDriver) driver).getCapabilities().getBrowserName());
}

@Test
public void test4() {
System.out.println("Started: test4 in " + ((RemoteWebDriver) driver).getCapabilities().getBrowserName());
driver.get(“http://gismeteo.ru/”);
System.out.println("Finished: test4 in " + ((RemoteWebDriver) driver).getCapabilities().getBrowserName());
}

@AfterTest
public void CleanUp() {
driver.quit();
}
}

 

И к нему 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_ie”>
<parameter name=“browser” value=“IE”></parameter>
<classes>
<class name=“tests.NewTest”/>
</classes>
</test> <!-- Test_ie -->

<test name=“Test_ff”>
<groups>
<include name=“FFonly”/>

<parameter name=“browser” value=“FF”></parameter>
<classes>
<class name=“tests.NewTest”/>
</classes>
</groups>
</test> <!-- Test_ff -->

</suite> <!-- Suite -->

 

Использовал parameters, testName, gropus - не помогло.

В результате, я в любом случае наблюдаю выполнение 8 тестов (4 теста в каждом из 2 браузеров)

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

Но при этом, они по-прежнему проходили параллельно

Заранее спасибо :-)

 


(Mykhailo Poliarush) #2

а зачем вам такая зависимость?

имхо, она усложнить ваш код, а толком результата особо не даст

 


(Rommy1204) #3

а зачем вам такая зависимость?

имхо, она усложнить ваш код, а толком результата особо не даст

Это необходимо для запуска большого количества тестов, часть из них для одного браузера, часть для другого.

Запускать отдельно не красиво. т.к. отчет хотелось бы видеть единым, а не двумя (тремя) разными.

 

 


(Rommy1204) #4

О, все, разобрался, нужно в XML в классе объявить методы и перечислить тесты, тогда они будут выполнены только для определенных тестов :)


(Mykhailo Poliarush) #5

ну раз решили свою проблему, напишите пожалуйста сюда ваше решение

чтобы другие если что посмотрели


(Rommy1204) #6

Необходимо указать какие именно тесты будут запускаться в этом тесте

 

<suite thread-count="2" name="Suite" parallel="tests">
    
 <test name="Test_ie">
    <parameter name="browser" value="IE"></parameter>
    <classes>
        <class name="tests.NewTest">
      <methods>
          <include name="test1"></include>
          <include name="test2"></include>
      </methods>
     </class>
    </classes>
  </test> <!-- Test_ie -->
 
Недостаток - прописывать для множества тестов - довольно-таки неудобно, нужно попробовать сделать через группы, но пока так работает и ладно=)

(Sergey Korol) #7

Распараллельте на уровне классов: меньше строк в xml при аналогичном результате.