GlobalVariables 类包含在我的框架中使用的不同变量,其中一个是 WebDriver 实例:
public class GlobalVariables
{
public static WebDriver driver;
//Some other static global variables required across my framework
public GlobalVariables(String propertiesFile)
{
initializeVariables(propertiesFile);
}
public void initializeVariables(String propertiesFile)
{
GlobalInitializer obj=new GlobalInitializer();
obj.initialize(String propertiesFile);
}
}
GlobalInitializer 包含初始化所有 GlobalVariables 的方法:
public class GlobalInitializer extends GlobalVariables
{
public void initialize(String propertiesFile)
{
//Some logic to read properties file and based on the properties set in it, call other initialization methods to set the global variables.
}
public void initializeDriverInstance(String Browser)
{
driver=new FireFoxDriver();
}
//其他一些初始化其他全局变量的方法。}
我有许多 GetElement 类,它们使用驱动程序实例来获取 UI 控制元素,例如:
public class GetLabelElement extends GlobaleVariables
{
public static WebElement getLabel(String someID)
{
return driver.findElement(By.id(someId));
}
//Similar methods to get other types of label elements.
}
public class GetTextBoxElement extends GlobaleVariables
{
public static WebElement getTextBox(String someXpath)
{
return driver.findElement(By.xpath(someXpath));
}
//Similar methods to get other types of text box elements.
}
我有其他类在 UI 控件上执行一些操作(这些类也使用全局变量)例如:
public class GetLabelProperties extends GlobalVariables
{
public static String getLabelText(WebElement element)
{
return element.getText();
}
}
public class PerformAction extends GlobalVariables
{
public static void setText(String textBoxName,String someText)
{
driver.findElement(someLocator(textBoxName)).setText("someText");
}
//Some other methods which may or may not use the global variables to perform some action
}
我在 testng 中的测试类如下所示:
public class TestClass
{
GlobalVariables globalObj=new GlobalVariables(String propertiesFile);
@Test(priority=0)
{
GlobalVariables.driver.get(someURL);
//Some assertion.
}
@Test(priority=1)
{
WebElement element=GetLabelElement.getLabel(someID);
String labelName=GetLabelProperties.getLabelText(element);
//Some assertion.
}
@Test(priority=2)
{
WebElement element=GetTextBoxElement.getTextBox(someXpath);
PerformAction.setText(element.getText(),someText);
//Some assertion.
}
}
我有基于场景的类似的多个测试类。现在,如果我单独运行这些测试,它们运行良好。但是当我尝试并行运行它们时,这些测试会以某种奇怪的方式失败。在分析时,我发现它是由每个测试初始化的静态全局变量,从而使其他测试失败。现在我应该如何实现我的目标,即并行运行多个测试而对我的框架设计进行最小的更改?我已经尝试搜索选项,并且遇到了一些选项,即 1) 使用同步。2)创建ThreadLocal实例(注意:我已经尝试过这个解决方案但仍然是同样的问题。测试相互混淆导致失败。我已将 WebDriver 实例标记为 ThreadLocal 并覆盖了 ThreadLocal 的 initialValue 方法来初始化驱动程序实例。我仍然不确定我是否正确实施了它。)。现在我不确定如何在给定的场景中最好地实施任何一种解决方案。任何帮助表示赞赏。蒂亚!