Hybrid Framework in Testing means a combination of few testing frameworks and approaches, namely:
- Data Driver/Keyword Driven Framework – This Framework allows you to read test data from an external system, such as a Data base or a File system. In place of hardcoding the test data, you use external data.
- Module Based Testing Framework/Page Object Model Framework – This framework allows you to extract common functionalities. In Page Object Model, you treat a page like a class and functionality provided by it as a function. e.g., a registration page can be created as a RegistrationPageObject class and register(User user) can be used as a common method anyone can use to register a user.
Here is how you implement:
- Create a database and add your test data. We will read test data from this table. Open mySQL Workbench and connect to your local mysql server (You can download mysql server from mysql website)
CREATE SCHEMA `hybridtest` ;
CREATE TABLE `hybridtest`.`registration_data` (
`id` INT NOT NULL AUTO_INCREMENT,
`firstname` VARCHAR(45) NULL,
`lastname` VARCHAR(45) NULL,
`username` VARCHAR(45) NULL,
`password` VARCHAR(45) NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `username_UNIQUE` (`username` ASC));
2. Insert 2 rows
id, firstname, lastname, username, password, expected
‘1’,’mark’,’ouren’,’mark_u’,’pass’,’1′
‘2’,’john’,’smith’,”,’pass’,’0′
If you notice for the second row, there is no username. This is to test a negative scenario – If a user does not enter a username, you do not expect him to register.
3. Create Page Object to represent Registration Page.
package com.training.examples.hybrid.pageobject;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import com.training.examples.hybrid.model.User;
public class RegisterPage {
public boolean register(WebDriver driver, User user) {
boolean status = false;
// Locate elements and populate relevant fields
//
driver.get("http://newtours.demoaut.com/" + "/mercurysignon.php");
driver.findElement(By.linkText("CONTACT")).click();
driver.findElement(By.linkText("REGISTER")).click();
// Go to DB and read these rows and
driver.findElement(By.name("userName")).clear();
driver.findElement(By.name("userName")).sendKeys("john.doe");
driver.findElement(By.name("password")).clear();
driver.findElement(By.name("password")).sendKeys("john");
driver.findElement(By.name("firstName")).clear();
driver.findElement(By.name("firstName")).sendKeys("sansa2016");
driver.findElement(By.name("lastName")).clear();
driver.findElement(By.name("lastName")).sendKeys("sansaln");
driver.findElement(By.name("phone")).clear();
driver.findElement(By.name("phone")).sendKeys("123456789");
driver.findElement(By.id("userName")).clear();
driver.findElement(By.id("userName")).sendKeys("sansa@sansa.com");
driver.findElement(By.id("email")).clear();
driver.findElement(By.id("email")).sendKeys("sansa2016");
driver.findElement(By.name("password")).clear();
driver.findElement(By.name("password")).sendKeys("sansa2016");
driver.findElement(By.name("confirmPassword")).clear();
driver.findElement(By.name("confirmPassword")).sendKeys("sansa2016");
driver.findElement(By.name("register")).click();
// driver.findElement(By.linkText("SIGN-OFF")).click();
// Verify registration was successful by checking is string "Thank you for
// registering." is found
String registrationSuccesfulMessage = "Thank you for registering.";
status = driver.getPageSource().contains(registrationSuccesfulMessage);
return status;
}
}
4. Create a User class
package com.training.examples.hybrid.model;
public class User {
public String firstname;
public String lastname;
public String phone;
public String email;
public String username;
public String password;
public int expected;
}
4. Create a UserDAO class. This class will read test data from the database. Make sure that mysql connect for Java is in your classpath.
package com.training.examples.hybrid.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import com.training.examples.hybrid.model.User;
public class UserDAO {
public List getTestUsersData() throws Exception {
List users = new ArrayList ();
Statement stmt = null;
Connection con = null;
// 1. Load a mysql driver
Class.forName("com.mysql.jdbc.Driver").newInstance();
// 2. Create a Connection
String url = "jdbc:mysql://localhost:3306/hybridtest?" + "user=root&password=password";
con = DriverManager.getConnection(url);
// 3. Create a Statement
stmt = con.createStatement();
// "sure"
// System.out.println("\"" + message + "\"");
// 4. Execute Statement
String query = "select * from hybridtest.registration_data";
System.out.println("query = " + query);
ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
int id = rs.getInt("id");
String firstname = rs.getString("firstname");
String lastname = rs.getString("lastname");
String username = rs.getString("username");
String password = rs.getString("password");
int expected = rs.getInt("expected");
User u = new User();
u.firstname = firstname;
u.lastname = lastname;
u.username = username;
u.password = password;
u.expected = expected;
System.out.println(id + " - " + firstname + " - " + lastname + " - " + username + " - " + password + " - " + expected);
users.add(u);
}
//
return users;
}
}
4. Create a Test class that would run the test case. This will first read data from the database and then pas it to the register method. (Make sure to download gecko or firefox driver and point to it in the code below )
package com.training.examples.hybrid;
import static org.junit.Assert.*;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import com.training.examples.hybrid.dao.UserDAO;
import com.training.examples.hybrid.model.User;
import com.training.examples.hybrid.pageobject.RegisterPage;
public class SeleniumMercuryDemo {
private WebDriver driver;
private String baseUrl;
private boolean acceptNextAlert = true;
private StringBuffer verificationErrors = new StringBuffer();
List users = new ArrayList();
@Before
public void setUp() throws Exception {
// For Windows FF
// System.setProperty("webdriver.gecko.driver",
// "C:\\Softwares\\geckodriver-v0.11.1-win64\\geckodriver.exe");
// For Mac FF
System.setProperty("webdriver.gecko.driver", "/Users/amitesh.sinha/Softwares/geckodriver");
driver = new FirefoxDriver();
users = new UserDAO().getTestUsersData();
baseUrl = "http://newtours.demoaut.com/";
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
driver.manage().window().fullscreen();
}
@Test
public void testPositiveScenario() throws Exception {
User user = new User();
user = users.get(0);
// As the data is "Good" data, we expect this test to pass
// id, firstname, lastname, username, password, expected
// '1','mark','ouren','mark_u','pass','1'
boolean expected = new RegisterPage().register(driver, user);
assertTrue("Test Failed as User SHOULD BE able to register", expected);
}
@Test
public void testNegativeScenario() throws Exception {
User user = new User();
user = users.get(1);
// As the data is "Bad" data - it's missing username, we expect this test to
// fail
// id, firstname, lastname, username, password, expected
// '2','john','smith','','pass','0'
boolean expected = new RegisterPage().register(driver, user);
assertFalse("Test Failed as User SHOULD NOT BE able to register", expected);
}
@After
public void tearDown() {
driver.close();
}
}
Now you should be all good with Hybrid Framework.
To become efficient with Hybrid Framework, you should practice and build another example. Would love to hear from you what else did you implement – share that in the comments section below.