Introduction to TestNG

  

What is TestNG?

TestNG stands for Test Next Generation. It is an open-source testing framework inspired by JUnit and NUnit, designed specifically for the Java programming language. It overcomes the limitations of older frameworks by introducing powerful features for unit testing, functional testing, integration testing, and end-to-end testing.


Below are some key features of Testng

  • Annotations:
    TestNG uses a wide variety of annotations (@Test, @BeforeClass, @AfterMethod, etc.) to control test behavior and execution flow.
  • Flexible Test Configuration:
    Allows grouping, prioritization, dependencies, and conditional test execution.
  • Parallel Test Execution:
    You can run multiple tests simultaneously, which reduces total execution time and is useful for large projects.
  • Parameterization:
    TestNG supports both static and dynamic test data through parameters and data providers.
  • Test Suite Execution:
    Tests can be organized into suites using an XML configuration file (testng.xml), allowing you to control test runs from a central place.
  • Powerful Reporting:
    It automatically generates HTML and XML reports after execution, providing insights into test pass/fail status.
  • Integration Support:
    Works well with tools like Maven, Jenkins, Selenium WebDriver, Eclipse, IntelliJ, and various CI/CD tools.
  • Exception Handling:
    It allows defining what exceptions to expect, which helps in testing negative or error-prone scenarios.

Structure of TestNG Testing

  • Test Suite:
    A collection of tests defined in the testng.xml file.
  • Test:
    A test block within a suite. It can include multiple test classes.
  • Test Class:
    Java class containing test methods and configurations.
  • Test Methods:
    Individual test cases.

Test Execution Flow in TestNG

TestNG follows a specific sequence in running methods:

  • BeforeSuite
  • BeforeTest
  • BeforeClass
  • BeforeMethod
  • Test Method
  • AfterMethod
  • AfterClass
  • AfterTest
  • AfterSuite

Types of Testing Supported by TestNG

  • Unit Testing: Test individual components.

  • Functional Testing: Validate business logic.

  • Integration Testing: Test combined modules.

  • Regression Testing: Re-run test cases to ensure no new bugs.

  • Data-Driven Testing: Run same tests with different inputs.


We can use Testng for below scenarios

  • Automating browser testing with Selenium

  • Running API tests

  • Validating database operations

  • Managing large test suites

  • Executing tests in a distributed environment


Tools and Environment Compatibility

  • IDEs: Eclipse, IntelliJ IDEA

  • Build Tools: Maven, Gradle

  • CI/CD Tools: Jenkins, Bamboo

  • Reporting Tools: Allure, ExtentReports

  • Testing Tools: Selenium WebDriver, REST Assured

How to validate Response by Matchers API in Rest Assured

  

How to Use Hamcrest Matchers in GET API via Rest Assured

Hamcrest is a framework for writing matcher objects, which allow 'match' rules to be defined declaratively. In Rest Assured, we use Hamcrest matchers to write expressive assertions for validating the API response.


Maven Dependencies:

<dependencies>
    <!-- Rest Assured -->
    <dependency>
        <groupId>io.rest-assured</groupId>
        <artifactId>rest-assured</artifactId>
        <version>5.3.0</version>
        <scope>test</scope>
    </dependency>

    <!-- Hamcrest -->
    <dependency>
        <groupId>org.hamcrest</groupId>
        <artifactId>hamcrest</artifactId>
        <version>2.2</version>
        <scope>test</scope>
    </dependency>
</dependencies>




Commonly Used Hamcrest Matchers


MatcherDescription
equalTo(value)Check equality
hasItem(value)Check if a list contains item
hasItems(val1, val2)Check if list contains multiple items
not(value)Asserts the opposite
containsString(str)Check substring match
startsWith(str)Check if string starts with



API to be tested:

https://reqres.in/api/users?page=2




Java Code:

import io.restassured.RestAssured;
import static io.restassured.RestAssured.*;
import static org.hamcrest.Matchers.*;

public class GetApiHamcrestExample {
    public static void main(String[] args) {

        // Set base URI
        RestAssured.baseURI = "https://reqres.in";

        // GET Request with Hamcrest matchers for assertions
        given()
            .log().all()
        .when()
            .get("/api/users?page=2")
        .then()
            .log().all()
            .statusCode(200)
            .body("page", equalTo(2))  // validate page number
            .body("data.id", hasItems(7, 8, 9))  // check if certain user IDs are present
            .body("data.first_name", hasItem("Michael"))  // check first_name list contains value
            .body("support.url", containsString("reqres.in"))  // substring match
            .body("data.email[0]", startsWith("michael"));  // starts with
    }
}



Output:

Request:
GET https://reqres.in/api/users?page=2

Response:
200 OK
...
Assertions:
page == 2
data.id contains 7, 8, 9
data.first_name contains "Michael"
support.url contains "reqres.in"
data.email[0] startsWith "michael"