Upload
indicthreads
View
1.519
Download
4
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
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' [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
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
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