The document discusses three ways to write tests using the language of end users: 1) Build abstractions in the code to represent user actions and pages, 2) Automate acceptance criteria using a tool like JBehave to execute the criteria as tests, and 3) Provide IDE support for editing and running the automated acceptance criteria tests.
7. 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
8. 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
9. 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
12. 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'
15. Three ways to build test
cases in the user's
language
16. 1.Build abstractions in the code
2.Automate your acceptance criteria
3.IDE support for these automated
acceptance criteria
17. 1.Build abstractions in the
code
2.Automate your acceptance criteria
3.IDE support for these automated
acceptance criteria
18. 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
20. @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();
}
21. 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;
}
22. 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;
}
}
23. 1.Build abstractions in the code
2.Automate your
acceptance criteria
3.IDE support for these automated
acceptance criteria
24.
25. 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
26. 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
28. 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);
}
29. @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);
}
30. 1.Build abstractions in the code
2.Automate your acceptance criteria
3.IDE support for these
automated acceptance
criteria