33
Write tests in the end users' lingo Speaker Name : Nikhil Fernandes,Chirag Doshi Company Name : Thoughtworks Technologies

Write Tests in End Users’ Lingo

Embed Size (px)

DESCRIPTION

Many of the testers understand the importance of automated tests which can test the system end to end. There are plenty of tools like Selenium, Watir, White etc. which allow you to drive your web or desktop ui for these tests. The intention of these tests is to mimic the user’s interaction with the system and automatically validate that he could achieve his goals. Considering this, wouldnt it make sense for tests to talk the same language that an end user understands. Although, When we look around today most of the functional tests talk the language that the browser understands, it goes click button A, enter value in textfield B etc. In this session we will share various approaches which allow you to build tests which an end user can understand and maybe even participate in writing. We will look at the problems with the usual approach of end-to-end writing tests such as being too verbose and technical. We will look at the multiple benefits of writing tests in the end user’s language and the different ways in which to achieve it. Finally, we will look at the key takeaways.

Citation preview

Page 1: Write Tests in End Users’ Lingo

Write tests in the end users' lingo

Speaker Name : Nikhil Fernandes,Chirag DoshiCompany Name : Thoughtworks Technologies

Page 2: Write Tests in End Users’ Lingo

What is the #1 thing that goes wrong in software projects ?

Page 3: Write Tests in End Users’ Lingo

Communication

Page 4: Write Tests in End Users’ Lingo

End user BA Dev

QA

Application

Page 5: Write Tests in End Users’ Lingo

End user BA Dev

QA

Application

End userBA Dev

QA

Application

Page 6: Write Tests in End Users’ Lingo

    Acceptance Criteria

Page 7: Write Tests in End Users’ Lingo

Title:I want to login to the website

Role:As a user

Action:I want to login into the website

Outcome:So that I can view exclusive content

Page 8: Write Tests in End Users’ Lingo

Acceptance Criteria:

Scenario:Successful Login

Given:The user is on the login page

When:The user types username sam AND the user types password 123456AND the user clicks the login button

Then:The user should be directed to the home pageAND the page should display Welcome Sam message

Page 9: Write Tests in End Users’ Lingo

Acceptance Criteria:

Scenario:Invalid Username

Given:The user is on the login page

When:The user types username wrong AND the user types password 123456AND the user clicks the login button

Then:The page should display Authentication failed message

Page 10: Write Tests in End Users’ Lingo

Imperative v/s Declarative Acceptance Criteria

Page 11: Write Tests in End Users’ Lingo

Title:Book Submision

Role:As a Librarian

Action:I want to add a new book

Outcome:So that members can borrow this book

Page 12: Write Tests in End Users’ Lingo

Acceptance Criteria:

Scenario:Successful Submission

Given:The librarian is on the admin page

When:he/she fills in the name as Programming in Objective-C AND fills in author as Stephen G KochanAND fill in tags as programming,iphone.

Then:The librarian should see a message... 'Successfully created book'

Imperative

Page 13: Write Tests in End Users’ Lingo

Acceptance Criteria:

Scenario:Successful Submission

Given:The librarian is on the admin page

When:he/she adds a new book to the system

Then:The librarian should see a message... 'Successfully created book'

Declarative

Page 14: Write Tests in End Users’ Lingo

End user BA Dev

QA

Application

Page 15: Write Tests in End Users’ Lingo

Three ways to build test cases in the user's language

Page 16: Write Tests in End Users’ Lingo

1.Build abstractions in the code

2.Automate your acceptance criteria

3.IDE support for these automated acceptance criteria

Page 17: Write Tests in End Users’ Lingo

1.Build abstractions in the code

2.Automate your acceptance criteria

3.IDE support for these automated acceptance criteria

Page 18: Write Tests in End Users’ Lingo

Scenario Successful LoginGiven the user is on the login pageAND the user type username samAND the user types password 123456AND the user clicks the login buttonThen the page should display Welcome Sam Message

Page 19: Write Tests in End Users’ Lingo

@Testpublic void shouldDisplayWelcomeMessageWhenUserSuccessfullyLogsIn(){

selenium.click(LOGIN_LINK);selenium.waitForElementPresent(LOGIN_BUTTON);selenium.type(LOGIN_USERNAME_EDIT_FIELD, ”sam");selenium.type(LOGIN_PASSWORD_EDIT_FIELD, “123456");    selenium.click(LOGIN_BUTTON);selenium.waitForElementPresent("Welcome");

}

@Testpublic void shouldDisplayErrorMessageWhenUserTriesLoginWithWrongUsername(){

selenium.click(LOGIN_LINK);selenium.waitForElementPresent(LOGIN_BUTTON);selenium.type(LOGIN_USERNAME_EDIT_FIELD, ”wrong");selenium.type(LOGIN_PASSWORD_EDIT_FIELD, ”123456");    selenium.click(LOGIN_BUTTON);selenium.waitForElementPresent("Authentication Failed");

}

Page 20: Write Tests in End Users’ Lingo

@Testpublic void shouldDisplayWelcomeMessageWhenUserSuccessfullyLogsIn(){

new LoginPage().openLoginPage().enterUserName('sam').enterPassword('123456').login().verifySuccessfulLogin();

}

@Testpublic void shouldDisplayErrorMessageWhenUserTriesLoginWithWrongUsername(){

new LoginPage().openLoginPage().enterUserName('wrong').enterPassword('123456').login().verifyUserIsNotAuthenticated();

}

Page 21: Write Tests in End Users’ Lingo

public class LoginPage {

private Selenium selenium;

public LoginPage(Selenium selenium) {this.selenium = selenium;

}

public LoginPage openLoginPage() {selenium.click(LOGIN_LINK);selenium.waitForElementPresent(LOGIN_BUTTON);return this;

}

public LoginPage enterUserName(String userName){selenium.type(LOGIN_USERNAME_EDIT_FIELD, userName);return this;

}

Page 22: Write Tests in End Users’ Lingo

public LoginPage enterPassword(String password){selenium.type(LOGIN_PASSWORD_EDIT_FIELD, password);return this;

}

public LoginPage login(){selenium.click(LOGIN_BUTTON);return this;

}

public boolean verifyUserIsNotAuthenticated(){selenium.waitForElementPresent("Authentication Failed");return this;

}

public boolean verifySuccessfulLogin(){selenium.waitForElementPresent("Welcome");return this;

}

}

Page 23: Write Tests in End Users’ Lingo

1.Build abstractions in the code

2.Automate your acceptance criteria

3.IDE support for these automated acceptance criteria

Page 24: Write Tests in End Users’ Lingo
Page 25: Write Tests in End Users’ Lingo

Scenario Successful LoginGiven the user is on the login pageAND the user type username samAND the user types password 123456AND the user clicks the login buttonThen the page should display Welcome Sam Message

Given 'the user is on the login page' [email protected]('http://foobar.com/')

end

AND /the user types (\w+) (\w+)/ do |element,value|@browser.type(element, value)

end

AND /the user clicks (\w+) button/ do |element|@browser.click [email protected]_for_page_to_load

end

Then /the page should display (.*) Message/ do |expected_textl|@browser.is_element_present("css=p['#{expected_text}']").should be_true

end

Page 26: Write Tests in End Users’ Lingo

Scenario Invalid UserNameGiven the user is on the login pageAND the user type username wrongAND the user types password 123456AND the user clicks the login buttonThen the page should display 'Authentication Failed' Message

Given 'the user is on the login page' [email protected]('http://foobar.com/')

end

AND /the user types (\w+) (\w+)/ do |element,value|@browser.type(element, value)

end

AND /the user clicks (\w+) button/ do |element|@browser.click [email protected]_for_page_to_load

end

Then /the page should display (.*) Message/ do |expected_textl|@browser.is_element_present("css=p['#{expected_text}']").should be_true

end

Page 27: Write Tests in End Users’ Lingo

JBehave

Page 28: Write Tests in End Users’ Lingo

Scenario Invalid UserNameGiven the user is on the login pageAND the user type username wrongAND the user types password 123456AND the user clicks the login buttonThen the page should display 'Authentication Failed' Message

@Given("the user is on the login page") public void theUserIsOnTheLoginPage() {

LoginPage loginPage = new LoginPage(); loginPage.verifyPresenceOfLoginButton();

}

@When("the user types username $username") public void theUserTypesUsername(String username) {

loginPage().typeUsername(username); }

@When("the user types password $password") public void theUserTypesPassword(String password) {

loginPage().typePassword(password); }

Page 29: Write Tests in End Users’ Lingo

@When("clicks the login button") public void clicksTheLoginButton() {

loginPage().login(); }

@Then("the page should display $errorMessage Message") public void thePageShouldDisplayErrorMessage(String errorMessage) {

loginPage().verifyPresenceOfErrorMessage(errorMessage); }

Page 30: Write Tests in End Users’ Lingo

1.Build abstractions in the code

2.Automate your acceptance criteria

3.IDE support for these automated acceptance criteria

Page 31: Write Tests in End Users’ Lingo
Page 32: Write Tests in End Users’ Lingo