190 likes | 447 Views
Unit Testing Part 2: Drivers and Stubs. CSIS 3701: Advanced Object Oriented Programming. Testing Support Classes. Support class not executable program Need another executable program to run tests Construct support objects Call methods Display/check object state for correctness
E N D
Unit TestingPart 2: Drivers and Stubs CSIS 3701: Advanced Object Oriented Programming
Testing Support Classes • Support class not executable program • Need another executable program to run tests • Construct support objects • Call methods • Display/check object state for correctness • Key: other “tester” program must be simple • Any errors must be in support class, not tester!
NameList Example Current application may not use all methods in class NameList.java Main.java • Stores names • Returns current names • Validates list not full, name not already in list names Are errors here? Or are they in the testing tool itself?
Drivers • Simple program to test other code • Example: function driver for C++ sqrt functionint main() { double test; while(1) { cout << “Enter test case: “; cin >> test; cout << sqrt(test) << ‘\n’; } }
Class Drivers in Java • Must be in a main method • Separate testing class • As main in support class itself • Idea: keep testing tools as part of class • Do not delete when finished testing • Will need again if class modified in future NameList.java Constructors and methods main methodto test these
Class Drivers in Java • Example: Simple driver for add method in NameList public static void main(String[] args) { NameList n = new NameList(3); while(true) { String name = JOptionPane.showInputDialog(null, "Enter name"); n.add(name); JOptionPane.showMessageDialog(null, n.toString()); } }
Class Drivers in Java • May need additional code for exceptions public static void main(String[] args) { NameList n = new NameList(3); while(true) { String name = JOptionPane.showInputDialog(null, “Name:"); try {n.add(name);} catch (FullListException ex) { JOptionPane.showMessageDialog(null, "List full!"); } catch (InListException ex) { JOptionPane.showMessageDialog(null, “In list!"); } JOptionPane.showMessageDialog(null, n.toString()); }
Class Dependency • What if your class depends on other classes? • May not be available immediately if being developed by others • Still need to compile and test your code • Cannot afford to wait around for others! • Example: Developing main visual application without working NameList class
Class Dependency Main.java NameList.java NameList constructor void add(String) int getSize()String getNameByIndex(int) boolean isIn(String) boolean isFull() NameList names This class does not exist yet Nor do these constructors or methods
NameList Example • None of the following code will work! public void actionPerformed(ActionEvent e) { String name = nameField.getText(); if (names.isIn(name)) JOptionPane.showMessageDialog(this, name + " already in list"); else { names.add(name); for (int i = 0; i < names.getSize(); i++) namesArea.append(names.getNameByIndex(i) + "\n"); if (names.isFull()) addButton.setEnabled(false); }
Stubs • Stub: temporary code to take place of code still in development • Replaced with actual code when available • Must allow thorough testing of your code • All methods, branches, etc. • Must be simple • Easy to create • Unlikely to contain own bugs
Stub Function Example • Simple C++ example: Your code: … function();… stub code: void function() {} Function written by other developer and not currently available Simplest possible stub – will allow your code to compile and run
Stub Function Example • Can include diagnostic messages to help test • Is external function called at correct time? • Is it called with correct parameters? Your code: … function(a);… stub code: void function(int x) { cout << “function called with “ << x << “ as parameter\n”; } Diagnostic message displayed
Stub Function Example • May need to return value to help test your code • Can be simple “hard wired” value • Can prompt for return value if needed to test branches int function(int x) { cout << “function called with “ << x << “ as parameter\n”; cout << “What should it return?”; int y; cin >> y; return y; } b = function(a); if (b > 0) { … } else {…} function must return values greater than and less than 0 to test both branches Can perform one test that returns 1 and another that returns -1
Stub Classes • Takes place of entire class during testing • No state variables • Stubs for constructors/methods called by your code • Example: NameList stub for testing main: • Stub NameList constructor display parameter • Stub add method display parameter, prompt for whether to throw exception • Stub getSize method prompt for int to return • Stub isIn method prompt to return true or false • Stub isFull method prompt to return true or false • Stub getNameByIndex method return dummy value
NameList Stub public class NameListStub { public NameListStub(int max) { System.out.println("constructor called with "+max); } public String getNameByIndex(int index) { return "Stub Name"; } public int getSize() { String response = JOptionPane.showInputDialog(null, "What is list size?"); return Integer.parseInt(response); }
NameList Stub public boolean isIn(String name) { String response = JOptionPane.showInputDialog(null, "Is "+name+" in list?"); return response.equals("true"); } public boolean isFull() { String response = JOptionPane.showInputDialog(null, "Is list full?"); return response.equals("true"); }
NameList Stub public void add(String name) { System.out.println("add called with "+name); String response = JOptionPane.showInputDialog(null, “1) No exception\n2 List full\n3) In list"); if (response.equals(“1”)) return; if (response.equals(“2”)) throw new FullListException(); if (response.equals(“3”)) throw new InListException(); } Prompt for whether to throw an exception Throw appropriate exception type (must have stubs for these also)!