CSC 216 Lecture 3 1 Unit Testing The most basic kind of testing is called unit testing Why is it called “unit” testing? When should tests be written? Before the code for a class is written. After the code for a class is written, but before other classes are written. After code for all classes is written, but before the classes are integrated. After the classes are integrated. 2 Testing at the Boundaries What does this mean? Example (from Dr. Jo Perry) For a method that removes an element from a list Test on a list with 1 element Test on a list that does not contain the element to be removed Test on a list where the element is at the beginning/end of the list Test on a list where the element appears multiple times Test on an empty list 3 Testing a Square-Root Routine From the text: What kinds of tests were proposed? Test numbers greater than 1. Test numbers less than 1. Test negative numbers. Test randomly generated numbers. Apply the inverse of the square-root operation. 4 Testing a Stack Suppose we have a MyStack class implemented in an integer array. MyStack(int n); void push(int i); int pop(); int top(); 33 9 17 5 Testing a Stack Suppose we have a MyStack class implemented in an integer array. MyStack(int n); void push(int i); int pop(); int top(); 15 9 17 6 Testing a Stack Suppose we have a MyStack class implemented in an integer array. MyStack(int n); void push(int i); int pop(); int top(); 9 17 7 Testing a Stack Suppose we have a MyStack class implemented in an integer array. MyStack(int n); void push(int i); int pop(); int top(); 17 What test cases should we use? 8 What is JUnit? An open-source regression-testing framework for Java JUnit’s web site: http://junit.org Eclipse includes JUnit However, you need to set it up inside each project. It allows you to define regression tests for your code and run them from the Java IDE. 9 Testing » JUnit Test Cases JUnit Test Cases Test case Runs multiple tests Implemented as subclass of TestCase Define instance variables that store the state of the tests in the class Initialize TestCase by overriding setUp method Cleanup after test case is done by overriding tearDown method The Test framework will invoke the setUp and tearDown methods. 10 Testing » Setting up JUnit JUnit is in Eclipse by default, but needs to be applied to a project by performing a few actions. First, right-click on the name of the package. 11 Testing » Setting up JUnit, cont. From the popup menu, select “Build Path”; then “Configure Build Path” 12 Testing » Setting up JUnit, cont. Then select “Add Library” and then “JUnit”. 13 Testing » Setting up JUnit, cont. Then, when asked which version, just click on “Finish”. 14 Creating JUnit Test Cases in Eclipse Testing » Create a new package to contain your test case classes. Add the JUnit JAR file to the project’s buildpath. 15 Creating JUnit Test Cases in Eclipse Testing » Select your testing package From the context menu select New » JUnit Test Case. This opens the New JUnit Test Case Wizard. Fill in the name of your test case in the Name field. Select the method stubs that you want Eclipse to generate This will create the corresponding class in your testing package 16 Testing » JUnit TestCase Template public class NewTestCase extends TestCase { public static void main(String[] args) { } public NewTestCase(String arg0) { super(arg0); } protected void setUp() throws Exception { super.setUp(); } protected void tearDown() throws Exception { super.tearDown(); } } 17 Testing » Cases Adding Tests to Test Any method in a TestCase class is considered a test if it begins with the word “test”. You can write many tests (have many test methods) Each test method should use a variety of assert… methods to perform tests on the state of its class. 18 Testing » JUnit Assert Methods Assert methods include: assertTrue(boolean) assertFalse(boolean) assertNull(object) assertNotNull(object) assertEquals(x,y) assertSame(firstObject, secondObj) assertNotSame(firstObject, secondObj) 19 Testing » Example of a Test Case package stackTests; import junit.framework.TestCase; import stack.MyStack; public class Tests extends TestCase { protected void setUp() throws Exception { super.setUp(); } } protected void tearDown() throws Exception { super.tearDown(); } public void testPush() { MyStack = new MyStack(5); m.push(27); assertEquals(m.pop(), 27); } 20 Testing » Case Running JUnit Test Select TestCase class From the Run menu select Run » Run As » JUnit Test This will run the tests in your TestCase class along with the setUp and tearDown methods You will then get a report in the JUnit window 21 Testing » JUnit Window Red indicates a test has failed You can see which test failed You can see the call trace leading to the failure 22 Testing » JUnit Window You can see how many tests ran How many failures occurred You can see the details of the failure Errors occur when exceptions are thrown (e.g., when assertions fail) 23 Testing » Exercise Go through the Stack class and add additional unit tests. The stack class is at http://courses.ncsu.edu /csc216/lec/001/exercises/stack.java Submit one of your test cases here. 24 Important terms Black-box testing White-box testing Regression testing Test coverage 25