Параллельное выполнение метода в testng выполняет только последний метод, вызванный из класса - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть файл комплекта тестирования с классом, имеющим 3 метода.На уровне комплекта я дал параллельный = "method" thread-count = "3", чтобы 3 потока открывались параллельно для каждого метода в классе.

При выполнении комплекта открываются 3 потока (браузера)запуск URL, но только 3-й поток / браузер выполняется согласно шагам в методе.Для 1-ых потоков 2 / браузера нет действий, где они выполнялись.

Много пытался найти ответы на этот вопрос, но не смог найти решение.Ниже приведен код, который я использую, и, пожалуйста, исправьте меня, если я что-то пропустил.

BaseClass:

public class BaseClass {

    public WebDriver driver;
    public WebDriverWait wait;

    @BeforeMethod()
    public void configure() {
        System.setProperty("webdriver.chrome.driver","C:\\SeleniumDrivers\\chromedriver.exe");
          driver=new ChromeDriver();
          driver.get("https://www.google.com");
          driver.manage().window().maximize();
          driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);          
    }

    @AfterMethod()
    public void tearDown() {
        driver.quit();
    }

}

Класс с TestMethods

  public class NewTest extends BaseClass{
  @Test()
  public void method1() {
      driver.findElement(By.name("q")).sendKeys("parallel");
      driver.findElement(By.name("q")).sendKeys(Keys.ENTER);
  }

  @Test()
  public void method2() {
      driver.findElement(By.name("q")).sendKeys("methods");  
      driver.findElement(By.name("q")).sendKeys(Keys.ENTER);

  }

  @Test()
  public void method3() {
      driver.findElement(By.name("q")).sendKeys("testng");
      driver.findElement(By.name("q")).sendKeys(Keys.ENTER);
  }
}

Файл набора

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

Ожидаемый результат: 3 браузера открываются параллельно.1-й браузер должен искать «параллельно».Второй браузер должен искать «методы».3-й браузер должен искать «автоматизацию».

Фактический результат: 3 браузера открываются параллельно, но 2 браузера, которые открываются первыми, выполняют действия в соответствии с методом, а последний открытый браузер выполняет поиск слова «параллельный метод проверки» изакрывается.Первые 2 открытых браузера не закрываются и не максимизируются согласно коду.

===============================================
Suite
Total tests run: 3, Failures: 2, Skips: 0
===============================================

Надеюсь, это поможет.

Ответы [ 4 ]

0 голосов
/ 03 марта 2019

Это может произойти, поскольку thread-count не на правильном месте.Согласно документации TestNG thread-count должно быть в теге suite .Пожалуйста, используйте его, как указано ниже.

<suite name="My suite" parallel="methods" thread-count="5">

Проверьте документацию тестирования здесь:

http://testng.org/doc/documentation-main.html#parallel-running

0 голосов
/ 01 марта 2019

Я бы предложил использовать qaf расширение TestNG , которое отвечает за управление драйверами, управление ресурсами и многое другое для автоматизации функциональных тестов веб, мобильных устройств и веб-сервисов.С qaf ваш тестовый класс может выглядеть следующим образом:

 public class NewTest extends WebDriverTestCase{
  @Test()
  public void method1() {
      getDriver().get("https://www.google.com");
      getDriver().findElement(By.name("q")).sendKeys("parallel");
      getDriver().findElement(By.name("q")).sendKeys(Keys.ENTER);
  }

  @Test()
  public void method2() {
      getDriver().get("https://www.google.com");
      //another improved way
      WebElement ele = getDriver().findElement(By.name("q"));
      ele.sendKeys("methods");  
      ele.sendKeys.submit();

  }

  @Test()
  public void method3() {
      getDriver().get("https://www.google.com");
      //another way with qaf
      WebElement ele = $("name=q");
      ele.sendKeys("testng");  
      ele.sendKeys.submit();
  }
}

Более того, вы можете сделать тестовые данные управляемыми с помощью встроенных поставщиков данных.

0 голосов
/ 03 марта 2019

Если вы хотите использовать только TestNG без каких-либо расширений, вам нужно обрабатывать веб-драйвер через ThreadLocal

private final ThreadLocal<WebDriver> driver = new ThreadLocal<>();

Драйверы следует создавать с помощью синхронизированных методов.

public synchronized WebDriver createDriver() {
        return new ChromeDriver(options.getOptions());
}
@BeforeMethod(alwaysRun = true)
public void setupDriver(String browser) {
    driver.set(CcreateDriver());
}
public synchronized WebDriver getDriver() {
        return driver.get();
}

Вам также необходимоНе забудьте использовать потоки безопасные карты, списки и т. д., как concurentHashMap и т. д. Это также применяется для Selenium Grid.Поэтому ThreadLocal также следует применять к RemoteWebDriver, поскольку он также не является поточно-ориентированным.

0 голосов
/ 28 февраля 2019

WebDriver не является потокобезопасным.Я могу сослаться на Selenium FAQ

В: Является ли WebDriver поточно-ориентированным?
A: WebDriver не поточно-ориентирован.Сказав это, если вы можете сериализовать доступ к базовому экземпляру драйвера, вы можете поделиться ссылкой более чем в одном потоке.Это не рекомендуется.С другой стороны, вы можете / можете / создать один экземпляр WebDriver для каждого потока.

Неважно, используется ли ваше решение в больших или маленьких проектах.Если вы хотите масштабировать свое решение, вы всегда можете использовать сетку Selenium для параллельного выполнения.Локальные объекты WebDriver не будут вашей проблемой.Переполнение памяти, съедая экземпляры Chrome, будет вашей проблемой.

...