Selenium + Java:具有登录功能的测试用例的并行执行

问题描述 投票:0回答:1

我有一个需要登录的应用程序,并且不允许在同一时间多次登录同一帐户。所以我最多有60个这样的测试用例。目前,我正在按以下方式处理它们的并行执行:

  • 通过初始化驱动程序对象使用CredzSet1登录@BeforeSuite。保存cookie。
  • 在@BeforeMethod中,将cookie设置为创建并刷新的新驱动程序对象。这将显示应用程序的主页,即成功登录

我想出了这种方法来避免每个测试用例的登录/注销步骤,并使使用单个证书集的并行执行成为可能。

现在此方法工作正常,但我在想是否还有其他替代方法,因为一个线程在整个执行时间内都被@BeforeSuite驱动程序对象占用,因为我仅在执行结束时才关闭该对象。想要利用所有线程进行并行执行。

这里是代码:

公共类TestConfigs {

protected static SelectEnv loadedEnv;
protected static BrowserManager factory;
protected static String url = null;
private static Set<Cookie> cookies;

@BeforeSuite(alwaysRun = true)    
public void startSuite() {      
    try{            
        loadedEnv = ConfigFactory.create(SelectEnv.class);

        //Initiate browser
        factory = BrowserManager.getInstance();         
        factory.setAnyDriver("chrome"); 
        factory.getDriver().get(ConfigFactory.getProperty("url"));

        Login login = new Login(factory.getDriver(), db);
        //Logging in 
        login.verifyLogin(loadedEnv.usernameAU(), loadedEnv.password(), 
                  loadedEnv.accesscode()); 
         Thread.sleep(5000);

        //Saving cookies                
        cookies = factory.getDriver().manage().getCookies();


    }catch(Exception e) { 
        System.out.println("Exception in @BeforeSuite method");
        e.printStackTrace();
    }

  }



@BeforeMethod(alwaysRun = true)
public synchronized void testSetup(Method method, Object[] obj) {
    try {   
        System.out.println("********* In Before Method***************");

        //Initiate browser
        factory = BrowserManager.getInstance();
        // Initiate browser
        factory.setAnyDriver("chrome");
        factory.getDriver().get(url);

        if(cookies!=null) {
            cookies.forEach( cookie -> factory.getDriver().manage().addCookie( cookie ));
            factory.getDriver().get(url);               
        }

    } catch (Exception e) {
        e.printStackTrace();
    }

}

@AfterMethod(alwaysRun = true)
public void cleanUp() {

    factory.getDriver().close();
    factory.getDriver().quit();


}


@AfterSuite(alwaysRun = true)
public void afterSuiteCleanup() {       
    if(factory!=null && factory.getDriver() !=null) {
        factory.getDriver().close();
    }       
}

}

java selenium-webdriver testng parallel-execution
1个回答
0
投票

您可以按照https://www.baeldung.com/java-synchronized中的说明创建同步方法。

使用同步方法,一次只能有一个线程使用该方法。因此,确保一次仅一次登录。

因此,如果将login.verifyLogin()转换为同步方法,则应该可以。

© www.soinside.com 2019 - 2024. All rights reserved.