GlobalVariables類持有它們在我的框架中使用不同的變量其中之一是webdriver的實例:靜態的webdriver在Java實例同步
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();
}
//其他一些方法來初始化其他全局變量。 }
我有使用的驅動程序實例來獲得UI控件元素如許多GetElement類:
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方法來初始化驅動程序實例。不過我不確定我是否正確實施了它。)。現在我不確定如何在給定的情況下最好地實現這個解決方案中的任何一個。任何幫助表示讚賞。 TIA!
首先,我喜歡簡單的「命名和目錄」模式共享全局變量,我不就像你的解決方案關於從全局變量類繼承而來的!所以通過一個界面(一個代理人),你可以在並行的情況下管理系統。 – 2013-09-28 17:37:22