Write Tests in End Users’ Lingo
Upcoming SlideShare
Loading in...5
×
 

Write Tests in End Users’ Lingo

on

  • 1,920 views

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 ...

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.

Statistics

Views

Total Views
1,920
Views on SlideShare
1,836
Embed Views
84

Actions

Likes
1
Downloads
43
Comments
0

3 Embeds 84

http://q10.indicthreads.com 80
http://www.slideshare.net 3
http://feeds.indicthreads.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

CC Attribution-NoDerivs LicenseCC Attribution-NoDerivs License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Write Tests in End Users’ Lingo Write Tests in End Users’ Lingo Presentation Transcript

    • Write tests in the end users' lingo Speaker Name : Nikhil Fernandes,Chirag Doshi Company Name : Thoughtworks Technologies
    • What is the #1 thing that goes wrong in software projects ?
    • Communication
    • End user BA Dev Application QA
    • End user BA Dev Application QA End user BA Dev Application QA
    •     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 123456 AND the user clicks the login button Then:The user should be directed to the home page AND 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 123456 AND 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
    • Imperative 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 Kochan AND fill in tags as programming,iphone. Then:The librarian should see a message... 'Successfully created book'
    • Declarative 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'
    • End user BA Dev Application QA
    • 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 Login Given the user is on the login page AND the user type username sam AND the user types password 123456 AND the user clicks the login button Then the page should display Welcome Sam Message
    • @Test public 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"); } @Test public 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"); }
    • @Test public void shouldDisplayWelcomeMessageWhenUserSuccessfullyLogsIn(){ new LoginPage() .openLoginPage() .enterUserName('sam').enterPassword('123456') .login().verifySuccessfulLogin(); } @Test public 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 Login Given the user is on the login page AND the user type username sam AND the user types password 123456 AND the user clicks the login button Then 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 UserName Given the user is on the login page AND the user type username wrong AND the user types password 123456 AND the user clicks the login button Then 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 UserName Given the user is on the login page AND the user type username wrong AND the user types password 123456 AND the user clicks the login button Then 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