2015-07-21 30 views
0

我正在使用Selenium + TestNG執行我的測試用例。我的測試用例分佈在多個類中。我想在每個班級都使用同一份webDriver。 (我不想每次登錄,然後做其他操作,所以選擇調用單獨的瀏覽器每個類都不見了)。 要解決這個問題,現在我正在使用靜態webdriver對象繼承。但在並行模式下使用硒網格時,它不起作用,因爲它使用相同的對象。你能告訴我一種方式,我可以與多個類共享對象或爲了在每個「測試」(就像我爲每個測試運行單獨的Java程序)上創建一個不同的靜態實例。TestNG,Selenium如何在多個類中共享對象

+0

不明確。你想有一個單一的瀏覽器實例嗎?如果那麼你想在網格中做什麼?您可以使用網格在多個節點上運行多個實體 – Shamik

+0

然後,您沒有正確使用TestNg。只需使用testng.xml並行運行測試,就不需要共享同一個對象,或者爲此繼承這些類。 – Manu

回答

2

當前,您正在跨各種類/測試使用webdriver對象的靜態引用。因此,有一個驅動程序實例正在修改代碼中的靜態資源。但是當你使用網格時,你會爲每個節點創建不同的驅動程序實例。這些驅動程序將並行運行,並將訪問共享資源(靜態變量等),同時更改並覆蓋其他驅動程序實例所做的更改,這些更改會導致問題。

編寫代碼,使資源不共享(最小使用靜態)。嘗試將您的驅動程序實例傳遞給方法,以確保所需的驅動程序僅執行那段代碼。

+0

感謝Vishal,但這不是解決方案。我知道代碼需要寫成不共享資源的方式(即沒有靜態變量)。我想要一種技術實現的方式。 我實現了通過一個類傳遞給另一個類的參數,但這樣我必須通過java代碼傳遞對象,我不能通過testng來完成。如果你知道一種方法,請求你分享。 –

1

以下是我如何實施解決方案。

我有一個對象myObj,它裏面有webDriver對象,還有更多的東西。我創建了靜態對象myObj的靜態數組。它是這樣的

//有WebDriver實現的類的一部分。 WebDriver不是靜態的btw。

private static MyClass[] ObjectArr = new MyClass[100]; 

public static MyClass getInstance(Integer id){ 
    id = (id==null)? 0 : id; 
    if(ObjectArr[id] == null){ 
     ObjectArr[id] = new MyClass(); 
    } 
    return ObjectArr[id]; 
} 

現在,當我想在我的testng類中使用它時,我這樣做。

public class x{ 
MyClass i; 

@BeforeClass 
@Parameters("instanceId") 
public void getInstance(@Optional String instanceId){ 
    i = MyClass.getInstance(Integer.parseInt(instanceId)); 
} 
} 

這裏是我的testng.xml的樣子。

<test name="FireFox" preserve-order="true"> 
    <parameter name="instanceId" value="1" /> 
    <parameter name="browser" value="firefox" /> 
    <classes> 
     <class name="com.app.Login"/> 
    </classes> 
</test> 

<test name="Chrome" preserve-order="true"> 
    <parameter name="instanceId" value="2" /> 
    <parameter name="browser" value="chrome" /> 
    <classes> 
     <class name="com.app.Login"/> 
    </classes> 
</test> 

這工作完全對我來說硒電網並聯和正常的方式。

0

我們的努力與我們的測試工作類似的情況。我們還希望利用TestNG並行化和Selenium Web驅動程序。不幸的是,在啓用任何TestNG並行模式時,管理每個測試類中的Web驅動程序生命週期或試圖使用持有Web驅動程序的靜態類都不奏效。即。 parallel="tests|classes|methods"。使用主動TestNG線程和實例化的Web驅動程序來匹配正在測試的類和方法在工作時很難應付。我們花費更多的時間來搞清楚網絡驅動程序的生命週期,而不是進行真正的Web應用程序測試。我們找到了更好的方法。我們有一個開源項目,爲TestNG/Selenium測試抽象出Web驅動程序生命週期管理。它正確地支持每種TestNG並行模式,爲每個被測試的測試類方法提供正確和有效的Web驅動程序。這對我們的測試工作幫助很大。也許它也可以用於你的情況。或者如果沒有其他的東西給你一個關於你如何解決它的想法。該項目已在GitHub上發佈,名稱爲Concurrent Selenium TestNG (COSENG)。親切的問候。

0

我遇到了類似的問題。這是我做的。

假設:說B類測試依賴於A類實例。

@AfterClass(alwaysRun = true) 
public void insertValueIntoAttribute(ITestContext ctx) { 
    ctx.setAttribute("INSTANCE_OF_A", this); // from inside class A tests 
} 

然後在B類中,我檢索A的這個實例並使用它。

@BeforeClass(alwaysRun=true) 
@SuppressWarnings("unchecked") 
public void fetchData(ITestContext ctx) { 
    A a = (A) ctx.getAttribute("INSTANCE_OF_A"); 
} 

希望這可以幫助別人。