一.关于Junit
关于为什么junit.jar包不能放到lib/ext目录中:
先谈谈类装载器
java虚拟机和程序都调用ClassLoader类的loadClass的方法来加载。java虚拟机中可有多个类加载器,bootstrap来加载rt.jar(java核心包),ExtClassLoader加载<JAVA_HOME>/jre/lib/ext装载jar包,AppClassLoader加载classpath环境变量指定的路径中的类。ExtClassLoader是AppClassLoader的父类。
再说junit.jar为什么不能放到lib/ext目录下的原因:
现在如果把junit.jar包放到ext目录下,ExtClassLoader类装载器要把junit.jar先装载,junit然后要去调用那个被测试类,然而那个被测试类是放在classpath中,被AppClassLoader装载,因为ExtClassLoader是AppClassLoader的父类,AppClassLoader已经装载了被测试类,ExtClassLoader并不知道APP已经装载了这个类,它还要去装载被测试类,结果找不到这个类。会抛出异常了。但是如果把被测试类也打包为jar包放到ext目录底下应该没问题了,但这样做单元测试的时候是不是比较麻烦?
Junit作为一个单元测试工具,在保证代码的质量上,起到比较重要的作用.我们使用的为Junit3.8.1版本,用的时候需要把junit.jar添加到项目编译和运行的classpath中,在简单的Junit方式中,我们将所有的测试放到TestCase的子类中, 每个测试必须是public,不接受任何参数,返回void,并且以一个"test"开头的方法名(佳实践,Junit鼓励你这么做).传统情况下,setUp()方法创建一个对象的通用集合并将其初始化,这些对象在所有的测试中都将被用到.setUp()与构造方法的区别是:setUp()在每次测试前被调用.测试完之后,再调用tearDown()方法(可选)在每次测试后执行清除工作.
使用Junit的好处:
1、对于xp编程而言,要求在编写代码之前先写测试,这样可以强制你在写代码之前好好的思考代码(方法)的功能和逻辑,否则编写的代码很不稳定,那么你需要同时维护测试代码和实际代码,这个工作量会大大增加。因此在xp编程中,基本过程是这样的:构思-》编写测试代码-》编写代码-》测试,而且编写测试和编写代码都是增量式的,写一点测一点,在编写以后的代码中如果发现问题可以较块的追踪到问题的原因,减小回归错误的纠错难度
2、对于重构而言,其好处和xp编程中是类似的,因为重构也是要求改一点测一点,减少回归错误造成的时间消耗。
3、对于非以上两种情况,我们在开发的时候使用junit写一些适当的测试也是有必要的,因为一般我们也是需要编写测试的代码的,可能原来不是使用的junit,如果使用 junit,而且针对接口(方法)编写测试代码会减少以后的维护工作,例如以后对方法内部的修改(这个是相当于重构的工作了)。另外是因为junit有断言功能,如果测试结果不通过会告诉我们那个测试不通过,为什么,而如果是想以前的一般做法是写一些测试代码看其输出结果,然后再由自己来判断结果使用正确,使用junit的好处是这个结果是否正确的判断是它来完成的,我们只需要看看它告诉我们结果是否正确可以了,在一般情况下会大大提高效率。
如何使用JUnit写测试?
简单的范例如下:
1、创建一个TestCase的子类:
package junitfaq;
import java.util.*;
import junit.framework.*;
public class SimpleTest extends TestCase {
public SimpleTest(String name) {
super(name);
}
2、写一个测试方法断言期望的结果:
public void testEmptyCollection() {
Collection collection = new ArrayList();
assertTrue(collection.isEmpty());
}
注意:JUnit推荐的做法是以test作为待测试的方法的开头,这样这些方法可以被自动找到并被测试。
3、写一个suite()方法,它会使用反射动态的创建一个包含所有的testXxxx方法的测试套件:
public static Test suite() {
return new TestSuite(SimpleTest.class);
}
4、写一个main()方法以文本运行器的方式方便的运行测试:
public static void main(String args[]) {
junit.textui.TestRunner.run(suite());
}
}