1、首先使用TestSuite
获取一个TestCase
中的所有测试方法(方法名以test开头的方法),为每个方法生成一个TestCase
实例并保存,实例中有个字段保存对应的方法名(为之后反射运行对应的方法做准备)。
2、之后依次执行所有生成的实例的run
方法(命令模式),其中代码如下
// TestCase.java public void run(TestResult result) { result.run(this); // TestCase 调用 TestResult 的方法 }
TestResult
之后主要用来收集运行的结果(其中维护一个监听器列表,在失败或错误时发送通知),它还会反过来调用TestCase
来实际执行,TestResult
中的代码如下
// TestResult.java protected void run(final TestCase test) { startTest(test); // 用来收集一共有多少个测试方法 Protectable p= new Protectable() { public void protect() throws Throwable { test.runBare(); // TestResult 调用 TestCase 的方法执行----实例执行方法 } }; runProtected(test, p); // 用来收集运行的结果(成功、失败数量) endTest(test); } // 收集运行结果 public void runProtected(final Test test, Protectable p) { try { p.protect(); } catch (AssertionFailedError e) { // 运行失败 addFailure(test, e); } catch (ThreadDeath e) { // don't catch ThreadDeath by accident throw e; } catch (Throwable e) { // 运行出现错误 addError(test, e); } }
其中调用的而TestCase
的runBare()
方法如下
// TestCase.java public void runBare() throws Throwable { setUp(); try { runTest(); // 反射调用方法执行 } finally { tearDown(); } }
总结如下:
首先使用 TestSuite 将测试类 TestCase 拆分,为每个测试方法生成一个实例
依次执行每个实例的执行方法,中间经过 TestResult 用来收集测试数量及执行结果