JUnit ( bliu76@yeah.net) < >6 JUnit Java Erich Gamma Kent Beck JUnit JUnit 1 JUnit 1.1 JUnit JUnit java XUnit JUnit 1.2 JUnit JUnit Erich Gamma Kent Beck Erich Gamma Kent Beck XP Extreme Programming CRC XUnit The Smalltalk Best Practice Patterns Extreme Programming Explained Planning Extreme Programming Martin Fowler JUnit JUnit JUnit 2 JUnit JUnit Patterns Generate Architectures "Patterns Generate Architectures", Kent Beck and Ralph Johnson, ECOOP 94 Junit 1/1
3 JUnit 3.1 Command 3.1.1 JUnit framework TestCase ( ) JUnit JUnit JUnit TestCase JUnit TestCase 3.1.2 Command Gamma, E., et al. Design Patterns: Elements of Reusable Object-Oriented Software, Addison-Wesley, Reading, MA, 1995 intent "..."Command "execute " 3.1.3 Command Test, Run Command Execute Default Adapter TestCase Test Test run() TestCase run() Test counttestcases TestCase Command Excecute run TestResult public interface Test { // Counts the number of test cases that will be run by this test. public abstract int counttestcases(); //runs a test and collects its result in a TestResult instance. public abstract void run(testresult result); Junit 2/2
TestCase TestCase public abstract class TestCase extends Assert implements Test { //the name of the test case private String fname; public void run(testresult result) { result.run(this); TestCase run JUnit run TestResult 3.1.4 Command Command TestCase JUnit Command TestCase TestCase Command TestCase TestSuit Composite Command TestCase Junit Fromwork, Command Undo Redo Log, JUnit 3.2 Composite 3.2.1 Command JUnit JUnit. TestCase TestCase TestCase Junit if issingletestcase(objectrequest) { // TestCase, run (TestCase)objectRequest.run() else if(iscompositetestcase(objectrequest)){ // TestCase, // TestCase // Junit 3/3
JUnit TestCase testcase testcase JUnit TestCase TestCase 3.2.2 JUnit Composite " ' - ' Composite " ' - ' TestCase TestCase TestSuit Composite Composite Component Test run Composite TestSuit Leaf TestCase, componsite JUnit TestCase 3.2.3 composite Component Leaf composite Java Composite Test leaf TestCase //composite Component public interface Test { Junit 4/4
public abstract void run(testresult result); //composite Leaf public abstract class TestCase extends Assert implements Test { public void run(testresult result) { result.run(this); Composite TestSuit TestSuit ftests (Vector ) addtest TestCase, testcount tests run() delegate addtestsuite public class TestSuite implements Test { private Vector ftests= new Vector(10); public void addtest(test test) { ftests.addelement(test); public Enumeration tests() { return ftests.elements(); public void run(testresult result) { for (Enumeration e= tests(); e.hasmoreelements(); ) { Test test= (Test)e.nextElement(); runtest(test, result); public void addtestsuite(class testclass) { addtest(new TestSuite(testClass)); Composite Test TestCase TestSuit Test addtestsuite TestSuite TestSuite TestSuit Junit 5/5
TestSuit TestCase public static Test suite() { TestSuite suite1 = new TestSuite(" TestSuit1"); TestSuite suite2 = new TestSuite(" TestSuit2"); suite1.addtestsuite(untitled6.testmath.class); suite2.addtestsuite(untitled6.testmulti.class); suite1.addtest(suite2); return suite1; 3.2.4 Composite JUnit JUnit TestSuite TestCase JUnit if else TestCase TestSuite TestCase TestSuite TestCase Decorate TestCase 3.3 Template Method 3.3.1 Connection public void testupdate(){ // Load the Oracle JDBC driver and Connect to the database DriverManager.registerDriver(new oracle.jdbc.oracledriver()); String url = "jdbc:oracle:thin:@localhost:1521:ora91"; Junit 6/6
Connection conn = DriverManager.getConnection (url, "hr", "hr"); // Select first_name and last_name column from the employees table ResultSet rset = stmt.executequery ("select FIRST_NAME, LAST_NAME from EMPLOYEES"); // Disconnect conn.close (); EJB JNDI LookUp Home TestCase Insert Update Delete Select connection JUnit 3.3.2 Template Method Template Method Template Method AbstractClass ConcreteClass AbstractClass ConcreteClass ConcreteClass 3.3.3 TestCase Junit 7/7
TestCase public abstract class TestCase extends Assert implements Test { // protected void setup() throws Exception { protected void runtest() throws Throwable { protected void teardown() throws Exception { // public void runbare() throws Throwable { setup(); runtest(); teardown(); setup EJB Home JNDI teardown runtest TestCase runbare setup, runtest, teardown, public class TestHelloWorldTestClientJUnit1 extends TestCase { public void setup() throws Exception { initialize();// JNDI create(); // EJB Home public void testgetmessage() throws RemoteException { assertnotnull(error_null_remote, helloworld); this.assertequals("hello World",helloWorld.getMessage(""));// public void teardown() throws Exception { helloworldhome = null; // EJB Home helloworld = null; // EJB setup teardown testgetmessage runtest Adapter testgetmessage runtest Junit 8/8
TestCase runbare() runtest() setup() teardown() TestHelloWorldTestClientJUnit1 setup() teardown() testgetmessage() 3.3.4 Template Method TestCase JUnit 3.4 Adapter 3.4.1 Command Command execute() TestCase run() command Testcase run testrun setup teardown testrun testgetmessage testsetmessage command JUnit 3.4.2 Adapter testgetmessage JUnit Command TestCase run Adapter Junit 9/9
Target Adaptee Adapter 3.4.3 TestCase public void testxxxxx() Adapter Command runtest java protected void runtest() throws Throwable { // testgetmessage runtest Method runmethod= getclass().getmethod(fname, null); runmethod.invoke(this, new Class[0]); Target Adapter,TestCase Adaptee TestCase runtest() TestHelloWorldTestClientJUnit1 testgetmessage() 3.4.4 Adapter Adapter Adapter Adaptee 3.5 Observer 3.5.1 JUnit failureserrors Junit 10/10
assertion ArrayIndexOutOfBoundsException GUI JUnit Text,AWT,Swing JUnit TestCase JUnit 3.5.2 Observer Observer (Publish-Subscribe) Model/View Source/Listener JUnit, GUI Observer Observer Subject ConcreteSubject Observer ConcreteObserver 3.5.3 Observer TestListener // A Listener for test progress public interface TestListener { // An error occurred. public void adderror(test test, Throwable t); Junit 11/11
// A failure occurred. public void addfailure(test test, AssertionFailedError t); // A test started. public void starttest(test test); //A test ended. public void endtest(test test); JUnit TestListener TextUI,AWTUi,SwingUI TestListener TextUi ResultPrinter public class ResultPrinter implements TestListener { PrintStream fwriter; * A test ended. public PrintStream getwriter() { return fwriter; public void starttest(test test) { getwriter().print("."); public void adderror(test test, Throwable t) { getwriter().print("e"); public void addfailure(test test, AssertionFailedError t) { getwriter().print("f"); public void endtest(test test) { JUnit TestResult Collecting Parameter The Smalltalk Best Practice Patterns ConcreteSubject JUnit Subject ConcreteSubject public class TestResult extends Object { // Vector protected Vector flisteners = new Vector(); // Registers a TestListener public synchronized void addlistener(testlistener listener) { flisteners.addelement(listener); //Unregisters a TestListener public synchronized void removelistener(testlistener listener) { flisteners.removeelement(listener); //Informs the result that a test will be started. public void starttest(test test) { for (Enumeration e= clonelisteners().elements(); e.hasmoreelements(); ) { Junit 12/12
((TestListener)e.nextElement()).startTest(test); //Adds an error to the list of errors. The passed in exception //caused the error. public synchronized void adderror(test test, Throwable t) { for (Enumeration e= clonelisteners().elements(); e.hasmoreelements(); ) { ((TestListener)e.nextElement()).addError(test, t); // addfailure endtest TestRes ult flisteners : java.util.vector adderror() addfailure() addlistener() clonelisteners() endtest() removelistener() starttest() TestListener adderror() addfailure() endtest() starttest() ResultPrinter adderror() addfailure() endtest() getwriter() starttest() 3.5.4 Observer Subject Observer TestResult TestListener TestResult TestResult TestResult ResultPrinter 3.6 Decorate 3.6.1 TestCase Junit 13/13
TestCase Testcase TestCase TestCase Socket RepeatedTest TestCase RepeatedTest JUnit 3.6.2 Decorator Decorator (Wrapper) Decorator TestCase Decorator Decorator Component ConcreteComponent Decorator Component ConcreteDecorator 3.6.3 Decorator Test Component TestCase ConcreteComponent Decorator TestDecorator Test ftest run ftest run ConcreteComponent public class TestDecorator extends Assert implements Test { // protected Test ftest; public TestDecorator(Test test) { ftest= test; Junit 14/14
public void run(testresult result) { ftest.run(result); Decoretor RepeatedTest TestCase public class RepeatedTest extends TestDecorator { private int ftimesrepeat; public RepeatedTest(Test test, int repeat) { super(test); ftimesrepeat= repeat; // ConcreteComponent public void run(testresult result) { for (int i= 0; i < ftimesrepeat; i++) { if (result.shouldstop()) break; super.run(result); // TestCase Test TestDecorator RepeatedTest TestSetup TestCase public static Test suite() { TestSuite suite = new TestSuite(); suite.addtest(new TestSetup(new RepeatedTest(new Testmath("testAdd"),12))); return suite; TestCase RepeatedTest TestCase TestSetup Junit 15/15
3.6.4 Decorator TestCase RepeatedTest suite.addtest (new RepeatedTest(new Testmath("testAdd"),12)); TestCase Decorator TestCase suite.addtest(new TestSetup(new RepeatedTest(new Testmath("testAdd"),12))); 3.7 JUnit Junit 13 Junit 16/16