AutoTest refactoring
Current situation
• 1 person-year
• 300 Tests
• 13k LOC
• Per module:
– Adapter.cs (1k LOC)
– Scenarios.cs (1.5k LOC)
– Test.cs (1k LOC)
• Code style is horrible and not maintainable
Test.cs
Scenarios.Login();
Scenarios.ExpandEnvinceTree();
Scenarios.ExpandCitationsSubtree();
Scenarios.ExpandCitationFolderInTree(citationFolderSrcHost.Name);
Scenarios.CitationFolderCopyViaContextMenu(citationFolder.Name);
Scenarios.InvokeCitationFolderContextMenuPaste(citationFolderDstHost.Name);
Scenarios.CitationFolderCopyCutSetName(citationFolderInfo);
Scenarios.cs
internal static void ConfirmAndBackToMangerCitations()
{Adapter.Otherframe.RefreshDomTree();
Adapter.CitationFolderConfirmButton.MouseClick();
Thread.Sleep(500);
Adapter.Otherframe.RefreshDomTree();
Adapter.FolderOrCitationAfteractionReturnToManagerButton.MouseClick();
}
Adapter.cs
public static Browser CitationsContextmenu{
get{
return ActiveBrowser.Frames.First<Browser>(a => a.FrameInfo.Id == "oCitationContextMenu_3");
}}
public static HtmlAnchor CitationContextmenuProperties{
get{
return CitationsContextmenu.Find.ById<HtmlAnchor>("a_5");
}}
Best practice
google: autotest best practice
• Split API and Tests
• PageObject pattern in API • DSL and own Studio
var loginPage = new LoginPage();
loginPage.UserName = “anton”;
loginPage.Password = “password”;
loginPage.SignIn();
Simple Fields
mainPage
.MainMenu.Open(“TasksAndWorkflows”,”Tasks”)
.MainMenu.TasksAndWorkflows.Tasks();
Chained Menus
page
.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();
}
Popups
Static vs Instance
//Static
LoginPage.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
//Instance
MainFormPage 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 + var
var 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 + chain
TaskBulkEditPage 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);
Summary
• No hesitate small (or no dev.) projects – talk , suggest, review
• Accept challenges in new areas
• AutoTests
– Split them on Tests and API
– PageObject is very effective
Links
• DSL, Page Object и Selenium – path to stable functional tests. Part1
• DSL, Page Object и Selenium – path to stable functional tests. Part2
• http://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_cons
iderations.jsp#chapter06-reference• http://sqa.stackexchange.com/