當您自動化Web UI測試時,您希望組織測試,以便它們可以維護,並且儘可能地減少代碼重複。在去的路上是Page Object pattern。頁面對象模式和替代方法
你在真實世界的項目中試過嗎?有沒有其他的選擇?你如何模擬複雜的網站(很少嵌套的母版頁,彈出窗口,瘋狂驗證的大型表單)?我對一般模式以及特定情況感興趣(Selenium/ASP.NET MVC/NUnit)。
當您自動化Web UI測試時,您希望組織測試,以便它們可以維護,並且儘可能地減少代碼重複。在去的路上是Page Object pattern。頁面對象模式和替代方法
你在真實世界的項目中試過嗎?有沒有其他的選擇?你如何模擬複雜的網站(很少嵌套的母版頁,彈出窗口,瘋狂驗證的大型表單)?我對一般模式以及特定情況感興趣(Selenium/ASP.NET MVC/NUnit)。
你問了很多問題,我會盡量回答其中的一些問題。我已經使用Selenium和桌面WinForms應用程序(雖然這不是嚴格的頁面對象,我用它以相同的方式 - 查看對象,也許?)的Web應用程序中使用頁面對象。我的判決是,它的效果很好,我肯定會推薦它。
這裏是一個什麼樣的測試可能看起來像一個小例子,在路上,我們寫的:
[Test]
public void AccountPageNameIsLoggedInUsersName()
{
FirstPage() // Returns FirstPage
.LoginAs("tobbe", "s3cr3t") // Returns LoggedInPage
.ClickOnMyAccount() // Returns MyAccountPage
.AssertThat(p => p.Name, Is.EqualTo("tobbe")); // p is of type MyAccountPage
}
這裏,硒魔放在第一頁()方法和頁面中。這樣你可以隱藏測試中所有不必要的實現細節。我想你可以弄清楚這些方法是如何實現的。
將Selenium隱藏在頁面內的好處是,您可以在不更改測試的情況下將其轉換爲一個Model-View-Presenter測試,其中PageObject代表視圖(這與我在WinForms應用程序中做的相似)。
關於母版頁,我們所做的事情是,我們的裝飾與接口的頁面和創建擴展方法對這些接口:
public class LoggedInPage : Page<LoggedInPage>, IMainMenuHolder { ... }
public static class MainMenuHolderExtensions
{
public static MyAccountPage ClickOnMyAccount(this IMainMenuHoder me) { ... }
}
我已經寫複雜的頁面,在我的博客上的對象。見http://burdettelamar.wordpress.com/2014/03/21/keep-your-page-objects-dry/
這個想法是與繼承共享常見的頁面元素(我正在用C#編寫)。在Ruby中,您可能會使用混入;在Python中,模塊等