gpt4 book ai didi

java - 我有 POM 模型,但运行并行测试用例时有时会失败,所以我想使用 ThreadLocal

转载 作者:行者123 更新时间:2023-12-01 10:06:03 24 4
gpt4 key购买 nike

在我的框架中,我使用了 POM 和 pageFactory 实现,但现在我想并行运行它们,任何人都可以帮助我了解 ThreadLocal 概念,因为我是新手

最佳答案

想象一家餐厅。想想一张 table 。表无法控制并发访问(如交通灯),因此它不被认为是线程安全的。如果只有一张 table ,所有客人都会争夺一个座位或半坐在椅子上。一个解决方案是,每个客人都带着自己的 table (实例变量),但这会填满餐厅的空间。相反,您为每组客人准备了一张 table 。只要你坐在 table 上,你就可以独占访问它,一旦这组客人离开,下一组客人就可以访问它,所以它是一个共享资源,没有并发访问。示例中的表是一个 ThreadLocal。

有两个选项可用于初始化本地线程 - 带或不带初始值。

没有初始值

当您有可重用的工作线程时。您可以在任务执行开始时设置 ThreadLocal,并可以在任务完成后清除它。

static ThreadLocal<YourType> LOCAL = new ThreadLocal<>();

void beginWork() {
LOCAL.set(yourTypeInstance);
}

具有初始值

当你想要确保值已初始化并且值本身与上下文无关时,类似于单例,但与任务示例不同。

static ThreadLocal<YourType> LOCAL = ThreadLocal.withInitialValue(() -> new YourType());

void beginWork() {
YourType localInstance = LOCAL.get();
}

重要!ThreadLocal 是共享值的概念,应该始终是静态引用,使用非静态引用可能会导致严重的内存泄漏(每个对象和每个线程的实例)。

单例是具有并发访问选项的共享资源,而线程局部变量是具有顺序访问的共享资源。线程局部中的对象不必是线程安全的。从技术上讲,线程局部对象保存在内存的一个特殊区域中,只有线程可以独占访问该区域。

对于您的具体问题,如果满足以下条件,本地线程对您的工厂有意义

  • 你的工厂不是线程安全的
  • 您的工厂有一个不应在线程之间共享的状态

如果为此使用线程本地,请使用带有初始值的选项来为每个使用的线程创建一次工厂

根据您提供的信息,我建议改为修复线程安全问题。 POM 应该很容易被测试重用,并且不应该具有共享状态(静态访问)。工厂也一样。而且您还应该为每个线程使用一个单独的 WebDriver,但是为每个测试创建一个作为实例变量而不使用本地线程并将其分配给 POM 应该是完全可以的。

但是没有任何规则无一异常(exception),根据实现模型,您可能已经围绕保存对当前驱动程序的引用的当前上下文进行了设计,因此您可以为司机。在这种情况下,ThreadLocal 就是最佳选择。

class TestContext {

static ThreadLocal<WebDriver> CURRENT_DRIVER = ThreadLocal.withInitialValue(() -> new FirefoxDriver());

static WebDriver currentDriver(){
return CURRENT_DRIVER.get();
}
}

//your POM
class LoginPage {
void login(String username) {
TestContext.currentDriver().getElementById(...).sendKeys(username);
//...
}
}

关于java - 我有 POM 模型,但运行并行测试用例时有时会失败,所以我想使用 ThreadLocal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36468781/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com