Here's a step-by-step guide to creating a robust testing framework that integrates Selenium WebDriver, RestAssured, Page Factory Pattern, Docker, and Kubernetes.
1. Framework Structure
Create a Maven-based project with the following structure:
project-root/
│
├── src/main/java/
│ ├── com.framework.base/
│ │ ├── BaseTest.java
│ │ └── DriverFactory.java
│ ├── com.framework.pages/
│ │ ├── LoginPage.java
│ │ └── HomePage.java
│
├── src/test/java/
│ ├── com.framework.tests/
│ │ ├── ApiTests.java
│ │ └── UITests.java
│
├── src/test/resources/
│ ├── application.properties
│
├── Dockerfile
├── docker-compose.yaml
├── pom.xml
├── README.md
2. Maven Dependencies
Add these dependencies to your pom.xml
:
<dependencies>
<!-- Selenium WebDriver -->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.x.x</version>
</dependency>
<!-- RestAssured -->
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured</artifactId>
<version>5.x.x</version>
<scope>test</scope>
</dependency>
<!-- TestNG -->
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>7.x.x</version>
<scope>test</scope>
</dependency>
<!-- Jackson for JSON Parsing -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.x.x</version>
</dependency>
</dependencies>
3. Framework Components
DriverFactory.java (Selenium WebDriver Setup)
package com.framework.base;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
public class DriverFactory {
private static ThreadLocal<WebDriver> driver = new ThreadLocal<>();
public static WebDriver getDriver() {
if (driver.get() == null) {
ChromeOptions options = new ChromeOptions();
options.addArguments("--headless", "--no-sandbox", "--disable-dev-shm-usage");
System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver");
driver.set(new ChromeDriver(options));
}
return driver.get();
}
public static void quitDriver() {
if (driver.get() != null) {
driver.get().quit();
driver.remove();
}
}
}
BaseTest.java (Test Setup)
package com.framework.base;
import io.restassured.RestAssured;
import org.openqa.selenium.WebDriver;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
public class BaseTest {
protected WebDriver driver;
@BeforeClass
public void setup() {
driver = DriverFactory.getDriver();
RestAssured.baseURI = "http://localhost:8080";
}
@AfterClass
public void tearDown() {
DriverFactory.quitDriver();
}
}
Page Object Classes
LoginPage.java
package com.framework.pages;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
public class LoginPage {
WebDriver driver;
@FindBy(id = "username")
WebElement usernameField;
@FindBy(id = "password")
WebElement passwordField;
@FindBy(id = "loginButton")
WebElement loginButton;
public LoginPage(WebDriver driver) {
this.driver = driver;
PageFactory.initElements(driver, this);
}
public void login(String username, String password) {
usernameField.sendKeys(username);
passwordField.sendKeys(password);
loginButton.click();
}
}
UITests.java
package com.framework.tests;
import com.framework.base.BaseTest;
import com.framework.pages.LoginPage;
import org.testng.annotations.Test;
public class UITests extends BaseTest {
@Test
public void testLogin() {
driver.get("http://localhost:8080");
LoginPage loginPage = new LoginPage(driver);
loginPage.login("admin", "password");
}
}
ApiTests.java
package com.framework.tests;
import io.restassured.RestAssured;
import org.testng.annotations.Test;
import static io.restassured.RestAssured.given;
import static org.hamcrest.Matchers.equalTo;
public class ApiTests {
@Test
public void testGetApi() {
given()
.when()
.get("/api/resource")
.then()
.statusCode(200)
.body("message", equalTo("Success"));
}
}
4. Docker Integration
Dockerfile
FROM maven:3.8.4-openjdk-17 AS builder
WORKDIR /app
COPY . .
RUN mvn clean install -DskipTests
FROM openjdk:17-jdk-slim
WORKDIR /app
COPY --from=builder /app/target/*.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
docker-compose.yaml
version: "3.9"
services:
app:
build: .
ports:
- "8080:8080"
selenium-hub:
image: selenium/hub:4.1.0
ports:
- "4444:4444"
chrome:
image: selenium/node-chrome:4.1.0
environment:
- SE_EVENT_BUS_HOST=selenium-hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
depends_on:
- selenium-hub
5. Kubernetes Integration
Deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: testing-framework
spec:
replicas: 1
selector:
matchLabels:
app: testing-framework
template:
metadata:
labels:
app: testing-framework
spec:
containers:
- name: app
image: your-dockerhub-user/testing-framework:latest
ports:
- containerPort: 8080
Service.yaml
apiVersion: v1
kind: Service
metadata:
name: testing-framework-service
spec:
type: NodePort
selector:
app: testing-framework
ports:
- protocol: TCP
port: 8080
targetPort: 8080
nodePort: 30001
6. CI/CD Pipeline
- Use Jenkins/GitHub Actions to:
- Run tests (
mvn test
). - Build Docker image (
docker build
). - Push to Docker Hub.
- Deploy to Kubernetes (
kubectl apply
).
- Run tests (
This framework combines automation testing with REST API validation, UI testing, and container orchestration to ensure seamless development and deployment.