2011-12-04 62 views
4

我們現在寫的用硒2(webdriver的)和TestNG的一個新的測試套件Page對象的模式。我們的測試使用頁面對象模式,我們對目前看起來很滿意。然而,我們在測試中遇到了一個設計問題,我們似乎無法找到一個好的解決方案。 讓我舉個例子。這裏是我們的LoginTestCase:如何設計硒2次測試使用繼承

public class LoginTestCase extends MyTestCase { 
    @BeforeTest 
    public void login() { 
     HomePage homepage = PageFactory.initElements(getDriver(), HomePage.class); 
     LoginPage loginPage = homepage.login(); 
     DashboardPage dashboardPage = loginPage.loginUser("username", "password"); 
    } 
} 

我們希望擴大我們的測試,需要用戶從這個測試登錄。 理想的情況下,我們將能夠寫出這樣的事:

public class DashboardTestCase extends LoginTestCase { 
    @Test 
    public void testDashboard(DashboardPage dashboardPage) { 
     ... 
    } 
} 

此時用戶在DashboardPage,需要的僅僅是這是在LoginTestCase創建的頁面的對象。

我知道顯而易見的解決方案是將該對象存儲在一個變量中(在LoginTestCase中),然後該變量將由子測試用例訪問。但是,這看起來非常醜陋,可能會導致濫用該變量。

有沒有更好的解決方案或解決此設計問題的某種模式?

回答

1

我還沒有找到更好的解決方案。我有一個靜態類的singelton WebDriver,所有的測試用例都可以訪問WebDriver。由於登錄/會話,我的測試類都需要在同一個WebDriver上運行。

3

我們使用依賴注入和Guice與Guice-berry來解決這個問題。頁面對象被注入到測試方法中,WebDriver被注入到頁面對象中。

作爲一個折衷,我們並沒有使用頁面對象之間的所有這些漂亮的小鏈接。

但是,當涉及到並行測試執行時,靜態和單例對於屁股是痛苦的,所以應該避免它們。

0

我認爲你應該在LoginTestCase類的一個私有變量中存儲一個對頁面對象的引用,並提供一個受保護的getter,以便子測試可以訪問pageobject。這有助於實現兩件事情

  1. 在你LoginTestCase封裝變量,這樣沒有人可以搞砸了與..
  2. 提供受保護的吸氣器確保只有孩子測試用例去訪問它,這就是畢竟你想要什麼。這樣應該不成問題。

這就是您的代碼在更改後的樣子。希望有道理:

public class LoginTestCase extends MyTestCase { 

    private dashboardPage; 

    @BeforeTest 
    public void login() { 
     HomePage homepage = PageFactory.initElements(getDriver(), HomePage.class); 
     LoginPage loginPage = homepage.login(); 
     dashboardPage = loginPage.loginUser("username", "password"); 
    } 

    protected void getDashBoardPage() { 
     return dashboardPage; 
    } 

} 

public class DashboardTestCase extends LoginTestCase { 
    @Test 
    public void testDashboard() { 
      DashboardPage dashboardPage = getDashBoardPage(); 
     ... 
    } 
}