Introduction
JUnit and TestNG are undoubtedly the two most popular unit-testing frameworks in the Java ecosystem. While JUnit inspires TestNG itself, it provides its distinctive features, and unlike JUnit, it works for functional and higher levels of testing.
In this post, we'll discuss and compare these frameworks by covering their features and common use cases.
What is TestNG?
TestNG is a user-friendly automation testing framework that overcomes the drawbacks and limitations of the java unit (Junit). TestNG is inspired by JUnit and NET platform (NUnit) which uses the annotations (@) and is designed to make end-to-end testing easy. TestNG helps in generating a proper report where you can easily know how many test cases are passed, failed, and/or skipped. TestNG helps in executing failed test cases separately.
What is Junit?
JUnit is an open-source Unit Testing Framework for JAVA. It is useful for Java Developers to write and run repeatable tests. Erich Gamma and Kent Beck initially develop it. It is an instance of xUnit architecture. As the name implies, it is used for Unit Testing of a small chunk of code.
Developers who are following test-driven methodology must write and execute unit test first before any code.
Once you are done with code, you should execute all tests, and it should pass. Every time any code is added, you need to re-execute all test cases and makes sure nothing is broken.
Differences between JUnit and TestNG
Both TestNG and JUnit4 looks similar, except one or two features. Let’s have a comparison between the two to quickly decide, which technology is more favourable for Unit Testing. Below table highlights the features supported by both:
The Key Difference between TestNG and Junit are given below:
TestNG is a Java-based framework, while JUnit is an open-source Unit Testing Framework for JAVA.
Comparing TestNG Vs JUnit, TestNG annotations are easier to use and understand than JUnit.
TestNG allows us to create parallel tests, whereas JUnit does not support running parallel tests.
In TestNG, Test cases can be grouped together, while in JUnit, grouping tests together is not possible.
Let’s discuss and compare each characteristic given in the above table in detail:
Annotations
Both JUnit and TestNG uses annotations and almost all the annotations look similar.
TestNG uses @BeforeMethod, @AfterMethod like @Before, @After in JUnit4.
Both TestNG and Junit4 uses @Test (timeout = 1000) for timeout. Look at the table below for more details:
Suite Test
Suites are used to execute multiple tests together. Suites can be created using both TestNG and JUnit4. However, suites are more powerful in TestNG as it uses very different method for execution of tests. Let’s understand it using code snippet as given below:
Using JUnit4
Below class describes use of suite while working with JUnit4:
Using TestNG
TestNG uses xml to bundle all tests at one place. Below .xml describes use of suite while working with TestNG:
Ignore Test
Using both we can skip a test. Let’s see it using code example as given below:
Using JUnit4
Below code snippet describes use of @ignore annotation while working with JUnit4:
Using TestNG
Below code snippet describes use of @Test(enabled=false) annotation while working with TestNG:
Exception Test
Exception testing is available both in TestNG and JUnit4. It is used to check, which exception is thrown from the test?
Using JUnit4
Below code snippet describes use of exception test while working with JUnit4:
Using TestNG
Below code snippet describes use of exception test while working with TestNG:
Timeout
This feature is implemented both in TestNG and JUnit4.Timeout is used to terminate a test which takes longer than specified time (in milliseconds).
Using JUnit4
Below code snippet describes use of timeout test while working with JUnit4:
Using TestNG
Below code snippet describes use of timeout test while working with TestNG:
Parameterized Test
JUnit provides an easier and readable approach to test known as Parameterized test. Both TestNG and JUnit supports parameterized test but differ in the way they define the parameter value. Let see this one by one.
Using JUnit4
The “@RunWith” and “@Parameter” annotations are used to provide parameter value for the unit test. The annotation @Parameters have to return List[] .This parameter will be passed into the class constructor as an argument.
Using TestNG
In TestNG, XML file or “@DataProvider” is used to provide a parameter for testing.
Here @Parameters annotation declared in the method, needs a parameter for testing. The data used as the parameter will provide in TestNG’s XML configuration files. By doing this, we can reuse a single Test Case with different data sets, and we can get different results.
See below xml file to be used for above class:
Order of Test Execution
There is no defined implicit order in which test methods will get executed in JUnit 4 or TestNG. The methods are just invoked as returned by the Java Reflection API. Since JUnit 4 it uses a more deterministic but not predictable order.
Using JUnit4
To have more control, we will annotate the test class with @FixMethodOrder annotation and mention a method sorter:
Using TestNG
While TestNG also provides a couple of ways to have control in the order of test method execution. We provide the priority parameter in the @Test annotation:
Conclusion
Both JUnit and TestNG are modern tools for testing in the Java ecosystem. We saw JUnit and TestNG comparison in details. In this article, we had a quick look at various ways of writing tests with each of these two test frameworks. We also saw both are similar except parameterized test and dependency test. In short, we can say, based on flexibility and requirement we can choose any one of them for Unit Testing.