Junit 3.8.1 源碼分析之兩個接口
阿新 • • 發佈:2018-05-13
htm get strac .html tab actual string errors iter
2. Junit 的兩個重要接口(
2.1
2.2
1. Junit源碼文件說明
runner
framework
:整體框架;extensions
:可以對程序進行擴展;textui
:JUnit運行時的入口程序以及程序結果的呈現方式;awtui
:JUnit運行時的入口程序以及程序結果的呈現方式;swingui
:JUnit運行時的入口程序以及程序結果的呈現方式;
2. Junit 的兩個重要接口(Test
和TestListener
)
2.1 Test
接口
// Junit源碼 // Test.java public interface Test{ // 統計測試方法 public abstract int countTestCases(); // 對方法進行測試,以及匯總測試結果 public abstract void run(TestResult result); } // TestCase.java(單個測試方法) // 繼承Assert類,實現Test類 public abstract class TestCase extends Assert implements Test{ ...(略) public int countTestCases(){ return 1; } public TestResult run(){ TestResult result = createResult(); run(result); return result; } // 實現接口的方法 public void run(TestResult result){ result.run(this); } public void runBare() throws Throwable{ setUp(); try{ runTest(); }finally{ tearDown(); } } ...(略) } //TestSuite.java(一組測試方法) public class TestSuite implements Test{ private Vector fTests = new Vector(10); private String fName; public Enumeration tests(){ return fTests.elements(); } public int countTestCases(){ int count = 0; for(Enumeration e = tests(); e.hasMoreElements(); ){ Test test = (Test)e.nextElement(); count = count + test.countTestCases(); } return count; } public void run(TestResult result){ for(Enumeration e = tests(); e.hasMoreElements(); ){ if(result.shouldStop()) break; Test test = (Test)e.nextElement(); runTest(test, result); } } public void runTest(Test test, TestResult result){ test.run(result); } } //Assert類,對測試方法結果的斷言 public class Assert{ // 構造方法 protected Assert(){ } // 靜態方法 static public void assertTrue(String message, boolean condition){ if(!condition) fail(message); } static public void assertFalse(String message, boolean condition){ assertTrue(message, !condition); } static public void fail(String message){ throw new AssertionFailedError(message); } static public void assertEquals(String message, Object expected, Object actual){ if(expected == null && actual == null) return; if(expected != null && expected.equals(actual)) return; failNotEquals(message, expected, actual); } ...(略) static private void failNotEquals(String message, Object expected, Object actual){ fail(format(message, expected, actual)); } static String format(String message, Object expected, Object actual){ String formatted = ""; if(message != null) formatted= message + " "; return formatted+"expected:<"+expected+"> but was:<"+actual+">"; } } // TestResult 類,測試結果類 public class TestResult extends Object { protected Vector fFailures; protected Vector fErrors; protected Vector fListeners; protected int fRunTests; private boolean fStop; public TestResult(){ fFailures = new Vector(); fErrors = new Vector(); fListeners = new Vector(); fRunTests = 0; fStop = false; } ...(略) //運行測試方法 protected void run(final TestCase test){ startTest(test); Protectable p = new Protectable(){ public void protect() throws Throwable{ test.runBare(); } }; runProtected(test, p); endTest(test); } public void startTest(Test test){ final int count = test.countTestCases(); synchronized(this){ fRunTests+=count; } for(Enumeration e = cloneListeners().elements(); e.hasMoreElements(); ){ ((TestListener)e.nextElement()).startTest(test); } } public void runProtected(final Test test, Protectable p){ try{ p.protect(); } catch(AssertionFailedError e){ addFailure(test, e); } catch(ThreadDeath e){ throw e; } catch(Throwable e){ addError(test, e); } } public void endTest(Test test){ for(Enumeration e = cloneListeners().elements(); e.hasMoreElements(); ){ ((TestListener)e.nextElement()).endTest(test); } } }
2.2 TestListener
接口
// TestListener.java public interface TestListener{ public void addError(Test test, Throwable t); public void addFailure(Test test, AssertionFailedError t); public void endTest(Test test); public void startTest(Test test); } // 負責結果打印 // ResultPrinter.java public class ResultPrinter implements TestListener{ //打印"E" public void addError(Test test, Throwable t){ getWriter().print("E"); } //打印"F" public void addFailure(Test test, AssertionFailedError t){ getWriter().print("F"); } public void endTest(Test test){ } public void startTest(Test test){ getWriter().print("."); if(fColumn++ >= 40){ getWriter().println(); fColumn = 0; } } ...(略) } // 所有TestRunListener的基類 // BaseTestRunner.java public abstract class BaseTestRunner implements TestListener{ public synchronized void startTest(Test test){ testStarted(test.toString()); } public synchronized void endTest(Test test){ testEnded(test.toString()); } public synchronized void addError(final Test test, final Throwable t){ testFailed(TestRunListener.STATUS_ERROR, test, t); } public synchronized void addFailure(final Test test, final AssertionFailedError t){ testFailed(TestRunListener.STATUS_FAILURE, test, t); } // TestRunListener需要實現 public abstract void testStarted(String testName); public abstract void testEnded(String testName); public abstract void testFailed(int status, Test test, Throwable t); }
參考資料:
- Junit3.8.1執行流程
- Junit3.8.1源碼分析
- 分析JUnit框架源代碼
Junit 3.8.1 源碼分析之兩個接口