gui testing 2015-01-30, novatec // le. why test the gui?
TRANSCRIPT
Web-UI Testing mit testIT - WebTester3
Why test the GUI?
30.01.2015
User Interface
API
Business
Persistence
Unit-Tests
Component-Tests
Integration-Tests
System-Test
Web-UI Testing mit testIT - WebTester4
Why test the GUI?
30.01.2015
The User Interface …
… is part of the application.
… is an entry point into the system.
… is what the customer perceives as THE „application“.
… contains it‘s own business logic.
6
Agile Testing Pyramid
30.01.2015 Web-UI Testing mit testIT - WebTester
Technology
Business
Detail
Complexity / Cost
Unit Tests
Quantity
Manual,Exploratory
Testing
AutomatedUI-Tests
Service Layer Tests(API-Layer)
Unit & Component Tests
7
GUI-Testing Pyramid
30.01.2015 Web-UI Testing mit testIT - WebTester
Unit Tests
UISystemTests
UI Integration Tests
UI “Unit” Tests
8
Different Kinds of GUI-Tests
30.01.2015 Web-UI Testing mit testIT - WebTester
UI
Mock-API
UI „Unit“ UI Integration
API
Business
Persistence
UI System
10
Scenario: Login
30.01.2015 Web-UI Testing mit testIT - WebTester
Hello testuser!
testuser
********
LOGIN
Username:
Password:
login.html main.html
11
Scenario: Login with default Selenium code (and no optimization)
30.01.2015 Web-UI Testing mit testIT - WebTester
@Testpublic void testValidLogin () { webDriver.findElement(By.id("username")).sendKeys("testuser"); webDriver.findElement(By.id("password")).sendKeys("123456"); webDriver.findElement(By.id("login")).click(); String headline = webDriver.findElement(By.id("headline")).getText(); assertThat(headline, is("Hello testuser!"));}
@Testpublic void testInvalidLogin () { webDriver.findElement(By.id("username")).sendKeys(„foo"); webDriver.findElement(By.id("password")).sendKeys("123456"); webDriver.findElement(By.id("login")).click(); String errorMessage = webDriver.findElement (By.id("errorMessage")).getText(); assertThat(errorMessage, is("Wrong Credentials!"));}
12
Scenario: Login
30.01.2015 Web-UI Testing mit testIT - WebTester
Hello testuser!
testuser
********
LOGIN
Username:
Password:
login.html main.html
LoginPage.java MainPage.java
13
Scenario: Login with Page Objects
30.01.2015 Web-UI Testing mit testIT - WebTester
@Testpublic void testValidLogin () { MainPage mainPage = loginPage.login("testuser", "123456"); assertThat(mainPage.getWelcomeMessage(), is("Hello testuser!"));}
@Testpublic void testInvalidLogin () { loginPage = loginPage.loginExpectingError("foo", "123456"); assertThat(loginPage.getErrorMessage(), is("Wrong Credentials!"));}
14
Different kinds of Page Object methods
30.01.2015 Web-UI Testing mit testIT - WebTester
Hello testuser!
testuser
********
LOGIN
Username:
Password:Actions
Information Getter
Navigations
Workflows
15
Page Object Pattern: Actions
30.01.2015 Web-UI Testing mit testIT - WebTester
public LoginPage setUsername(String value){ username.sendKeys(value); return this;}
public LoginPage setPassword(String value){ password.sendKeys(value); return this;}
16
Page Object Pattern: Navigations
30.01.2015 Web-UI Testing mit testIT - WebTester
public MainPage clickLogin(){ login.click(); return createPageObject(MainPage.class);}
public LoginPage clickLoginExpectingError(){ login.click(); return createPageObject(LoginPage.class);}
17
Page Object Pattern: Workflows
30.01.2015 Web-UI Testing mit testIT - WebTester
public MainPage login(String username, String password){ return setUsername(username).setPassword(password) .clickLogin();}
public LoginPage loginExpectingError(String username, String password){ return setUsername(username).setPassword(password) .clickLoginExpectingError();}
18
Page Object Pattern: Information Getter
30.01.2015 Web-UI Testing mit testIT - WebTester
public String getErrorMessage () { return errorMessage.getText();}
public List<String> getErrorMessages () { List<String> returnValue = new LinkedList<>(); for(ErrorMessage message : errorMessages){ returnValue.add(message.getText()); } return returnValue;}
Web-UI Testing mit testIT - WebTester19
Page Object Pattern
30.01.2015
With the help of the Page Object Pattern…
… GUI-Tests are maintainable.
… new tests can be implemented with ease and speed.
… tests focus on the “WHAT” not on the “HOW”.
Web-UI Testing mit testIT - WebTester21
What is testIT WebTester?
30.01.2015
Best Practices from ears of actual project experience
Page Object Pattern as a framework
Efficiency-oriented
Extendable in order to adapt to different functional and technological project contexts
22
WebTester
What is testIT WebTester?
30.01.2015 Web-UI Testing mit testIT - WebTester
Selenium
Browser
Testcode
Web-UI Testing mit testIT - WebTester23
WebTester Feature: Typesave API (Functional Classes)
30.01.2015
Web-UI Testing mit testIT - WebTester24
WebTester Feature: Event System
30.01.2015
EventRegistry
click()
EventListener
EventListener
EventListener
Web-UI Testing mit testIT - WebTester25
WebTester Feature: Extendibility
30.01.2015
You can …
… call the Selenium API directly if any feature is missing.
… create custom Page Objects for project specific components and widgets.
… create custom Event Listeners, f.e. to handle exceptions.
… create custom Browser Factories in order to customize the Web Driver to project specifications.