Если мы хотим иметь один экземпляр драйвера и выполнить два параллельных теста. Что мы будем использовать многопоточность или многопроцессорность? - PullRequest
2 голосов
/ 06 марта 2020

Это то, что должно быть достигнуто: мы создаем экземпляр драйвера. запустить два потока / процесса - один из них выполнит тестовый сценарий регистрации (или любой другой), а второй выполнит другой тестовый сценарий (триггер, медленная смена сети или иное)

Ответы [ 4 ]

1 голос
/ 06 марта 2020

Я читал, что python сам по себе не был создан с учетом многопоточности, как другие языки (хотя есть пакеты, которые утверждают, что делают это), поэтому я бы склонялся к многопроцессорности. Вы должны иметь возможность передавать необходимые данные в соответствующие части кода (различные процессы), чтобы делать то, что вы sh. Если вы выполняете действия, связанные с одним и тем же драйвером, в обоих тестах, вы можете решить не запускать тесты одновременно (заказать их) или создать два экземпляра драйвера и передать по одному каждому процессу (хотя я видел некоторые проблемы, пытаясь сделать это с пакетом запросов, пытающимся установить слишком много одновременных соединений, хотя это было без многократной обработки). Если это проблема, с которой вы сталкиваетесь при многопроцессорной обработке, было бы интересно посмотреть, справится ли это с многопоточностью, но вам, возможно, придется запускать тесты одновременно на разных компьютерах или виртуальных машинах, если ни одна из них не обеспечивает решения. Надеюсь, это поможет

0 голосов
/ 07 марта 2020

Мы можем достичь этого с помощью параллельных тестов + Selenium Grid. Вы можете упомянуть в testng. xml file

    <suite name="regression" thread-count="2" parallel="tests">

        <test name="sanity">
            <classes>
                <class name="com.orangehrm.tests.Test1"></class>
            </classes>
        </test>

        <test name="smoke pack" >
            <classes>
                <class name="com.orangehrm.tests.Test2"></class>
            </classes>
        </test>
    </suite>

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

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

public class WDBase {
    private static ThreadLocal<RemoteWebDriver> th=new ThreadLocal<RemoteWebDriver>();


public static synchronized void setDriver(String browserName) throws MalformedURLException {
        System.setProperty("webdriver.chrome.driver", "././drivers/chromedriver.exe");
        ChromeOptions coptions=new ChromeOptions();
        th.set(new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), coptions));
}   
    public static synchronized RemoteWebDriver getDriver(){
        return th.get();
    }

    public static synchronized void launchBrowser(String browserName) throws IOException {
        setDriver(browserName);
        prop=PropertyReader.readProperties();
        getDriver().manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
        getDriver().manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
        getDriver().manage().window().maximize();

        getDriver().get(prop.getProperty("url"));
    }

    public static synchronized void killBrowser() {
        if (driver!=null)
            th.get().close();
            th.get().quit();
    }
}
0 голосов
/ 07 марта 2020

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

В идеале проблема thread-safety не в вашем коде, а в реальных привязках браузера. Все они предполагают, что будет только одна команда за раз (например, как настоящий пользователь). Но с другой стороны, вы всегда можете создать один экземпляр WebDriver для каждого потока, который будет запускать несколько вкладок просмотра / windows. До этого момента кажется, что ваша программа идеальна.

Теперь разные потоки могут быть запущены на одном и том же Webdriver , но тогда результаты тестов не будут вы ожидаете. Причина в том, что когда вы используете многопоточность для запуска разных тестов на разных вкладках / windows требуется немного кодирования безопасности потока, иначе действия, которые вы будете выполнять, например click() или send_keys(), будут go к открытой вкладке / окну, в котором в данный момент находится focus независимо от того, какой поток вы ожидаете запустить. По сути, это означает, что все тесты будут выполняться одновременно на одной вкладке / окне с focus , но not на предполагаемой вкладке / окне.


Reference

Соответствующее подробное обсуждение можно найти в:

0 голосов
/ 06 марта 2020

Предлагаю сделать тесты с помощью Селеновой сетки.

Селеновая сетка - StackOF Вопрос

Думаю, вы сможете понять, как работают Разные параллельные тесты.

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