BDD Cucumber Selenium Webdriver Appium Rest-Assured Java Test Automation Framework
This project is a template test automation framework, which provides structured and standard way of creating automated test scripts for GUI, Mobile and API level tests across projects
This is a reusable automation framework that blends together Selenium WebDriver, Appium, Android Driver, RestEasy, SauceLabs and Cucumber JVM (incorporating Gherkin and the BDD 'Given, When Then' testing construct)
This framework supports automation of : -
*Web Browsers (Firefox, Chrome, Internet Explorer, Safari)
*Web Browser Responsive Design with view ports configuration
*Mobile Automation on Emulated and Physical Devices, for Native, Hybrid, and Web App
*Mobile Automation on Cloud using SauceLabs
The framework incorporates design principle of BDD (Behaviour driven development) which promotes writing acceptance tests by describing behaviour of application under test in simple english language from the perspective of its stakeholders. Having test written in Natural language helps the Project Team (Product Owners, Business Analysts, Development and QA team) to understand and track the requirements
Supports Custom Page Object model which represents the screens of AUT as a series of objects and encapsulates the fields represented by a page which ultimately avoids duplication and improves code maintainability and readability.
Sonar Continuous Code Quality Management: - conventions (Checkstyle), bad practices (PMD) and potential bugs (FindBugs).
Tools & libraries
The test automation framework is comprised of following tools and libraries
*Cucumber-JVM:- BDD Framework
*Custom Page Object Pattern and utility functions
*Selenium WebDriver: - Browser automation framework
*Selenium Grid: - Distribute test Execution across several machines
*Android Driver: - Android Mobile Automation
*Appium: - Mobile Native app, Hybrid App, Web app
*SauceLabs: - Cloud Based testing of mobile and Web Apps
*JAVA: - Programming language
*TestNg: - TestNg Java testing framework
*Maven: - Build tool
*Jenkins: - Continuous Integration
*Lombok: - Java utility api
*PicoContainer: - Standard Dependency Injection
*Git OR SVN: - Version Control
*Github or Local Git Server: - Git repository hosted server
*Intellij Or Eclipse: - Integrated Development Environment
*AssertJ: - Matcher's
*Loggers: - Simple Logging Facade for Java
*Resource Bundle: - Supporting i18n Localisation and Externalise String
*Joda-Time: - Java Date time Api
*SonarQube (optional): - Code Quality and Code Coverage
*DbUtils Mysql (optional): - Java Database utility api
*Rest-Assured (optional): - Restful Api framework
*PhantomJsDriver, GhostDriver: - Full web stack No browser required supporting headless testing
Test Automation framework support
Gaurav Karvir
Test Automation Architect
sgtechuk@gmail.com
Machine Configuration
Configure Ubuntu / Windows and setup: -
*Java 8
*Git / SVN
*Maven
Get the latest Source Code
Open Terminal or command line cd to the desired folder where the test automation source code needs to be checkout
Run command git clone https://github.com/gauravkarvir/cucumber_testng_java.git
This will download the latest template source code
IDE Configuration
Intellij plugins
Configure and Install Following Plugins
File >> Setting >> Plugins >> Browser Repositories>
*Cucumber for Java
*Gherkin
*lombok
*Git Integration/ SVN Integration
*Maven Integration
*SonarQube (optional)
Eclipse plugins
Configure and Install Following Plugins
Help>>Install new software
*Cucumber for Java
http://cucumber.github.com/cucumber-eclipse/update-site
*lombok Download lombok.jar from http://projectlombok.org/download.html Copy the Jar to eclipse installation directory right click the Jar>Open with Open JDK or Oracle JDK Java 7 Runtime Follow the Installation Steps
*TestNg
*Git Integration
*SonarQube (optional)
Plugin configuration for Cucumber Feature Open Run Configurations Select Cucumber Feature and create one new configuration Project: salmonAutomationFramework Feature: src/salmonAutomationFramework/src/test/resources/features Glue: com.salmon.test.step_definitions Reports: monochrome, pretty
File >> Setting >>
Search for Annotation Processing
(Java Compiler ... Annotation Processing>> Enable the check box
Import Project into Intellij
File>Import Project> Browse to SalmonAutomationFramework
Import Project into Eclipse
File>Import>Maven>Existing Maven Projects>Next> Browse to SalmonAutomationFramework Ensure pom.xml is found Finish
open terminal cd to test root directory run "mvn clean eclipse:eclipse"
Framework Setup steps
The URL, Browser Configuration, jdbc connections etc are defined in the respective config.properties file under each desired profile which you want to run. In pom.xml we use the relative path within as shown below to invoke or make use of these profiles. src/main/resources/profiles
Open "pom.xml" Scroll to Profile section : - Choose desired profile e.g "dev" for running locally
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<profile.path>/profiles/dev/config.properties</profile.path>
<testToRun>**/*WebATSuite*.class</testToRun>
</properties>
</profile>
Compile Build or Run Tests
Command Line
cd to root ot salmonAutomationFramework project directory
To clean and compile the build
mvn clean install -DskipTests
To run all tests parallel
mvn clean install
OR
mvn clean install -P dev
*Note -P dev is default profile hence doesn't need to be specified for every run
To run a single test with tags
mvn clean install -Dcucumber.options="--tags @gui --tags ~@api" -P single
** Note "~" before tag means this specific tag will not run
To Rerun failed test scenarios
After a test suite is run. There is rerun.txt created at the project root level in rerun folder. This rerun file contains the details of all the failed scenarios. e.g master_cucumber_testng\rerun\rerun.txt
mvn clean install -Dcucumber.options="@rerun/rerun.txt" -P single
Jenkins
mvn clean install -P jenkins
** Create 3 string parameters in jenkins with the below conventions which will be passed on as an argument to the above maven command
Key: cucumber.options Default Value: --tags @gui, @api
Key: driverhost Default Value: 0000.000.000.00 (RAS server with selenium server configured for the project)
Key: driverport Default Value: 4444
Report
Local reports
Standard HTML Report
A report will be generated at /target/cucumber-report/index.html
Preety Cucumber-Html Report
A report will be generated at /target/cucumber-report/cucumber-html-reports/feature-overview.html
Jenkins report
The report will be available as part of configured Jenkins test build
**Cucumber plugin for Jenkins needs to be installed
Getting Started
Feature Files
These files contains the acceptance criteria which are written in Gherkin Language and contains various scenarios.
The feature files are tagged with "@tagname" to group common feature files
File Extension: *.feature
Location: "/home/dev/src/salmonAutomationFramework/src/test/resources/features"
Directory: Separate directories for GUI and API tests, Group common features files in a
single directory
File Conventions:Meaning full name "WebRegister.feature"
Example:
@gui
Feature: REGISTER:- As a new customer of Lloydspharmacy I would like to register
Scenario:Perform a New registration for a customer
Given I navigate to the Lloydspharmacy "HOME" page
Page Objects
PageObjects are used to store the WebElements for a Web Page.
A good practice is to have a separate class for every single WebPage.
To avoid duplication for multiple pages which have common web page elements a Parent class can be created
and the child class can then inherit.
Every Page class extends "PageObject.class" to make use of the WebDriver Object and utility functions.
In case of Parent and Child Class, Parent class extends PageObject class and child class extends Parent class
Location: /home/dev/src/salmonAutomationFramework/src/test/java/com/salmon/test/pageobjects
Directory structure: Group common Page Objects classes in a single directory e.g Login Functionality Classes in Login Directory
File Conventions:Every Class file ends with Page.class (Homepage.class)
Example:
public class HomeSamplePage extends PageObject {
private By headerSignInLink = By.cssSelector("#headerSignInLink a");
public void clickSignInLink() {
waitForExpectedElement(headerSignInLink).click();
}
}
Step Definitions
Every steps defined in Feature file needs to be implemented in Step Definitions Class
Location: /home/dev/src/salmonAutomationFramework/src/test/java/com/salmon/test/step_definitions
Directory structure: Separate directories for GUI and API tests, Group common step definition files in a
single directory
File Conventions:Every Class file ends with Steps.class (LoginSteps.class)
Example:
public class HomePageSteps {
private HomeSamplePage homePage = new HomeSamplePage();
@And("^i click on Sign In on the Home Page$")
public void i_click_on_Sign_In_on__the_Home_Page() throws Throwable {
homePage.clickSignInLink();
}
}
Run Test Suite
Test Suites are used to run a group of Tests which are tagged and represented in form of Feature files & Scenarios
Location: /home/dev/src/salmonAutomationFramework/src/test/java/com/salmon/test File Conventions:Every Class file ends with Suite.class (RunWebATSuite.class)
@CucumberOptions(features = "target/test-classes", tags = {"@gui"}, monochrome = true, plugin = {
"pretty", "html:target/cucumber-report/runwebat",
"json:target/cucumber-report/runwebat/cucumber.json",
"rerun:target/cucumber-report/runwebat/rerun.txt"},
glue = "com.salmon.test")
public class RunWebATSuite extends AbstractTestNGCucumberTests {
}
Where: -
features: represent the location of feature files from the compiled build
tags: multiple tags can be specified by comma separated denotation, if a specific tag needs to be excluded then this
can be specified by "~" . e.g "~@api" feature files tagged with "~api" will not be run as a part of Test Suite.
plugin: html,json and rerun reports are created. if a TesSuite is renamed then change the reporting directory name for both reports
Other ways to run the tests or Test Suite
*command line using Maven:- mvn clean install -P dev
*IDE Plugins: - Eclipse or Intellij via TestNg plugin or Maven plugin or Cucumber-Java plugin
*IDE TestNg Suite xml: - file located at "src/test/resources" TestNGRunTestSuite.xml (Right click and run as TestNg)