我有一个需要登录的应用程序,并且不允许在同一时间多次登录同一帐户。所以我最多有60个这样的测试用例。目前,我正在按以下方式处理它们的并行执行:
我想出了这种方法来避免每个测试用例的登录/注销步骤,并使使用单个证书集的并行执行成为可能。
现在此方法工作正常,但我在想是否还有其他替代方法,因为一个线程在整个执行时间内都被@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();
}
}
}
您可以按照https://www.baeldung.com/java-synchronized中的说明创建同步方法。
使用同步方法,一次只能有一个线程使用该方法。因此,确保一次仅一次登录。
因此,如果将login.verifyLogin()
转换为同步方法,则应该可以。