Assertions in TestNG

When we are writing tests, the goal isn’t just to run the code but to make sure it’s doing what we expect. That’s where assertions come in – they let us confirm that our code behaves as it should. In TestNG, assertions play a key role, helping us verify if our expected outcomes match the actual results in the code. Let’s dive into how assertions work in TestNG, the types available, and why we should use them to make our tests as effective as possible.

We will look at below points –

Assertions in TestNG are statements that check whether a particular condition holds true or false during test execution.

At its core, an assertion is like a checkpoint in a test. It’s a statement that either passes (meaning the code’s output matches our expectations) or fails (meaning it doesn’t).

Assertions help us:

  • Confirm Results: They validate if our code is working as it should.
  • Automate Checks: With assertions, we don’t have to manually verify outputs every time we run tests.
  • Save Debugging Time: Failed assertions tell us exactly what failed, making it easier to track down bugs.
  • Boost Test Accuracy: Assertions make our tests more reliable, so we catch issues early.

There are two types of assertions in TestNG: hard assertion and soft assertion.

Hard assertions, or standard assertions, immediately halt the test execution if they fail. They are useful when we need the test to stop as soon as an expected condition is unmet.

Assert class is used for Hard Assertion in TestNG. It provides many methods, such as assertEquals, assertTrue, and others for hard assertions.

Here is one example

package Test;

import org.testng.Assert;
import org.testng.annotations.Test;

public class CodekruTest {

	@Test
	public void test1() {
		
		int actual = 5;
		int expected = 3;
		
		Assert.assertEquals(actual, expected);
		
		System.out.println("Statement below the assert..");
		
	}
}

In this example, we used assertEquals to compare the actual and expected values. As a result, the test case will fail because the actual value does not match the expected value. Additionally, any statements following the assertion will not be executed since a hard assertion stops the program when an assertion fails.

FAILED: test1
java.lang.AssertionError: expected [3] but found [5]
	at org.testng.Assert.fail(Assert.java:99)
	at org.testng.Assert.failNotEquals(Assert.java:1037)

===============================================
    Default test
    Tests run: 1, Failures: 1, Skips: 0
===============================================

We can see that line 16 wasn’t printed in the console as the assertion failed and thus halted the execution at line 14.

Soft assertions, on the other hand, allow the test to continue running even if an assertion fails. It’ll log all the failed assertions, but the test will only be marked as failed at the end (if we want). This is helpful when we want to check several conditions in a single test.

package Test;
 
import org.testng.annotations.Test;
import org.testng.asserts.SoftAssert;
 
public class CodekruTest {
 
    @Test
    public void test1() {
 
        int actual = 5;
        int expected = 3;
 
        SoftAssert softAssert = new SoftAssert();
        softAssert.assertEquals(actual, expected);
 
        System.out.println("Statement below the Assertion..");
        
    }
}

Output –

Statement below the Assertion..
PASSED: test1

===============================================
    Default test
    Tests run: 1, Failures: 0, Skips: 0
===============================================
package Test;

import org.testng.annotations.Test;
import org.testng.asserts.SoftAssert;

public class CodekruTest {

	@Test
	public void test1() {

		int actual = 5;
		int expected = 3;

		SoftAssert softAssert = new SoftAssert();
		softAssert.assertEquals(actual, expected);

		System.out.println("Statement below the Assertion..");
		
		softAssert.assertAll();
	}
}

Output –

Statement below the Assertion..
FAILED: test1
java.lang.AssertionError: The following asserts failed:
	expected [3] but found [5]
	at org.testng.asserts.SoftAssert.assertAll(SoftAssert.java:47)
	at org.testng.asserts.SoftAssert.assertAll(SoftAssert.java:31)

===============================================
    Default test
    Tests run: 1, Failures: 1, Skips: 0
===============================================

Some points to note

  • In both scenarios, the statement after the assertion got printed in the console, indicating that the program continued executing even though the assertion had failed.
  • Take a closer look at the code on the right-hand side; we’ve used “softAssert.assertAll()” at line 19. This line ensures that if any of the previous assertions fail, then the test case will be marked as failed. Without this line, the test case will be marked as passed even if some assertions fail, as was the case with the code on the left-hand side.

Use hard assertions when –

  • A failed condition should stop the test execution immediately.
  • The test depends on certain conditions being met before proceeding.
  • Testing critical or fundamental aspects that must pass for subsequent assertions to be meaningful.

Use soft assertions when:

  • You need to check multiple independent conditions within a single test.
  • Failing conditions should not prevent the test from running to completion.
  • The test output can provide comprehensive results of all failures for analysis.

The assertEquals method checks if two values are equal. If the values don’t match, the assertion fails.

Example:

public class CodekruTest {

	@Test
	public void test1() {

		int actual = 10;
		int expected = 10;
		Assert.assertEquals(actual, expected);

	}
}

The assertNotEquals method verifies that two values are not equal.

Example:

public class CodekruTest {

	@Test
	public void test1() {

		int actual = 9;
		int expected = 10;
		Assert.assertNotEquals(actual, expected);

	}
}

In this case, the test will be marked as passed because the actual and expected values do not match, and we are using the assertNotEquals method.

The assertTrue method validates that a condition is true.

Example:

public class CodekruTest {

	@Test
	public void test1() {
		
		int age = 21;
		boolean isAdult = age > 18;
		
	    Assert.assertTrue(isAdult);

	}
}

The assertFalse method ensures that a condition is false.

Example:

public class CodekruTest {

	@Test
	public void test1() {
		
		int age = 14;
		boolean isAdult = age > 18;
		
	    Assert.assertFalse(isAdult);

	}
}

The assertNull method checks that an object is null.

Example:

public class CodekruTest {

	@Test
	public void test1() {
		
		Object obj = null;
	    Assert.assertNull(obj);

	}
}

The assertNotNull method verifies that an object is not null.

Example:

public class CodekruTest {

	@Test
	public void test1() {
		
		String website = "codekru";
	    Assert.assertNotNull(website);

	}
}

We can also print a message when an assertion fails to explain the reason for the failure. All assertions have an overloaded method that allows us to pass a message string as an argument, which will be printed in the console or report. This message will only appear if the assertion fails; if it passes, the message will not be displayed.

Let’s take the assertEquals method as an example. We will print the message whenever the expected value doesn’t match the final value.

package Test;

import org.testng.Assert;
import org.testng.annotations.Test;

public class CodekruTest {

	@Test
	public void test1() {
		
		int expected = 10;
		int actual = 5;
		
		Assert.assertEquals(actual,expected,"Expected doesn't match with actual value..");

	}
}

Output –

FAILED: test1
java.lang.AssertionError: Expected doesn't match with actual value.. expected [10] but found [5]
	at org.testng.Assert.fail(Assert.java:99)
	at org.testng.Assert.failNotEquals(Assert.java:1037)

Here, we can see that “Expected doesn’t match with actual value..” is printed in the console.

We hope that you have liked this article. If you have any doubts or concerns, please write us in the comments or mail us at admin@codekru.com

Liked the article? Share this on

Leave a Comment

Your email address will not be published. Required fields are marked *