Make Selenium Easy

Are You Getting NullPointerException For Second TestNG Test While Running As A Suite?

Last updated on August 13th, 2020 at 12:29 pm

Introduction

Let’s look at some queries asked by people online below.

When I am running my TestNG class individually then it is passing but when I run multiple TestNG classes together second TestNG class is failing with NullPointerException.

The value assigned to a variable in @BeforeSuite method is not reflecting properly in @Test methods

I encounter Null pointer exception when using @BeforeTest, @BeforeMethod and trying to run two classes from testng.xml

Hopefully, you must have got some idea of the problem defined in the above links. There is a common problem in all links just the way of explaining may be different. Beginners and experienced Selenium professionals both generally face this issue and end up creating static variables most of the time as a solution. If you have not understood the problem, do not worry. I will make you understand step by step.

Problem Explanation

First TestNG class

I have a common variable used in both @Test methods.

Let’s run the above TestNG class.

Output

Expected output. Just to be more precise, both @Test methods were able to access the value of the common variable “someVariable”.

Let’s create another TestNG class as below:-

Second TestNG class

Like the first TestNG class above, This class also has a common variable used in both @Test methods.

Output

Both First and Second TestNG classes have a similarity that they share a common variable “someVariable”. Let’s understand it in real-time practice with respect to selenium WebDriver scripts.

We require a browser to be launched for Selenium Scripts and launched browser to be closed at end of scripts. We may require some set up like establishing a database connection, an excel reader instance, any common variable, etc. One way is to have these stuff locally for each Test or class or use TestNG annotations to set it up once at suite or test or class level.

Let’s put the common variable “someVariable” under a TestNG annotation @BeforeSuite as we need the above variable to be initialized once and extend Setup class to both TestNG classes as below.

Setup class

FirstTestNGClass

SecondTestNGClass

Let’s run both TestNG classes individually.

Output of FirstTestNGClass
Output of SecondTestNGClass

We can see how @BeforeSuite annotated method was called to initialize variable. Now let’s run both TestNG classes together using a TestNG xml.

SecondTestNullPointerException.xml

Output

Did you observe that for the second TestNG class you get the value of common variable “someVariable” as NULL? If you perform any action on this variable you will encounter NullPointerException.

As we know @BeforeSuite will be executed once and we are initializing common variables there. Each TestNG class extends class “Setup” which has @BeforeSuite method. But still, we are getting NULL value for the second test but not for the first test.

To understand the reason behind this behavior, you need to understand how does Inheritance works and TestNG annotations are grouped for execution.

We know that the class inherits the properties of another class using Inheritance. So in the above TestNG classes, “someVariable” is being inherited from Setup class and both TestNG classes have an individual instance of “someVariable”. TestNG groups annotations from all TestNG classes and run as per the mentioned annotation.

So in the above setup both TestNG classes have their own instance of Setup class. TestNG will club @BeforeSuite methods from both instances of Setup class as only one while running as a suite. So when @BeforeSuite method runs it initializes the common variable “someVariable” for first TestNG class which was consumed by @Test methods of First TestNG class. When the execution of the Second TestNG class begins, @BeforeSuite will not be executed again which results in the non-initialization of very own copy of variable “someVariable” in SecondTestNGClass and it remains NULL.

Understand with a flow diagram

Let’s try to understand the above concept using a diagram. Below is the initial setup we did. Class Setup is extended by both TestNG classes.

While running as a suite:-

You can see both TestNG class have their own instance of a class variable “someVariable” but the method which initializes that variable executed only once as per TestNG. There will not be any execution of @BeforeSuite method for the SecondTestNGClass separately and the inherited instance variable “someVariable” will not be initialized for SecondTestNGClass.

If you have multiple TestNG classes running together then only the first TestNG class will run fine and all other TestNG classes will fail with NullPointerException. I hope I am able to explain the actual problem and how generally we unwantedly do this and face NullPointerException.

We will see some solutions to this problem in other posts but the common solution to this problem is to change instance variables to class variables or static variables so that if it is initialized once it will be used by others (That is how a static variable works).

Setup class

Output

If you change instance variables to static variables, you should use it with ThreadLocal so that it will not create any problem while running in parallel.

You can download/clone the above sample project from here.

If you have any doubt, feel free to comment below.
If you like my posts, please like, comment, share and subscribe.
#ThanksForReading
#HappyLearning

Find all Selenium related posts here, all API manual and automation related posts here, and find frequently asked Java Programs here.

Many other topics you can navigate through the menu.

Author: Amod Mahajan

My name is Amod Mahajan and I am an IT employee with 6+ years of experience in Software testing and staying in Bengaluru. My area of interest is Automation testing. I started from basics and went through so many selenium tutorials. Thanks to Mukesh Otwani as his tutorials are easy and cover basics to advance. I have habit of exploring concepts by deep diving. I used to make notes. I thought of sharing my knowledge through posts and now I am here. #KeepLearning #ShareLearning

5 thoughts on “Are You Getting NullPointerException For Second TestNG Test While Running As A Suite?

Leave a Reply

Please wait...

Subscribe to new posts to become automation expert

Want to be notified when my new post is published? Get my posts in your inbox.

Are You Getting NullPointerException For Second TestNG Test While Running As A Suite?

by Amod Mahajan time to read: 5 min
5
%d bloggers like this: