TestNG параллельный DataProvider во вкладках - PullRequest
0 голосов
/ 19 января 2020

Я очень новичок, используя TestNG и Java программирование в целом, и у меня есть вопрос относительно запуска тестовых случаев с провайдером данных в параллельно ,

чтобы запускать тестовые случаи поставщика данных на нескольких вкладках в одном окне chrome вместо множества windows, я использовал селен 4, который позволяет открывать и переключаться на новую вкладку, используя следующий код

driver.switchTo().newWindow(WindowType.TAB);

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

, следовательно, он открывает 3 вкладки одновременно, затем он открывает ссылку на последней вкладке 3 раза и, наконец, пытается выполнить 3 поиска одновременно, и поэтому не может их выполнить.

Я нахожу в результате testNG создает единый веб-драйвер для управления всеми вкладками, что логично для того, чтобы вызвать сбой тестов в параллельном режиме.

https://imgur.com/fWHY5pt* 101 9 *

Это код:

package com.mycompany.app;

import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WindowType;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

public class testTab {

    WebDriver driver;

    @BeforeTest
    public void beforeTest() {
        System.setProperty("webdriver.chrome.driver", "C:\\Browsers drivers\\chromedriver.exe");
        driver = new ChromeDriver();
    }

    @BeforeMethod
    public void newTab() {
        driver.switchTo().newWindow(WindowType.TAB);
    }

    @Test(dataProvider = "getData")
    public void testAmazon1(String search_word) {
        driver.get("https://www.google.com/");
        driver.findElement(By.xpath("//input[@name='q']")).sendKeys(search_word + (Keys.RETURN));
    }

    @DataProvider(parallel=true)
    public Object[][] getData() {
        Object[][] data = new Object[3][1];
        data[0][0] = "bihi";
        data[1][0] = "boutfounast";
        data[2][0] = "hmad l9rran";
        return data;
    }

}

Это XML файл

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="My Sample Suite" parallel="methods" thread-count="3">


<test name="Amazon test">
    <classes>
        <class name="com.mycompany.app.testTab"></class>  
    </classes>
</test>


</suite>

Есть ли способ создать веб-драйвер для каждого теста? Прошу прощения за неточность и спасибо за ваши ответы.

Ответы [ 2 ]

0 голосов
/ 22 января 2020

Есть несколько проблем с вашим тестовым кодом.

  • У вас есть элемент данных уровня класса WebDriver, который распределяется между всеми методами @Test в том же классе теста, а также между всеми итерации метода @Test, управляемого данными.
  • Вы используете метод @BeforeTest для инициализации вашего экземпляра веб-драйвера, что означает, что он инициализируется ТОЛЬКО один раз для тега <test>, и если есть какие-либо другие нижестоящие тестовые классы, которые расширяют этот тестовый класс, столкнутся с NullPointerException.

Есть ли способ создать веб-драйвер для каждого теста?

Да, это очень возможно. Вам нужно работать с ThreadLocal, в котором вы создаете экземпляр WebDriver либо в прослушивателе TestNG (или) в методе @BeforeMethod (потому что @BeforeMethod гарантированно будет работать в том же потоке, что и @Test)

Вот как вы go делаете это.

Сначала создайте фабрику драйверов, которая может создать для вас WebDriver экземпляров.

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;

class LocalDriverFactory {
    static WebDriver createInstance(String browserName) {
        WebDriver driver = null;
        if (browserName.toLowerCase().contains("firefox")) {
            driver = new FirefoxDriver();
            return driver;
        }
        if (browserName.toLowerCase().contains("internet")) {
            driver = new InternetExplorerDriver();
            return driver;
        }
        if (browserName.toLowerCase().contains("chrome")) {
            driver = new ChromeDriver();
            return driver;
        }
        return driver;
    }
}

Теперь давайте создадим драйвер менеджер, который выступает в качестве средства для взаимодействия с созданным экземпляром веб-драйвера

import org.openqa.selenium.WebDriver;

public class LocalDriverManager {
  private static ThreadLocal<WebDriver> webDriver = new ThreadLocal<>();

  public static WebDriver getDriver() {
    return webDriver.get();
  }

  static void setWebDriver(WebDriver driver) {
    webDriver.set(driver);
  }

  public static void cleanupDriver() {
    webDriver.get().quit();
    webDriver.remove();
  }
}

Вот как теперь будет выглядеть ваш тестовый класс

import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

public class TestTab {

  @BeforeMethod
  public void beforeMethod() {
    LocalDriverManager.setWebDriver(LocalDriverFactory.createInstance("chrome"));
  }

  @Test(dataProvider = "dp")
  public void testMethod(String searchWord) {
    WebDriver driver = LocalDriverManager.getDriver();
    driver.get("https://www.google.com/");
    driver.findElement(By.xpath("//input[@name='q']")).sendKeys(searchWord + (Keys.RETURN));
  }

  @DataProvider(name = "dp", parallel = true)
  public Object[][] getData() {
    return new Object[][] {{"bihi"}, {"boutfounast"}, {"hmad l9rran"}};
  }

  @AfterMethod
  public void afterMethod() {
    LocalDriverManager.cleanupDriver();
  }
}

Я создал подробный блог, который объясняет все это. Вы можете прочитать больше об этом здесь

В качестве импровизации я также создал простую библиотеку maven под названием autospawn, которая абстрагирует все эти экземпляры браузера и очищает логи c от Вы и можете работать с веб-драйвером с помощью пользовательской аннотации.

Более подробную информацию об этом можно получить здесь: https://github.com/RationaleEmotions/autospawn

0 голосов
/ 19 января 2020

Вам нужно использовать dataproviderthreadcount. Значения thread-count не требуются. Подробнее здесь .

Вы можете использовать Tesng.xml, как указано ниже:

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="My Sample Suite" parallel="methods" data-provider-thread-count="3">


<test name="Amazon test">
    <classes>
        <class name="com.mycompany.app.testTab"></class>  
    </classes>
</test>


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