获取不同类中的ThreadLocal变量 - Java - Selenium WebDriver

时间:2016-09-14 20:09:51

标签: java selenium selenium-webdriver testng

如何使用在其他类中设置的ThreadLocal值?

示例,我在A类中设置了这些变量:

ThreadLocal<String> username = new ThreadLocal<String>();
username.set("user");

ThreadLocal<String> password = new ThreadLocal<String>();
password.set("pass");

我知道如何&#34;得到&#34;他们来自同一个班级:

String myUsername = username.get();
String myPassword = password.get();

但是我无法找到关于如何在B级中使用/获取它们的任何内容?

基本的最终目标是我试图将我的Selenium WebDriver测试转换为并行运行。这些文本值将输入到一个类(A)中,但是我有另一个类(B)包含&#34;方法&#34;被调用(检查数据库条目,验证屏幕数据等),需要知道在类(A)中输入的数据。

我为非ThreadLocal变量成功执行此操作的方式如下:

在A类中设置值:

@Test (priority = 1)
public void enterData() {

    String environment = "QA";

    // Pass environment to stored variables
    StoredVariables newEnv = new StoredVariables();
    newEnv.setEnv(environment);

    driver.enterData;

}

将其存储在B类(StoredVariables)中:

public class StoredVariables {

    private static String environment = "";

    public StoredVariables() {

    }

    public static String getEnv() {return environment;}
    public void setEnv(String s) {environment = s;}

}

从C类访问它:

@Test (priority = 1)
public void verifyData() {

    String environment = StoredVariables.getEnv();

}

2 个答案:

答案 0 :(得分:0)

首先,我不是TestNG的粉丝。如果您将Surefire配置为并行运行它们或者使用Parallel runner,则JUnit也可以进行并行运行测试。考虑可能改为JUnit。

如果你坚持使用selenium,那么你可以创建一个ITestListener实现。这个类可以有一个静态的ThreadLocal。这应该存储测试使用的WebDriver。您创建一个静态方法,它返回测试类的ThreadLocal值。在onTestStart方法中你可以负责启动浏览器,在onTestSuccess中你可以停止浏览器,在onTestFailure你可以截取屏幕截图,保存HTML和日志,并停止浏览器。

还要注意使用PageObject模式。

答案 1 :(得分:0)

ThreadLocal<T>视为Map<Thread,T>。它并不意味着在类之间共享值,而是在每个线程中维护不同值的方法。

传递此变量的方式与任何其他变量完全相同。通常通过将其返回到某处并/或将其存储为字段。