而代码:
if
(names.contains(name))
return;
用于在逐级追溯过程中,防止不同级别父类中的 testXXX()
方法重复加入 TestSuite 。
对于符合条件的 testXXX() 方法,addTestMethod 方法中用语句:
addTest(createTest(theClass, name));
将 testXXX
方法转化为 TestCase
,并加入到 TestSuite 。其中,addTest
方法接受 Test
接口类型的参数,其内部有 countTestCases
方法和 run
方法,该接口被 TestSuite 和
TestCase
同时实现。这是 Command 设计模式精神的体现,
Command 模式将调用操作的对象与如何实现该操作的对象解耦。在运行时,TestCase
或 TestSuite
被当作 Test 命令对象,可以像一般对象那样进行操作和扩展,也可以在实现
Composite 模式时将多个命令复合成一个命令。另外,增加新的命令十分容易,隔离了现
有类的影响,今后,也可以与备忘录模式结合,实现 undo 等高级功能。
加入 TestSuite
的 TestCase
由 createTest(theClass, name) 方法创建,代码如下:
图 13. CreateTest 函数代码(查看大图)
TestSuite
和 TestCase 都有一个 fName 实例变量,是在其后的测试运行及结果返回阶
段中该 Test
的唯一标识,对 TestCase
来说,一般也是要测试的方法名。在 createTest 方法
中,测试方法被转化成一个 TestCase 实例,并通过:
((TestCase) test).setName(name);