1. @BeforeSuite Purpose: Runs before all tests in the suite (only once). Usage: Initialize global setup (e.g., DB connection, report setup). Code to write: Code to prepare the test suite environment. @BeforeSuite public void beforeSuite() { System.out.println("BeforeSuite: Setup system property for browser"); // Example: System.setProperty("webdriver.chrome.driver", "path"); } ๐Ÿ”น 2. @AfterSuite Purpose: Runs after all tests in the suite (only once). Usage: Close resources, generate reports. Code to write: Cleanup code, report generation. @AfterSuite public void afterSuite() { System.out.println("AfterSuite: Generate report and cleanup"); } ๐Ÿ”น 3. @BeforeTest Purpose: Runs before all test cases inside a tag in testng.xml. Usage: Launch browser, login, etc. Code to write: Browser or environment setup. @BeforeTest public void beforeTest() { System.out.println("BeforeTest: Launch browser"); } ๐Ÿ”น 4. @AfterTest Purpose: Runs after all test cases inside a tag. Usage: Close browser. Code to write: Browser teardown. @AfterTest public void afterTest() { System.out.println("AfterTest: Close browser"); } ๐Ÿ”น 5. @BeforeClass Purpose: Runs before first method of current class. Usage: Open app URL, login once per class. Code to write: Class-level setup. @BeforeClass public void beforeClass() { System.out.println("BeforeClass: Login to application"); } ๐Ÿ”น 6. @AfterClass Purpose: Runs after all methods of current class. Usage: Logout from app. Code to write: Class-level cleanup. @AfterClass public void afterClass() { System.out.println("AfterClass: Logout from application"); } ๐Ÿ”น 7. @BeforeMethod Purpose: Runs before every @Test method. Usage: Navigate to module, reset data. Code to write: Pre-condition before test. @BeforeMethod public void beforeMethod() { System.out.println("BeforeMethod: Navigate to Home Page"); } ๐Ÿ”น 8. @AfterMethod Purpose: Runs after every @Test method. Usage: Take screenshot, reset app state. Code to write: Post-condition after test. @AfterMethod public void afterMethod() { System.out.println("AfterMethod: Capture screenshot"); } ๐Ÿ”น 9. @Test Purpose: Defines actual test case. Usage: Write test logic (assertions, steps). Code to write: Validation and functional steps. @Test public void testCase1() { System.out.println("Test Case 1: Verify Home Page Title"); // Example assertion: Assert.assertEquals(driver.getTitle(), "Home"); } ๐Ÿ”น 10. @BeforeGroups Purpose: Runs before the first test method belonging to a group. Usage: Setup required for grouped tests. Code to write: Group-level initialization. @BeforeGroups("regression") public void beforeGroup() { System.out.println("BeforeGroups: Setup for regression group"); } ๐Ÿ”น 11. @AfterGroups Purpose: Runs after the last test method belonging to a group. Usage: Cleanup after grouped tests. Code to write: Group-level teardown. @AfterGroups("regression") public void afterGroup() { System.out.println("AfterGroups: Cleanup for regression group"); } ๐Ÿ”น 12. @DataProvider Purpose: Supplies data for parameterized tests. Usage: Multiple inputs for a test method. Code to write: Return Object[][]. @DataProvider(name="loginData") public Object[][] getData() { return new Object[][] { {"user1", "pass1"}, {"user2", "pass2"} }; } ๐Ÿ”น 13. @Parameters Purpose: Pass parameters from testng.xml. Usage: Read environment/browser values. Code to write: Fetch and use parameters. @Parameters({"browser"}) @Test public void crossBrowserTest(String browser) { System.out.println("Running test on browser: " + browser); } ๐Ÿ“‘ Sequence of Execution in TestNG Hereโ€™s the exact execution order: @BeforeSuite @BeforeTest @BeforeClass @BeforeMethod @Test @AfterMethod @AfterClass @AfterTest @AfterSuite @BeforeGroups and @AfterGroups execute around group-based tests. @DataProvider provides data before a test runs. @Parameters injects values at test execution. ๐Ÿ“ Full Example: import org.testng.annotations.*; public class TestNGAnnotationsExample { @BeforeSuite public void beforeSuite() { System.out.println("BeforeSuite: Setup System Property"); } @AfterSuite public void afterSuite() { System.out.println("AfterSuite: Generate Report"); } @BeforeTest public void beforeTest() { System.out.println("BeforeTest: Launch Browser"); } @AfterTest public void afterTest() { System.out.println("AfterTest: Close Browser"); } @BeforeClass public void beforeClass() { System.out.println("BeforeClass: Login to App"); } @AfterClass public void afterClass() { System.out.println("AfterClass: Logout from App"); } @BeforeMethod public void beforeMethod() { System.out.println("BeforeMethod: Navigate to Home Page"); } @AfterMethod public void afterMethod() { System.out.println("AfterMethod: Capture Screenshot"); } @BeforeGroups("regression") public void beforeGroup() { System.out.println("BeforeGroups: Setup for Regression Group"); } @AfterGroups("regression") public void afterGroup() { System.out.println("AfterGroups: Cleanup for Regression Group"); } @Test(groups = "smoke") public void testCase1() { System.out.println("Test Case 1: Verify Title"); } @Test(groups = "regression", dataProvider = "loginData") public void testCase2(String user, String pass) { System.out.println("Test Case 2: Login with " + user + " / " + pass); } @DataProvider(name = "loginData") public Object[][] getData() { return new Object[][] { {"user1", "pass1"}, {"user2", "pass2"} }; } }