TestNG framework is a testing framework to perform unit tests in the java programming language. Moreover, the "NG" in TestNG abbreviates for "Next Generation".
Cedric Beust developed it and was inspired by the JUnit and NUnit testing frameworks. In addition to all the features in JUnit, TestNG has new features which make it more powerful.
TestNG is the framework created for executing unit tests in java programs.
TestNG is also used by software testers to efficiently run the automated test scripts created in Selenium Webdriver.
Follow the below steps to install TestNG on Eclipse:
1. Go to Eclipse → Click on “Help” → Click on “Install New Software”.
2. Click on the “Add” button, Enter the name(Preferably TestNG) in the “Next” textbox. Enter “Location” in the textbox and click on the “OK” action button.
3. Check the TestNG checkbox and click on the “Next” action button. The installation will start and the Eclipse will restart after installation.
4. Right-click on the project in Eclipse → Select build path → Configure Build Path.
5. Select the library tab → Click on Add library button → Select TestNG → Click on Next → Click on Finish and Apply and close.
You can run the TestNG script as:
1. Right-click on the class in Eclipse, click on “Run as” and select “TestNG test”.
OR
2. Directly click on the Run button on the toolbar of Eclipse.
There are three sections of annotation in TestNG:
(i) Precondition annotations:
These are the TestNG annotations that are executed before the test.
@BeforeSuite,
@BeforeClass,
@BeforeTest,
@BeforeMethod
(ii) Test annotation:
This is the annotation that is only mentioned before the test case (Before the method written to execute the test case)
@Test is the test annotation
(iii) Postcondition annotation:
These are the annotations that are executed after the test case. (After the method is written to execute the test case)
@AfterSuite,
@AfterClass,
@AfterTest,
@AfterMethod
The Sequence of execution of the annotations are:
@BeforeSuite
@BeforeTest
@BeforeClass
@BeforeMethod
@Test
@AfterMethod
@AfterClass
@Aftertest
@AfterSuite
The advantages of TestNG are:
1. It is an open-source framework, hence it is easy to configure.
2. TestNG help in creating systematic test cases.
3. It has number of annotations which in turn makes the test case creation easy.
4. TestNG helps in defining priorities of the tests and the sequence of execution.
5. Grouping is possible using TestNG.
6. It generates HTML reports (Selenium Webdriver cannot generate the test reports alone).
7. Data parameterization is possible using TestNG.
8. In addition to all the functionalities of JUnit, TestNG has its functionalities, which in turn makes it more powerful.
There is always more than one test or method in the class. If we do not prioritize these tests or methods, then the methods are selected alphabetically and executed while execution.
If we want to run the tests in the sequence we want, then we need to set the priority along with the @Test annotation.
This can be done as follows:
@Test (priority=1), @Test (priority=2)
Consider the following Example:
@Test (priority=2)
public void getText()
{
driver.findElement(By.id(“id”)).getText();
}
@Test(priority=1)
public void clickelement()
{
driver.findElement(By.id(“id”)).click();
}
In the above example, clickelement() will get executed first as the priority is set to 1.
And, getText() will get executed after clickelement() as its priority is set to 2.
There are a few ways to do so:
(i) After the execution of the TestNG class, there is one tab called “Result of running class” which is generated next to the console.
We can copy this and share it.
(ii) After the execution of the TestNG class,
Right-click on the project name and refresh
Click on the “Test-output” folder
Right-click on the “index.html” file and select the properties
Copy the link next to “Location”
We can share this link to see the basic HTML test report which is generated by TestNG.
This is the file that gets generated on your machine automatically after the execution of the class using TestNG.
We can define grouping in TestNG using the groups attribute as shown below:
@Test(groups=“title”)
There are some methods on which many methods are dependent.
For Example, If we want to test any application, and if the login page of the application is not working then we won’t be able to test the rest of the scenarios.
So, LoginTest is the method on which many tests are dependent.
Hence, we will write as follows:
@Test(dependsOnMethods=”LoginTest”)
Public void homePageLaunched()
{
}
The above code shows that homePageLaunched() method is completely dependent on LoginTest() method.
If LoginTest() is passed, only then the homePageLaunched() method gets executed.
If we want to execute a test case “n” a number of times, then we can use the invocationCount attribute as shown in the below example.
Example:
@Test(invocationCount=8)
Public void print()
{
}
In the above example, the print() method will get executed 8 times.
If any method in the script takes a long time to execute, then we can terminate that method using “timeout” in TestNG.
@Test(timeout = 5000)
In this case, the method will get terminated in 5000 ms (5 seconds) and the test case is marked as “Failed”.
If there are some methods from which we expect some exceptions, then we can mention the exception in the @Test annotation so that the test case does not fail.
Example:
If a method is expected to have “numberFormatException” exception, then the test case will fail because of this exception if no try-catch block is specified.
But we can do it in TestNG by using “expectedException” attribute as follows.
@Test(expectedException=numberFormatException.class)
Then the test case will run without failing.
Common TestNG assertions include:
(i) Assert.assetEquals(String actual, String expected);
Accepts two strings parameters.
If both the strings are equal, the test case executes successfully otherwise the test case fails.
(ii) Assert.assertEquals(String actual, String expected, String message)
Accepts three strings parameters.
If both the actual and expected strings are equal, the test case executes successfully otherwise the test case fails.
The message is printed if the test case fails.
(iii) Assert.assertEquals(boolean actual, boolean expected)
It accepts two boolean values.
If both the boolean values are equal, the test case executes successfully otherwise the test case fails.
(iv) Assert.assertTrue(<condition(t/f)>)
It accepts a boolean value.
The assertion passes if the condition is True, else an assertion error is displayed.
(v) Assert.assertFalse(<condition(t/f)>)
It accepts a boolean value.
The assertion passes if the condition is False, else an assertion error is displayed.
(vi) Assert.assertTrue(<condition(t/f)>,message)
It accepts a boolean value.
The assertion passes if the condition is True, else an assertion error is displayed with the mentioned message.
(vii) Assert.assertFalse(<condition(t/f)>,message)
It accepts a boolean value.
The assertion passes if the condition is False, else an assertion error is displayed with the mentioned message.
To disable a test in TestNG, we have to use the “enabled” attribute as follows:
@Test(enabled=”false”)
To validate the results (pass/fail), we must use the assertion.
There are two types of assert in TestNG:
Hard Assert is the normal assert used to do validations in the TestNG class.
We have to use the Assert class for hard assert as follows:
Assert.assertEquals(actual value, expected value);
If the hard assert fails, then none of the code gets executed after the assert statement.
If we want to continue the test execution even after the assert statement fails, then we have to use soft assert.
To create a soft assert, we have to create an object of a “softAssert” class as follows:
softAssert sassert = new softAssert();
sassert.assertAll();
So now if the test case fails, the execution is not terminated when we use soft assert.
If we have a class in which a login method is defined, then we can pass the login parameters to this login method from the testing.xml file.
We will have to use the “@parameters” annotation as follows:
@Parameters({"user_name","password"})
@Test
public void loginapp()
{
driverget(“appname”);
driver.findElement(By.id(“login”)).sendkeys(user_name);
driver.findElement(By.id(“password”)).sendkeys(password);
}
Now, go to the testng.xml file and enter the parameters there as follows:
<Suite name = “suitename”>
<test name =”testname”>
<parameter name =”user_name” value=”user1”/>
<parameter password =”password” value =”pass1”/>
<Classes>
<class name =”passingparameters”/>
<classes/>
<test/>
<Suite/>
When we test a project using Selenium Webdriver, it has a lot of classes on it. We cannot choose these classes one by one and put them for automation. Hence we need to create a suite so that all the classes run in a single test suite.
We can achieve this by creating a testing.xml file.
Go to the src folder -> click on file ->enter the name of the file(mostly written testing.xml)
Then, Click on finish.
We have a blank XML file. Here, we have to mention the project name and the classes to be executed along with the package name as shown below.
<Suite name = "Testing Project">
<test name = "Testing feature">
<classes>
<class name = "packagename.name of clasA"/>
<class name = "packagename.name of classB"/>
<class name = "packagename.name of classC"/>
<class name = "packagename.name of classD"/>
</classes>
</test>
</Suite>
To run this file, we have to go to testng.xml in the package explorer right click, and run as → TestNG suite
If we want to SKIP any Test using testing, then we have to use the SKIP exception in TestNG.
It is written as follows:
public void skipExc()
{
System.out.println("SKIP me");
throw new skipException(“Skipping skipExc”);
}
}
We wish you all the best for your interview!!!