Code refactoring of existing AutoTest to PageObject pattern

19
AutoTest refactoring

Transcript of Code refactoring of existing AutoTest to PageObject pattern

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/