JUnit Jan 14 2019 Terminology A test fixture sets up the data both objects and primitives that are needed to run tests Example If you are testing code that updates an employee record you need an employee record to test it on A unit test is a test of a single class A test case tests the response of a single method to a particular set of inputs A test suite is a collection of test cases A test runner is software that runs tests and reports results An integration test is a test of how well classes work together JUnit provides some limited support for integration tests 2 Once more in pictures test suite test runner another unit test test case for one method another test case another unit test another test case another test case another test case unit test for one class test case for one method another test case test fixture A unit test tests the methods in a single class A test case tests insofar as possible a single method You can have multiple test cases for a single method A test suite combines unit tests The test fixture provides software support for all this The test runner runs unit tests or an entire test suite Integration testing testing that it all works together is not well supported by JUnit 3 Writing a JUnit test class I Start by importing these JUnit 4 classes import org junit import static org junit Assert note static import Declare your test class in the usual way public class MyProgramTest Declare an instance of the class being tested You can declare other variables but don t give them initial values here public class MyProgramTest MyProgram program int someVariable 4 Writing a JUnit test class II Before public void setUp program new MyProgram someVariable 1000 Define a method or several methods to be executed before each test Initialize your variables in this method so that each test starts with a fresh set of values You can define one or more methods to be executed after each test Typically such methods release resources such as files Usually there is no need to bother with this method After public void tearDown 5 A simple example Suppose you have a class Arithmetic with methods int multiply int x int y and boolean isPositive int x import org junit import static org junit Assert public class ArithmeticTest Test public void testMultiply assertEquals 4 Arithmetic multiply 2 2 assertEquals 15 Arithmetic multiply 3 5 Test public void testIsPositive assertTrue Arithmetic isPositive 5 assertFalse Arithmetic isPositive 5 assertFalse Arithmetic isPositive 0 6 Assert methods I Within a test An assert method is a JUnit method that performs a test and throws an AssertionError if the test fails JUnit catches these Errors and shows you the result static void assertTrue boolean test static void assertTrue String message boolean test Call the method being tested and get the actual result Assert what the correct result should be with one of the assert methods These steps can be repeated as many times as necessary Throws an AssertionErrorif the test fails The optional message is included in the Error static void assertFalse boolean test static void assertFalse String message boolean test Throws an AssertionErrorif the test fails 7 Example Counter class For the sake of example we will create and test a trivial counter class The constructor will create a counter and set it to zero The increment method will add one to the counter and return the new value The decrement method will subtract one from the counter and return the new value In this simple example the JUnit tests are more code than the class itself This isn t usually the case for real classes and methods 8 JUnit tests for Counter public class CounterTest Counter counter1 declare a Counter here Before void setUp counter1 new Counter initialize the Counter here Test public void testIncrement assertTrue counter1 increment 1 assertTrue counter1 increment 2 Test public void testDecrement assertTrue counter1 decrement 1 Note that each test begins with a brand new counter This means you don t have to worry about the order in which the tests are run 9 The Counter class itself public class Counter int count 0 public int increment return count 1 public int decrement return count 1 public int getCount return count Is JUnit testing overkill for this little class The Extreme Programming view is If it isn t tested it doesn t work You are not likely to have many classes this trivial in a real program so writing JUnit tests for those few trivial classes is no big deal Often even XP programmers don t bother writing tests for simple getter methods such as getCount We only used assertTrue in this example but there are additional assert methods 10 Warning equals You can compare primitives with Java has a method x equals y for comparing objects assertEquals expected actual uses or equals To define equals for your own objects define exactly this method public boolean equals Object obj This method works great for Strings and a few other Java classes For objects of classes that you create you have to define equals The argument must be of type Object which isn t what you want so you must cast it to the correct type say Person public boolean equals Object something Person p Person something return this name p name test whatever you like here We ll talk much more about equals later 11 Assert methods II assertEquals expected actual assertEquals String message expected actual expected and actual must be both objects or the same primitive type For objects uses your equals method if you have defined it properly as described on the previous slide assertSame Object expected Object actual assertSame String message Object expected Object actual Asserts that two arguments refer to the same object assertNotSame Object expected Object actual assertNotSame String message Object expected Object actual Asserts that two objects do not refer to the same object 12 Assert methods III assertNull Object object assertNull String message Object object Asserts that the object is null undefined assertNotNull Object object assertNotNull String message Object object Asserts that the object is null fail fail String message Causes the test to fail and throw an AssertionFailedError Useful as a result of a complex test when the other assert methods aren t quite what you want 13 Writing a JUnit test class III This page is really only for expensive setup such as when you need to connect to a database to do your testing BeforeClass public static void setUpClass throws Exception one
View Full Document
Unlocking...