Как создать правильное параллельное выполнение селена с помощью @BeforeSuite, и каждый @Test находится в отдельном классе с TestNG? - PullRequest
0 голосов
/ 24 апреля 2020

Я пытаюсь создать тестовый дизайн, используя Selenium и TestNG , я помещаю каждый @ Test в отдельный класс и использую один раз @ BeforeSuite & @ AfterSuite для всех классов, причина:

  1. Код прост в обслуживании
  2. Управляемый данными, чтобы иметь возможность выбрать, какие классы запускать через файл xml.

Тогда я думаю, что я могу войти в систему только один раз, и сеанс может использоваться всеми последующими тестами, что Я сделал так:

База класс:

public class Base {
    protected static WebDriver driver;

    @BeforeSuite
    public void setup() {
        System.setProperty("webdriver.chrome.driver", "/Users/.../chromedriver");
        driver = new ChromeDriver();
    }

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

LoginApps класс:

public class LoginApps extends Base{
    @Test(groups= {"logintest"})
    @Parameters({"data"})
    public void loginApps(String data) {
        driver.get("https://TheUrl.com/");
        //some code here
    }
}

Case1 класс:

public class Case1 extends Base{
    @Test(dependsOnGroups= {"logintest"})
    @Parameters({"data"})
    public void case1(String data) {
        driver.get("https://TheUrl.com/");
        //some code here
    }
}

Примечание : приведенный выше код прекрасно работает, если он запускается с одним <test> в комплекте.

Проблема в том, что он работает параллельно, как в следующей конфигурации xml.

testng. xml:

<suite name="SuiteTest" parallel="tests" thread-count="2">
    <test name="Test1">
        <parameter name="data" value="data1"></parameter>
        <classes>  
            <class name="com.main.LoginApps"/>
            <class name="com.main.Case1"/>
            .....
            More class
        </classes>
    </test>
    <test name="Test2">
        <parameter name="data" value="data2"></parameter>
        <classes>
            <class name="com.main.LoginApps"/>
            <class name="com.main.Case1"/>
            .....
            More class
        </classes>
    </test>
</suite>

Код выполняется путем создания driver экземпляра только один раз, и оба <test> работают с перекрытием в одном сеансе. Я думаю, что это из-за способа, которым я объявляю driver как static в Base классе. Но если я удаляю static, это усугубит ситуацию, все равно создавая экземпляр driver только один раз, и код запускает только первый @Test (в данном случае только LoginApps ) все последующие тесты получат исключение NullPointerException.

Я использую TestNG v7.0.0 с Maven :

<dependency>
    <groupId>org.testng</groupId>
    <artifactId>testng</artifactId>
    <version>7.0.0</version>
    <scope>compile</scope>
</dependency>

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

1 Ответ

0 голосов
/ 24 апреля 2020

Создайте драйвер с безопасностью потока, чтобы оба сеанса драйвера были уникальными.

public class ThreadLocalDriver {

    private static ThreadLocal<WebDriver> threadLocalDriver = new ThreadLocal<>();

    public synchronized static void setTLDriver(WebDriver driver) {
        threadLocalDriver.set(driver);
    }

    public synchronized static WebDriver getTLDriver() {
        return threadLocalDriver.get();
    }
}

public class BaseClass {
    @BeforeMethod
    public void setup (String deviceName, String platformVersion) throws IOException {
        DesiredCapabilities caps = new DesiredCapabilities();
        // Add caps here    
        ThreadLocalDriver.setTLDriver(new ChromeDriver(caps));
    }

    @AfterMethod
    public synchronized void teardown(){
        ThreadLocalDriver.getTLDriver().quit();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...