write tests in end users’ lingo

Post on 06-May-2015

1.519 Views

Category:

Technology

4 Downloads

Preview:

Click to see full reader

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.

TRANSCRIPT

Write tests in the end users' lingo

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

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

Communication

End user BA Dev

QA

Application

End user BA Dev

QA

Application

End userBA Dev

QA

Application

    Acceptance Criteria

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

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

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

Imperative v/s Declarative Acceptance Criteria

Title:Book Submision

Role:As a Librarian

Action:I want to add a new book

Outcome:So that members can borrow this book

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

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

End user BA Dev

QA

Application

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

1.Build abstractions in the code

2.Automate your acceptance criteria

3.IDE support for these automated acceptance criteria

1.Build abstractions in the code

2.Automate your acceptance criteria

3.IDE support for these automated acceptance criteria

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

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

}

@Testpublic void shouldDisplayWelcomeMessageWhenUserSuccessfullyLogsIn(){

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

}

@Testpublic void shouldDisplayErrorMessageWhenUserTriesLoginWithWrongUsername(){

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

}

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;

}

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;

}

}

1.Build abstractions in the code

2.Automate your acceptance criteria

3.IDE support for these automated acceptance criteria

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' do@browser.open('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 element@browser.wait_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

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' do@browser.open('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 element@browser.wait_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

JBehave

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

@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); }

1.Build abstractions in the code

2.Automate your acceptance criteria

3.IDE support for these automated acceptance criteria

Thank You

chirag@thoughtworks.com

nikhil@thoughtworks.com

top related