这两天花了点时间把junit的源码看了看,把看后的想法总结在这里,说实在的junit的内容真很少,但是确有这么大的影响里,呵呵,只能说它
做的对了。
因为我比较懒,而且对swing的东西不是太熟悉,所以我只看了junit.framework.*,junit.runner.*,junit.extensions.*,junit.textui.*,我想
这样也就差不多了。
我先大体的说说,首先你生成一个runner,这个runner调用run方法,run的参数是个suite对象,run方法最终会调用suite的run方法,run方法会将调用
信息写到TestResult中(Colleting Parameter),最后使用TestListener将TestResult中的信息打印出来,觉得过程还是很简单的。
然后说说一个重要的部分就是Test,TestCase,TestSuite的关系,首先TestCase和TestSuite都实现了Test接口,这个接口中最重要的方法当然是
run,他们构成了composite模式 ,TestCase是leaf,而TestSuite就是composite,当你调用suite的run方法时他会迭代内部所有的Test(放在一个Vector中)调用相应的run方法
,而如果这个Test是一个TestCase类型的它就调用起相应名称的一个test**方法,而如果这个Test是一个TestSuite对象将对调用TestSuite的run方法
进而继续迭代调用其内部的Test,还有一点要说明的当你实现了一个TestCase对象,它只代表一个test**方法,就是构造函数传来的name参数对应的
方法,虽然你的所有测试方法都写在一个TestCase的子类中,但是一个对象只对应一个test**方法.
接着我要说的就是assert,我们知道test**方法中就是一些asert**方法,可以说测试方法的单元就是这些断言,看过源码后会觉得它的实现相当的简单
就是测试是否满足一定的条件,如果不满足则抛出AssertionFailedError,不知道为什么老大要用Error也许是这样写程序方便,不用随时捕获它吧
如果抛出异常则会封装成TestFailure存到TestResult中(而且也要存到TestListener中).
junit.runner.*是测试用例运行时需要的环境,这里包括最重要的BaseTestRunner,几个自定义的ClassLoader,几个TestCollector,一个快速排序的助手类
还有一些无关紧要的东西。
junit.extensions.*中时一些对TestSuite的扩展类它们为某些需求提供了快速实现。
junit的实现很简单就是用了些反射,同步,还有一些面向对象的技巧,但是它提供了一个runner,为测试代码创建了一个运行环境,这个倒是
个不错的想法,好像sun对容器的使用是很常规的思想,总之要比在manin函数中粗糙的测试要好的多,但我觉得也没有必要神话它吧,起码我觉得
可以作出比他更好的东西,不过简单也的确是它快速推广的原因。
package lq.mytest.test;
import junit.framework.*;
public class KkTest extends TestCase{
public KkTest(); {}
public KkTest(String name); {
super(name);;
}
public void setUp(); {
}
public void teatDown(); {
}
public void testA(); {
assertEquals(1, 1);;
}
public void testB(); {
assertTrue(true);;
}
public static TestSuite suite(); {
//将KkTest类中的所有test方法加到suite中
//TestSuite suite = new TestSuite(KkTest.class);;
TestSuite suite = new TestSuite();;
//使用内省调用testA();
suite.addTest(new KkTest("testA"););;
//使用匿名内部类,重写了runTest方法,直接调用testB方法,而
//不用内省,这样是一种提高效率的方法
suite.addTest(new KkTest("testB"); {
public void runTest(); {
testB();;
}
});;
return suite;
}
public static void main(String[] args); {
//测试全部
//junit.textui.TestRunner.run(KkTest.class);;
junit.textui.TestRunner.run(suite(););;
}
}