TestNG: выполнять параллельные тесты в файле набора, используя несколько классов тестов - PullRequest
0 голосов
/ 01 ноября 2018

Я пытаюсь запустить параллельные тесты для настройки файла комплекта. Тесты предназначены для веб-приложений, использующих Selenium. Файл пакета состоит из нескольких тестов. Каждый тест содержит более одного тестового класса. Первый класс в каждом тесте используется для инициализации (@BeforeTest) WebDriver и его отключения (@AfterTest). WebDriver является статическим для того, чтобы передать его другим классам (причина в том, что нам нужно продолжить тестирование с момента окончания последнего класса тестирования).

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

Ты хоть представляешь, как мне преодолеть эту ситуацию?

Проверьте шаблон набора ниже:

<suite name="Register and Login functionality" parallel="tests" thread-count="2">
    <test name="Test-1">
        <parameter name="browser" value="chrome" />
        <classes>
            <class name="Init" />
            <class name="Register" />
            <class name="Login" />
        </classes>
    </test>
    <test name="Test-2">
        <parameter name="browser" value="chrome" />
        <classes>
            <class name="Init" />
            <class name="Register" />
            <class name="Login" />
        </classes>
    </test>
</suite>

Шаблон из тестового класса Init:

public class Init{

    private static WebDriver driver;

    public WebDriver getWebDriver(){
        return this.driver;
    }

    @BeforeTest
    public void setUp(){
        driver = new ChromeWebDriver();
    }

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

}

Шаблон из регистра тестового класса:

public class Register{

    private WebDriver driver;

    @BeforeClass
    public void setUp(){
        driver = Init.getWebDriver();
    }

    @Test
    public void test1(){
        ........
        ........
    }

    @Test
    public void test2(){
        ........    
        ........
    }

}

Шаблон из логина test-class:

public class Login{

    private WebDriver driver;

    @BeforeClass
    public void setUp(){
        driver = Init.getWebDriver();
    }

    @Test
    public void test1(){
        ........
        ........
    }

    @Test
    public void test2(){
        ........    
        ........
    }

}

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

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

private static WebDriver driver;

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

0 голосов
/ 01 ноября 2018

Статический объект будет одиночным для jvm. Для вашего случая вы можете хранить их в объекте ThreadLocal. Просто измени свой класс инициализации.

public static class Init{
    private static ThreadLocal<WebDriver> WEBDRIVER = new ThreadLocal<WebDriver>();

   public static WebDriver getWebDriver(){
      WebDriver driver= WEBDRIVER.get();
      if (driver== null) {
        driver = new ChromeWebDriver();
        WEBDRIVER.set(driver);
      }
      return driver;
   }

   @AfterTest
   public void quit(){
      getWebDriver().quit();
  }
 }

Если вы расширяете класс регистрации и входа с помощью init в качестве базового класса. Тогда вы можете просто не упоминать init класс в suite xml

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