2016-09-14 317 views
0

如何使用在不同類中設置的ThreadLocal值?通過做在不同的類中獲取ThreadLocal變量 - Java - Selenium WebDriver

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

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

我知道如何從同一個類中的「獲取」他們:

例子,我設置A類這些變量

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

但我無法找到任何關於如何使用/讓他們在B類?

基本的最終目標是我試圖將我的Selenium WebDriver測試轉換爲並行運行。這些文本值將被輸入到一個類(A)中,但是接下來我有另一個類(B),其中包含需要知道該類的「方法」(調用數據庫條目,驗證屏幕數據等)在(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

我認爲threadlocal並不是在類之間共享數據的最佳工具。您能否解釋一下您嘗試使用threadlocals解決的問題? –

+0

簡單版本是我試圖將我的Selenium WebDriver測試轉換爲並行運行。這些文本值將被輸入到一個類(A)中,但是接下來我有另一個類(B),其中包含需要知道該類的「方法」(調用數據庫條目,驗證屏幕數據等)在(A)類中輸入的數據。 –

+0

JUnit或testNG? –

回答

0

首先我不是TestNG的粉絲。如果將Surefire配置爲並行運行或使用Parallel runner,則JUnit也可以執行並行運行測試。考慮可能更改爲JUnit。

如果你堅持硒,那麼你可以創建一個ITestListener實現。這個類可以有一個靜態的ThreadLocal。這應該存儲測試使用的WebDriver。您創建一個靜態方法,它返回測試類的ThreadLocal值。在onTestStart方法中,您可以照顧啓動瀏覽器,在onTestSuccess中您可以停止瀏覽器,在onTestFailure中您可以截圖,保存HTML和日誌,並停止瀏覽器。

還要小心,你使用PageObject模式。

0

ThreadLocal<T>想象爲Map<Thread,T>。它並不是一種在類之間共享值的方式,而是一種在每個線程中維護不同值的方式。

你傳遞這個變量的方式與其他變量完全相同。通常通過將它返回到某個地方和/或將其存儲爲一個字段。