← All skills

Testng Skill

Unit testingJava

Copy and Paste in your Terminal

npx skills add https://github.com/LambdaTest/agent-skills.git --skill testng-skill

Documentation

Full skill reference (SKILL.md). For more implementation detail, see the Playbook and Advanced patterns tabs.

TestNG Testing Skill

Core Patterns

Basic Test with Groups

import org.testng.annotations.*;
import org.testng.Assert;

public class LoginTest {
    @BeforeMethod
    public void setUp() { /* setup */ }

    @Test(groups = "smoke")
    public void testLoginSuccess() {
        Assert.assertTrue(loginService.login("user@test.com", "password123"));
    }

    @Test(groups = "regression", dependsOnMethods = "testLoginSuccess")
    public void testAccessDashboard() {
        Assert.assertNotNull(dashboard.getContent());
    }

    @Test(expectedExceptions = AuthenticationException.class)
    public void testLoginInvalidPassword() {
        loginService.login("user@test.com", "wrong");
    }

    @AfterMethod
    public void tearDown() { /* cleanup */ }
}

Data Providers

@DataProvider(name = "loginData")
public Object[][] loginData() {
    return new Object[][] {
        {"admin@test.com", "admin123", true},
        {"user@test.com", "password", true},
        {"invalid@test.com", "wrong", false},
    };
}

@Test(dataProvider = "loginData")
public void testLogin(String email, String password, boolean expected) {
    Assert.assertEquals(loginService.login(email, password), expected);
}

TestNG XML Suite

<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<suite name="Regression" parallel="tests" thread-count="5">
  <test name="Smoke">
    <groups><run><include name="smoke"/></run></groups>
    <classes><class name="tests.LoginTest"/></classes>
  </test>
  <test name="Full">
    <groups><run><include name="regression"/><exclude name="flaky"/></run></groups>
    <packages><package name="tests.*"/></packages>
  </test>
</suite>

Parallel Execution

<suite parallel="methods" thread-count="5">   <!-- Method level -->
<suite parallel="classes" thread-count="5">    <!-- Class level -->
<suite parallel="tests" thread-count="5">      <!-- Test level -->

Soft Assertions

SoftAssert soft = new SoftAssert();
soft.assertEquals(user.getName(), "Alice");
soft.assertEquals(user.getAge(), 25);
soft.assertTrue(user.isActive());
soft.assertAll();  // Reports all failures at once

Listeners

public class TestListener implements ITestListener {
    @Override public void onTestFailure(ITestResult result) {
        System.out.println("Failed: " + result.getName());
        // Take screenshot, log, etc.
    }
}

@Listeners(TestListener.class)
public class LoginTest { /* ... */ }

Lifecycle Annotations

@BeforeSuite → @BeforeTest → @BeforeClass → @BeforeMethod → @Test → @AfterMethod → @AfterClass → @AfterTest → @AfterSuite

Anti-Patterns

BadGoodWhy
dependsOnMethods everywhereIndependent testsCascading failures
No groups@Test(groups = "smoke")Can't run subsets
Hard-coded test data@DataProviderReusable
Priority orderingIndependent testsFragile

Quick Reference

TaskCommand
Run suitemvn test -DsuiteXmlFile=testng.xml
Run groupmvn test -Dgroups=smoke
Run classmvn test -Dtest=LoginTest
Reportstest-output/index.html

Deep Patterns → reference/playbook.md

§SectionLines
1Project Setup & ConfigurationMaven + Surefire config
2Suite XML ConfigurationMulti-env, parallel, groups
3BaseTest & Thread-Safe DriverThreadLocal, ConfigReader
4Data Providers (Advanced)Excel, JSON, CSV, parallel, cross-class
5Factory PatternCross-browser matrix
6Listeners (Production Suite)Retry, screenshot, timing
7Soft Assertions & DependenciesGroups, method deps
8Page Object IntegrationPageFactory, fluent POs
9Parallel Execution StrategiesMethod/class/test/mixed
10Reporting IntegrationAllure, ExtentReports
11CI/CD IntegrationGitHub Actions, Jenkins
12Debugging Quick-Reference12 common problems
13Best Practices Checklist14 items