autotest refactoring. Архитектурные семинары softengi

19
AutoTest refactoring

Upload: softengi-inspired-software-engineering

Post on 17-Jul-2015

114 views

Category:

Education


1 download

TRANSCRIPT

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");

}}

Refactoring?

Best practice

google: autotest best practice

• Split API and Tests

• PageObject pattern in API • DSL and own Studio

Page Object examples

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/