TestNG vs Junit

In this post, we’re going to talk about two of the most used tools amongst the IT professions in the community. Tools that allow easy test implementation has powerful features and they’re easy to integrate. TestNG and JUnit are widely utilized and incorporated in the testing world today. Used in a variety of automation tools and integrated with other frameworks, they offer great test modularity, flexibility, and easy to understand and write test structure. We’re going to take a look at the core differences between them, as well as what tool is better to use under specific testing approaches.

What is JUnit?

junit

JUnit is an open-source testing framework that used and written in Java. The purpose of using this framework is to write and execute automation tests. It allows us to annotate methods in Java as test methods. These are constructed to be executed as tests for our application. The nature of the test itself could be a unit, integration, or even an API functional test. Thanks to the annotations, it’s test runner is able to recognize these test annotations and execute them.

Assertion library is also part of what JUnit offers in its package of features. We can assert the actual vs expected value inside the test. Last but not least, JUnit provides a test report of all successful and failed tests.

What is TestNG?

TestNG (TestNextGeneration) is also a testing framework and it is very similar to JUnit but with few improvements that make it more powerful for writing automated tests. Basically, it servers the same purpose as JUnit as it is inspired by it but overcomes any disadvantages that JUnit has. It is designed in that way so that it can be understood and allows us to write more flexible and powerful tests with the help of annotations, groupings, and parametrizing.

Some of its features are:

  • Easy to understand annotations
  • Data Parameterization
  • Parallel testing
  • Grouping tests
  • Generating test reports and logs

What are the differences?

Since you already have a basic glimpse of what is TestNG and what JUnit, I’m going to walk you through all the differences between them.

Let’s look at the table below.

AnnotationsJUnitTestNG
Test Annotations@Test@Test
Before each test method execution@BeforeEach@BeforeMethod
Before all test method execution@BeforeAll@BeforeClass
After each test method execution@AfterEach@AfterMethod
After all test method execution@AfterAll@AfterClass
Test ignore@Ignore@Test(enable=false)
Timeout@Test(timeout=500)@Test(timeout=500)
Before test suite executionN/A@BeforeSuite
After test suite executionN/A@AfterSuite
Before each test N/A@BeforeTest
After each test N/A@AfterTest
Before test group executionN/A@BeforeGroups
After test group executionN/A@AfterGroups
TestNG vs JUnit Annotations

As you can see from the table above, most of the annotations have different syntax but the concept behind it is the same other than the ones that TestNG has but JUnit does not.

Test @Test annotation on both tools is the same and it’s used when we are writing a test. Anything that we want to be executed before a test method is annotated by @BeforeEach in JUnit or @BeforeMethod in TestNG. It will be run before any test that we have in our test class. The same applies to @AfterEach/@AfterMethod, which runs after every test method. If we want to have a method that is executed before or after all tests only once, we can use the following annotations @AfterAll/@AfterMethod and @BeforeAll/@BeforeClass respectively.

The difference here is that the TestNG has additional annotations that allow more test flexibility. Annotations like @BeforeSuite or @AfterSuite run before or after all the tests defined in the folder. This can be especially helpful when we have multiple URLs to target. These annotations accept and store the environment variables previously set and before starting the tests, they are loaded in the framework. If we want to group some of the tests in the test class and run something before/after their execution that doesn’t affect the other tests in the same class then we can use @BeforeGroups/@AfterGroups.

TestNG/JUnit examples

Here are some simple examples using both tools features:

JUnit

@BeforeEach
public void beforeClassMethod() {
// code to be run before each test in the class
}

@AfterAll
public void afterClassMethod() {
// code
 to be run after all tests in the class
}

@BeforeGroups
public void beforeClassMethod() {
// code to be run before each test in the test group within the classs
}

@Test
public void test1() {
 System.out.println("This is test 1");
}

@Test
public void test2() {
 System.out.println("This is test 2");
}

@Test
(groups= {"Group 1"})
public void test3() {
 System.out.println("This is test 3");
}

@Test
(groups= {"Group 1"})
public void test4() {
 System.out.println("This is test 4");
}

@Test
 @Ignore
public void test5() {
 System.out.println("This is test 5 and it is ignored");
}

TestNG

@BeforeMethod
public void beforeClassMethod() {
// code to be run before each test in the class
}

@Afterclass
public void afterClassMethod() {
// code
 to be run after all tests in the class
}

@Test
public void test1() {
 System.out.println("This is test 1");
}

@Test
public void test2() {
 System.out.println("This is test 2");
}

@Test
(enable=false)
public void test3() {
 System.out.println("This is test 3 and it is ignored");
}

Conclusion

Which one of the tools we want to use depends on the testing strategy set at the beginning of the project. Whether we opt for the solid and stable JUnit or the new and fresh TestNG with additional features that cover the JUnit limitations, we’re not going to make any mistake since both tools are powerful enough to allow us to write excellent and understandable tests. Both of them can be used for your test automation process. Good luck with writing tests!

Latest Posts


Vladimir Simonovski
Vladimir Simonovski

Software Automation Engineer for almost 5 years of experience. Involved in many QA activities for the insurance and banking platforms. Follow QAMIND on Twitter and LinkedIn to get fresh content around Software Testing

Share this post