✅ Order of Execution (Before Annotations)
-
@BeforeSuite
– Runs once before the entire test suite. -
@BeforeTest
– Runs before<test>
tag intestng.xml
. -
@BeforeClass
– Runs before the first method in the current class. -
@BeforeMethod
– Runs before every@Test
method.
✅ Order of Execution (After Annotations)
-
@AfterMethod
– Runs after every@Test
method. -
@AfterClass
– Runs after all test methods in the current class. -
@AfterTest
– Runs after all tests in the<test>
tag. -
@AfterSuite
– Runs once after the entire test suite
This structure is especially useful when:
-
Suite
= initializing global resources (e.g., DB, reports). -
Test
= logical group (e.g., Chrome tests, Firefox tests). -
Class
= one Java test class. -
Method
= each test method.
├── base/
│ └── BaseTest.java
├── pages/
│ └── LoginPage.java
├── tests/
│ └── LoginTest.java
├── utils/
│ ├── ExcelUtil.java
│ ├── DBUtil.java
│ ├── ScreenshotUtil.java
│ └── ExtentManager.java
testng.xml
pom.xml
resources - config.properties, Test_Data.xlsx, Drivers****
test-output - TestNG reports
reports - Extent Reports
Base Test
package com.sample.pagefactory.base;
import com.aventstack.extentreports.ExtentReports;
import com.aventstack.extentreports.ExtentTest;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.firefox.*;
import org.testng.ITestResult;
import org.testng.annotations.*;
import com.sample.pagefactory.utils.ConfigReader;
import com.sample.pagefactory.utils.ExtentManager;
import com.sample.pagefactory.utils.ScreenshotUtils;
import java.lang.reflect.Method;
public class BaseTest {
protected WebDriver driver;
protected ExtentReports extent;
protected ExtentTest test;
@Parameters({"browser"})
@BeforeMethod
public void setup(@Optional("chrome") String browser, Method method) {
extent = ExtentManager.getInstance();
test = extent.createTest(method.getName());
// private static ThreadLocal<WebDriver> driver = new ThreadLocal<>();
//
// public static WebDriver getDriver() {
// return driver.get();
// }
boolean isHeadless = Boolean.parseBoolean
(ConfigReader.get("headless"));
if (browser.equalsIgnoreCase("chrome")) {
ChromeOptions options = new ChromeOptions();
if (isHeadless) {
options.addArguments("--headless=new",
"--window-size=1920,1080");
}
driver = new ChromeDriver(options);
} else if (browser.equalsIgnoreCase("firefox")) {
FirefoxOptions options = new FirefoxOptions();
if (isHeadless) {
options.addArguments("-headless");
}
driver = new FirefoxDriver(options);
} else {
throw new RuntimeException("Unsupported browser: " + browser);
}
driver.manage().window().maximize();
}
@AfterMethod
public void tearDown(ITestResult result) {
if (result.getStatus() == ITestResult.FAILURE) {
String screenshotPath = ScreenshotUtils.takeScreenshot
(driver, result.getName());
test.fail("Test failed", ScreenshotUtils.addScreenshot
ToReport(screenshotPath));
}
if (driver != null) {
driver.quit();
}
extent.flush();
}
}
Base Test_DesiredCaps
package com.sample.pagefactory.base;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.MutableCapabilities;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxOptions;
import org.testng.annotations.*;
import com.sample.pagefactory.utils.ConfigReader;
import java.lang.reflect.Method;
public class BaseClass_DesiredCaps {
protected WebDriver driver;
@Parameters("browser")
@BeforeMethod
public void setup(@Optional("chrome") String browser, Method method) {
boolean isHeadless = Boolean.parseBoolean(ConfigReader.get("headless"));
switch (browser.toLowerCase()) {
case "chrome":
ChromeOptions chromeOptions = new ChromeOptions();
if (isHeadless) chromeOptions.addArguments("--headless=new");
chromeOptions.setCapability("browserName", "chrome"); // DesiredCapability logic
driver = new ChromeDriver(chromeOptions);
break;
case "firefox":
FirefoxOptions firefoxOptions = new FirefoxOptions();
if (isHeadless) firefoxOptions.addArguments("-headless");
firefoxOptions.setCapability("browserName", "firefox");
driver = new FirefoxDriver(firefoxOptions);
break;
default:
throw new RuntimeException("Unsupported browser: " + browser);
}
driver.manage().window().maximize();
}
@AfterMethod
public void tearDown() {
if (driver != null) {
driver.quit();
}
}
}
LoginPage.java
import org.openqa.selenium.By;
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;
//Constructor
public LoginPage(WebDriver driver)
{
this.driver = driver;
PageFactory.initElements(driver, this);
}
//Locators
@FindBy(xpath="//input[@id='username']")
WebElement txt_username;
@FindBy(xpath="//input[@id='password']")
WebElement txt_password;
@FindBy(xpath="//button[contains(text(),'Submit')]")
WebElement btn_login;
//Action methods
public void setUserName(String user)
{
txt_username.sendKeys(user);
}
public void setPassword(String pwd)
{
txt_password.sendKeys(pwd);
}
public void clickLogin()
{
btn_login.click();;
}
}
LoginTest_Properties.java
import com.sample.pagefactory.pages.LoginPage;
import com.sample.pagefactory.utils.ConfigReader;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.Test;
import org.testng.Assert;
import org.testng.Reporter;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import java.time.Duration;
public class LoginTest_Properties {
WebDriver driver;
@BeforeClass
void Setup()
{
driver = new ChromeDriver();
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
driver.get(ConfigReader.get("url"));
}
@Test
void testLogin() throws InterruptedException
{
LoginPage lp = new LoginPage(driver);
lp.setUserName(ConfigReader.get("username"));
Reporter.log("Entered user name");
lp.setPassword(ConfigReader.get("password"));
Reporter.log("Entered password");
lp.clickLogin();
Reporter.log("Clicked on Login button");
Thread.sleep(2000);
String title = driver.getTitle();
Assert.assertEquals(title, "Secure Page page for Automation Testing Practice");
Reporter.log("Title displayed successfully");
}
@AfterClass
void Teardown()
{
driver.quit();
}
}
package com.sample.pagefactory.utils;
import java.sql.*;
public class DBUtils {
public static void readDB(String query) {
try (Connection con = DriverManager.getConnection("jdbc:mysql:
//localhost:3306/testdb", "user", "password");
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(query)) {
while (rs.next()) {
System.out.println(rs.getString(1)); // customize as needed
}
} catch (Exception e) {
e.printStackTrace();
}
}
}