背景:现在使用java JUnit4,愿意迁移到JUnit5或TestNG。
当前状态:拥有 100 多个 Selenium 测试。其中大部分通过 Junit4 中的 @RunWith(Parameterized.class) 重复。(即根据提供的参数集创建测试类的多个实例,通常是浏览器类型 + 用户身份的组合。)共享大约 12 个用户的有限集合。
限制:被测试的应用程序阻止同一用户同时在多个地方登录。因此,如果用户在一个线程中运行的某个测试中登录应用程序,则会导致同一用户在同一时刻在另一个线程中运行的另一个测试中立即注销。
问题:当并行执行的测试无法共享某些资源时,是否有任何推荐的方法来管理线程安全?或者如何强制使用相同资源的那些测试在同一个线程中执行?
感谢您的想法。
这是到目前为止我用 TestNG 找到的一些解决方案的简化示例......:
public abstract class BaseTestCase {
protected static ThreadLocal<WebDriver> threadLocalDriver = new ThreadLocal<>();
protected String testUserName;
private static final Set<String> inUse = new HashSet<>();
public BaseTestCase(WebDriver driver, String testUserName) {
threadLocalDriver.set(driver);
this.testUserName = testUserName;
}
private boolean syncedAddUse(@NotNull String key){
synchronized (inUse){
return inUse.add(key);
}
}
private boolean syncedRemoveUse(@NotNull String key){
synchronized (inUse) {
return inUse.remove(key);
}
}
@DataProvider(parallel = true)
public static Object[][] provideTestData() {
//load pairs WebDriver+user from config file. E.g.:
//Chrome + chromeUser
//Chrome + chromeAdmin
//Firefox + firefoxUser
//etc...
}
@BeforeMethod
public void syncPoint() throws InterruptedException {
while( !syncedAddUse(testUserName) ){
//Waiting due the testUserName is already in use at the moment.
Thread.sleep(1000);
}
}
@AfterMethod
public void leaveSyncPoint(){
syncedRemoveUse(testUserName);
}
}
守着一只汪
相关分类