Automated testing in Java
The 1 minute guide to JUnit
1 minute. We will get you using JUnit and automated testing in 1 minute.
This is not a JUnit manual. It is not a tutorial. This post is simply a starting point. We assume that you are using Eclipse as an IDE.
What is JUnit?
- Automated testing that's 100% Java.
- No cost, part of Java technology
- It calls tests that you write yourself in Java. JUnit is a way of running tests that you have written.
- It saves huge amounts of time and effort keeping your software tested with each change that you make.
- Get the best benefit using JUnit in an IDE such as Eclipse.
JUnit structure
Your JUnit should match your application. For each class in your application, you create a corresponding JUnit class. For each method in your applicaiton class, created one or more test methods in your JUnit class:
In the Application, for each: | Create in JUnit: |
---|---|
Class | Associated test class |
Class method | One or more test methods |
For example, your application has a class HexEncode.java that contains a method:
public static String encodeString(String inp)
You would create a JUnit class as follows:
You can create other methods in your JUnit and use them internally. If they don't start with test they won't be called.
In the Application: | Create in JUnit: |
---|---|
HexEncode.java | HexEncodeTest.java |
Method: encodeString | public void testEncodeString() |
Note:
- JUnit methods are of type public void with no parameters.
- Put the word "Test" at the end of your JUnit class name.
- put the word "test" in front of each method. If you don't JUnit will not run that method.
You can create other methods in your JUnit and use them internally. If they don't start with test they won't be called.
JUnit class definitions
A JUnit class imports junit.framework.TestCase and the class extends TestCase:
import junit.framework.TestCase;
public class MyAppClassTest extends TestCase {
Specifying success and failure
JUnit provides assert* methods, the most widely used being assertEquals. This is how the tests are implemented. You do whatever setup you need in your JUnit method first, then you assertEquals the expected result with the variable (or method return) that contains the real world result.
For example, to test encodeString above, we create the method testEncodeString in our HexEncodeTest class:
import junit.framework.TestCase;
public class HexEncodeTest extends TestCase {
public void testhexEncodeTest() { String enc= ":42:72:61:64:20:A3:31:32:33:30"; String orig= "Brad £1230";
assertEquals(enc, HexEncode.encodeString(orig));
}
}
This then calls our application class's encodeString method and tests against the expected result (held in variable enc). If the two match, the test passes. If they are different, the test fails.
You can write as many test* methods as you want, JUnit will call them all. You can put as much Java coding into your methods as you want, sufficient to test all the expected actions and results from your application method.
Note: assertEquals is the essence of JUnit and takes any Java parameter type.
Common setup methods
The order of JUnits running cannot be guaranteed. You should always write your JUnit classes so that they are completely stand-alone. By this we mean that they set up all the data that they need from scratch. They do not depend on other tests having run (or not run) and if the test data is in a mess, it shouldn't matter, because the class must set up the data that it needs.
Likewise your test methods within those classes should also be stand-alone and able to be run in any order. They should not depend on other methods having run first and they should always set up the test data that they need completely within the method.
For this reason, you will almost certainly benefit from writing common "set up" and "clean up" methods, either within the JUnit class itself, or as a separate class the each JUnit class can use. This is especially useful for setting up test data in a database.
Creating JUnits in Eclipse
In Eclipse, open your project then click on File->New->JUnit Test Case.
Running JUnits in Eclipse
- All tests: In Eclipse, open your project then right-click on the "test" folder. Then choose Run As->JUnit Test
- One test class: Right-click the test class then choose: Run As->JUnit Test
Failed tests
Eclipse will show you the tests that fail in the Failure Trace pane. It displays the expected results and the real results. You can click on the line to jump to the test that failed.
JUnit as you develop
JUnit is there to save you time and effort. If you write your JUnits for the code that you are developing, as you develop the code:- The JUnits will test your code
- Writing JUnits ensures that you understand the code requirements
- Because testing seeks to find boundary, logical and exceptions errors, writing JUnits as you develop ensure that you develop complete code that handles errors and exceptions as well as being correct
Software releases
Never release software unless you have run the entire JUnit test suite successfully (see All tests above).Real world bugs
If a bug in your code is discovered in the real world, you didn't put that test in your JUnits! You should immediately update your JUnits to test for that bug:- It will test your fix
- It will protect you against that same bug re-appearing later