code refactoring of existing autotest to pageobject pattern
TRANSCRIPT
AutoTest refactoring
AutoTest refactoringCurrent situation1 person-year300 Tests13k LOCPer module: Adapter.cs (1k LOC) Scenarios.cs (1.5k LOC)Test.cs (1k LOC)Code style is horrible and not maintainable
Test.csScenarios.Login();Scenarios.ExpandEnvinceTree();Scenarios.ExpandCitationsSubtree();Scenarios.ExpandCitationFolderInTree(citationFolderSrcHost.Name);Scenarios.CitationFolderCopyViaContextMenu(citationFolder.Name);Scenarios.InvokeCitationFolderContextMenuPaste(citationFolderDstHost.Name);Scenarios.CitationFolderCopyCutSetName(citationFolderInfo);
Scenarios.csinternal static void ConfirmAndBackToMangerCitations(){Adapter.Otherframe.RefreshDomTree();
Adapter.CitationFolderConfirmButton.MouseClick();
Thread.Sleep(500);
Adapter.Otherframe.RefreshDomTree();
Adapter.FolderOrCitationAfteractionReturnToManagerButton.MouseClick();}
Adapter.cspublic static Browser CitationsContextmenu{ get { return ActiveBrowser.Frames.First( a => a.FrameInfo.Id == "oCitationContextMenu_3"); }}
public static HtmlAnchor CitationContextmenuProperties{ get{return CitationsContextmenu.Find.ById("a_5");}}
Refactoring?Best practicegoogle: autotest best practice
Split API and TestsPageObject pattern in API DSL and own StudioPage Object examplesvar loginPage = new LoginPage();loginPage.UserName = anton;loginPage.Password = password;loginPage.SignIn();
Simple FieldsmainPage.MainMenu.Open(TasksAndWorkflows,Tasks).MainMenu.TasksAndWorkflows.Tasks();
Chained Menuspage.SearchPanel.DueDate = DueDateType.Next_Week;.SearchPanel.MyTasks = true;.SearchPanel.Search();
DDL(Enums) and Checkbox
Assert.AreEqual(page.Grid.Rows[0].TaskName,"shurik_03022012_40");Assert.AreEqual(page.Grid.Rows[0].Status, "100%");page.Grid.GoToPage(2);Grids
using (RequirementTemplateAssociationPopup popup = page.RequirementTemplate.Change()){popup.Grid.Rows[3].Select();}PopupsStatic vs Instance//StaticLoginPage.Login();MainFormPage.MainMenu.TasksAndWorkflows.Tasks();TaskManagerPage.Grid.OpenContextMenu(0,1).EditTaskPropertiesInBulk();TaskBulkEditPage.AddNewSchedule();TaskBulkEditPage.Save();TaskBulkEditConfirmationPage.Confirm();Assert.IsTrue(TaskManagerPage.Grid.Rows[0].IsNotSimpleTask);Static vs Instance//InstanceMainFormPage main = LoginPage.Login();TaskManagerPage tasks = main.MainMenu.TasksAndWorkflows.Tasks();TaskBulkEditPage bulk = tasks.Grid.OpenContextMenu(0, 1).EditTaskPropertiesInBulk();bulk.AddNewSchedule();TaskBulkEditConfirmationPage confirm = bulk.Save();tasks = confirm.Confirm();Assert.IsTrue(tasks.Grid.Rows[0].IsNotSimpleTask);Static vs Instance//Instance + varvar main = LoginPage.Login();var tasks = main.MainMenu.TasksAndWorkflows.Tasks();var bulk = tasks.Grid.OpenContextMenu(0, 1).EditTaskPropertiesInBulk();bulk.AddNewSchedule();var confirm = bulk.Save();tasks = confirm.Confirm();Assert.IsTrue(tasks.Grid.Rows[0].IsNotSimpleTask);Static vs Instance//Instance + chainTaskBulkEditPage bulk = LoginPage.Login().MainMenu.TasksAndWorkflows.Tasks().Grid.OpenContextMenu(0, 1).EditTaskPropertiesInBulk();bulk.AddNewSchedule();TaskManagerPage tasks = bulk.Save().Confirm();Assert.IsTrue(tasks.Grid.Rows[0].IsNotSimpleTask);SummaryNo hesitate small (or no dev.) projects talk , suggest, reviewAccept challenges in new areasAutoTests Split them on Tests and APIPageObject is very effective
LinksDSL, Page Object Selenium path to stable functional tests. Part1DSL, Page Object Selenium path to stable functional tests. Part2http://code.google.com/p/selenium/wiki/PageObjects http://martinfowler.com/bliki/PageObject.html http://www.ralphlavelle.net/2012/08/the-page-object-pattern-for-ui-tests.html http://docs.seleniumhq.org/docs/06_test_design_considerations.jsp#chapter06-reference http://sqa.stackexchange.com/