如何使用在其他类中设置的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();
}
答案 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>
。它并不意味着在类之间共享值,而是在每个线程中维护不同值的方法。
传递此变量的方式与任何其他变量完全相同。通常通过将其返回到某处并/或将其存储为字段。