JUnit

1

JUnit is a test automation framework for the Java programming language. JUnit is often used for unit testing, and is one of the xUnit frameworks. JUnit is linked as a JAR at compile-time. The latest version of the framework, JUnit 5, resides under package org.junit.jupiter. Previous versions JUnit 4 and JUnit 3 were under packages org.junit and junit.framework, respectively. A research survey performed in 2013 across 10,000 Java projects hosted on GitHub found that JUnit (in a tie with slf4j-api) was the most commonly included external library. Each library was used by 30.7% of projects.

JUnit Lifecycle

Every JUnit test class usually has several test cases. These test cases are subject to the test life cycle. The full JUnit Lifecycle has three major phases:

Integration with other tools

JUnit 5 integrates a number of tools, such as build tools, integrated development environments (IDE), continuous integration (CI) tools and many more.

Build Tools

JUnit supports Apache Ant, Apache Maven and Gradle build tools, which are the most widely used project build tools. Build tools are vital for automating the process of building the project.

Ant Extension

Apache Ant, also known as Ant, is one of the build tools with the highest degree of versatility, and has the longest history out of the three build tools listed above. Ant centers around the file, used for configuring the tasks necessary to run a project. Ant also has an extension called Apache Ivy, which helps deal with dependency resolution. The project dependencies can be declared in the file. Ant can integrate with JUnit 5 by configuring the Java code coverage tools (JaCoCo), for the file. The can then be configured with the and dependencies to integrate with JUnit 5.

Maven Extension

In contrast to Ant, Apache Maven, also known as Maven, uses a standardized and unified approach to the build process. Maven follows the paradigm of "convention over configuration" for managing its dependencies. The Java source code (or "src") can be found under the directory, and the test files can be found under the directory. Maven can be used for any Java Project. It uses the Project Object Model (POM), which is an XML-based approach to configuring the build steps for the project. The minimal Maven with the build file must contain a list of dependencies and a unique project identifier. Maven must be available on the build path to work. Maven can integrate with JUnit 5 using the plugin which supports out-of-box functionality for JUnit 5 tests. Different Maven goals can be specified to achieve these tasks.

Gradle Extension

Gradle is a build tool that borrows many concepts from its predecessors, Ant and Maven. It uses the build.gradle file to declare the steps required for the project build. Unlike Ant and Maven, which are XML-based, Gradle requires the use of Apache Groovy, which is a Java-based programming language. Unlike Ant and Maven, Gradle does not require the use of XML. Gradle still adheres to Maven's "convention over configuration" approach, and follows the same structure for src/main/java and src/test/java directories. Gradle can integrate with JUnit 5 by configuring a plugin jacoco alongside the junit-platform plug-in given by the JUnit 5 team in the build file.

JUnit Extension Model

JUnit follows the paradigm of preferring extension points over features. The JUnit team decided not to put all features within the JUnit core, and instead decided to give an extensible way for developers to address their concerns. In JUnit 4, there are two extension mechanisms: the Runner API and Rule API. There were some disadvantages to both the Runner API and the Rule API. A major limitation of the Runner API is that the developer has to implement the entire life cycle even if they only need a specific life cycle stage. This is too complicated and heighweight for the majority of use cases. Another major limitation is that only one runner class is used for each test case, and makes them uncomposable. As an example, Mockito and Parameterized runners cannot exist within the same test class. A major limitation of the Rule API is that it cannot control the entire life cycle of the test, so they cannot be used for every single use case. They are only appropriate when something needs to occur before or after test case execution. Another major limitation is that rules for class-level and method-level callbacks must be made separately. In JUnit 5, the extension API is found within the JUnit Jupiter Engine. The JUnit Team wants to allow the developer to hook to separate stages of a test life cycle by providing a single unified extension API. Upon reaching a certain life cycle phase, the Jupiter Engine will invoke all registered extensions for that phase. The developer can hook into five major extension points:

Example of a JUnit test fixture

A JUnit test fixture is a Java object. Test methods must be annotated by the @Test annotation. If the situation requires it, it is also possible to define a method to execute before (or after) each (or all) of the test methods with the @BeforeEach (or @AfterEach) and @BeforeAll (or @AfterAll) annotations.

Previous versions of JUnit

According to Martin Fowler, one of the early adopters of JUnit: "JUnit was born on a flight from Zurich to the 1997 OOPSLA in Atlanta. Kent was flying with Erich Gamma, and what else were two geeks to do on a long flight but program? The first version of JUnit was built there, pair programmed, and done test first (a pleasing form of meta-circular geekery)." As a side effect of its wide use, previous versions of JUnit remain popular, with JUnit 4 having over 100,000 usages by other software components on the Maven Central repository. In JUnit 4, the annotations for test execution callbacks were @BeforeClass, @Before, @After, and @AfterClass, as opposed to JUnit 5's @BeforeAll, @BeforeEach, @AfterEach, and @AfterAll. In JUnit 3, test fixtures had to inherit from junit.framework.TestCase. Additionally, test methods had to be prefixed with 'test'.

Citations

This article is derived from Wikipedia and licensed under CC BY-SA 4.0. View the original article.

Wikipedia® is a registered trademark of the Wikimedia Foundation, Inc.
Bliptext is not affiliated with or endorsed by Wikipedia or the Wikimedia Foundation.

Edit article