看到这个标题,很多人可能会疑惑。首先我来解释一下,什么叫测试环境初始化,它是指:在进行测试之前,将必要的数据进行准备。收尾则是对资源进行回收等操作。比如我们以I/0为例,假如现在有N个方法,然后以不同的文件对文件进行读取,打印其中的内容,并确定耗时,以完成这几种方式效率的对比。每次开始前,我们要得到系统当前时间,测试完以我们也要打印当前时间。这时,我们当然也可以在每个测试方法,开始和结束的地方进行打印,但是如果这些方法的个数很多,每个测试方法我们都要去修改,是不是很麻烦列? 那么这个时候你想到了什么? 面向切面编程AOP?是吗?
假如,每个测试方法在执行前都是会先执行一个指定的方法,在执行完毕后又会执行另外一个指定的方法,我们是不是就会省事列?还是那句话:你永远不会是第一个发现问题的。所以Junit提供了这种功能。
怎么做列?那就是重写TestCase的setUp()和tearDown()。setUp()进行的也就是我这里说的:初始化工作,而tearDown()进行的则是,我这里说的收尾工作。还是基于昨天的那个例子,假设我们要在测试开始前打印一句话,测试后,又打印一句话,该怎么写?来我们看代码说话:
import junit.framework.TestCase;
public class MyTestCase extends TestCase{
@Override
protected void setUp() throws Exception {
// TODO Auto-generated method stub
System.out.println("befor test ....");
}
@Override
protected void tearDown() throws Exception {
// TODO Auto-generated method stub
System.out.println("after test");
}
public void testAddition(){
assertEquals(5,MathTool.addition(2, 3));
}
}
Run as Junit 一下,看打印结果:
befor test ....
after test
那么现在有一个问题,假设我们有个多测试方法,那么setUp()和tearDown()会执行多少次列?让我们稍微修改一下代码,加多一个测试方法。修改后的代码如下:
import junit.framework.TestCase;
public class MyTestCase extends TestCase{
@Override
protected void setUp() throws Exception {
// TODO Auto-generated method stub
System.out.println("befor test ....");
}
@Override
protected void tearDown() throws Exception {
// TODO Auto-generated method stub
System.out.println("after test");
}
public void testAddition(){
assertEquals(5,MathTool.addition(2, 3));
}
public void testMoreTest(){
System.out.println("这是第二个测试");
}
}
再Run as Junit一下,看下测试结果:
befor test ....
after test
befor test ....
这是第二个测试
after test
现在应该一目了然吧,每个测试方法执行前,和执行都,Junit都会给你进行初始化工作和收尾工作。这样在很大程度上减轻了,我们代码书写量,有些同学可能会问,他是怎么实的列? 对不起,我滑看源码,我也不想去看,但凭经验来说,应该是反射+代理来实现。 至于具体怎么实现的,有兴趣的同学可以自己看源码,至于我,宁愿当他是个奇妙的事。
关于TestSuit 在第一章中已经提及过,我没打算讲它。有兴趣的朋友可能自己查一下。至此,对3.x的介绍我想应该就划上一个句号。在接下来的一章开始,将讲解Junit4.0的新特性-----纯POJO的,基于注解的测试用例。