再談 Page Objects Pattern

上次聊到了利用 Page Objects pattern 實作自動化測試的好處,其實好處不僅於此,官方文件裡面還提到了許多設計上的建議,我們拿幾個程式範例來仔細解說。

* 每個服務的返回值,是接下來會進入的頁面

public class LoginPage {
    public HomePage loginAs(String username, String password) {
        // ... clever magic happens here
    }

    public LoginPage loginAsExpectingError(String username, String password) {
        //  ... failed login here, maybe because one or both of the username and password are wrong
    }

    public String getErrorMessage() {
        // So we can verify that the correct error is shown
    }
}

這邊可以看到 loginAs() 的返回值是 HomePage,表示正常登入以後,會跑進 HomePage。但 loginAsExpectingError() 的返回值是 LoginPage,表示登入失敗後,一樣會停留在 LoginPage,符合我們預期。這樣設計有什麼好處呢?

第一,我們很容易執行後續的動作,例如 HomePage 有提供 goToInbox() 這個服務,實作上我們可以用連續動作一氣呵成:

loginAs("test@test.com", "password").goToInbox();

第二,程式是否進入符合我們預期的頁面?這件事情應該交給誰檢查?我們可以將目前頁面的檢查,加到每個頁面的建構子之中,如果非預期頁面,就丟出例外。每個頁面的建構子都必須檢查自己是否為目前顯示的頁面,責任歸屬上也很合理,下面是一個範例:

    public LoginPage(WebDriver driver) {
        this.driver = driver;

        // Check that we're on the right page.
        if (!"Login".equals(driver.getTitle())) {
            // Alternatively, we could navigate to the login page, perhaps logging out first
            throw new IllegalStateException("This is not the login page");
        }
    }

* 頁面的服務不做 Assert 判斷,這些交給最外層的測試碼

public void testMessagesAreReadOrUnread() {
    Inbox inbox = new Inbox(driver);
    assertTrue(inbox.isMessageWithSubjectIsUnread("I like cheese"));
    assertFalse(inbox.isMessageWithSubjectIsUnread("I'm not fond of tofu"));
}

頁面服務應該專注在執行工作、提供外界需要的資訊。而判斷目前行為是否正常的測試碼應該寫在最外層,這樣兩邊的程式碼可讀性都會提高。

以這個例子來說,Inbox 頁面提供了 isMessageWithSubjectIsUnread() 這個服務,最外層的測試碼根據測試條件來使用。

範例 1 也提供了一個很好的例子,LoginPage 提供了 getErrorMessage() 這個服務,讓測試碼在登入失敗的情況取得錯誤訊息,判斷錯誤訊息是否正確。

參考資料

Page Objects on Selenium

廣告

發表迴響

Please log in using one of these methods to post your comment:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s