之前对JUnit工具使用[1]进行了学习,对Eclipse下用Ant运行JUnit[2]进行了测试。这里深入理解下JUnit的具体使用方法。
Junit是一个回归测试框架(regression testing framework),是程序员测试,也就是所说的白盒测试。在白盒测试中,测试人员知道程序如何实现,也知道他们所具有的功能。这个框架继承自TestCase类,可以自动测试,具有批量测试的功能。在TDD(测试驱动开发)中,测试代码甚至可以先于实际代码编写。
由于在Eclipse中集成了JUnit,所以不需要再下载。Eclipse中集成的JUnit分为第三版和第四版两种,对同一个代码math.java这两种测试方法自动生成的代码分别如下:
math.java代码:
package www.gongqingkui.cn;
public class math {
public int add(inta,int b){return a+b;}
public int sub(inta,int b){return a-b;}
}
生成测试代码架构有两种方法,第一种是直接右击新建Junit test case,第二种是从文件->新建->other->JUnit test case。
生成的JUnit3测试代码:
package www.gongqingkui.cn;
import junit.framework.TestCase;
public class mathTest extends TestCase {
private math m;
protected void setUp()throws Exception {
m = newmath();
}
protected voidtearDown() throws Exception {
m = null;
}
public void testAdd(){
assertEquals(2,m.add(1, 1));
}
public void testSub(){
//fail("fail");
assertEquals(1,m.sub(4, 2));
}
}
生成的JUnit4测试代码:
package www.gongqingkui.cn;
import static org.junit.Assert.*;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
public class mathTest {
private math m;
@BeforeClass
public static voidsetUpBeforeClass() throws Exception {
}
@AfterClass
public static voidtearDownAfterClass() throws Exception {
}
@Before
public void setUp()throws Exception {
m = newmath();
}
@After
public void tearDown()throws Exception {
m = null;
}
@Test
public void testAdd(){
assertEquals(2,m.add(1,1));
}
@Test
public void testSub(){
assertEquals(2,m.sub(3,1));
}
}
JUnit初始化流程是:测试开始->setUp->testAdd方法->tearDown->测试完成。注意这里的setUp方法和tearDown方法常用于初始化测试环境。需要注意的是每一个测试开始和结束时,都需要调用这两个方法。本例中我们修改了代码,在setUp中新建了待测试对象,在tearDown中对它进行清理。一个JUnit3的测试类通常是这样:继承自TestCase类,定义了一些列以test开头的方法,内部有一些assert断言。JUnit4的测试类采用了Java的新特性,可以不用test开头,一些方法也不用固定的名字,而是使用例如@Test这样的方法。在JUnit4中,有了BeforeClass和AfterClass两个函数,这两个函数不同于setUp和tearDown方法,他只是在整个类开始执行和执行完成后才运行,节省了对堆栈内存操作的时间。
JUnit3有一个TestSuit类,可以把一组测试结合起来,我们新建JUnitTestSuite就可以将上述过个测试和成为一个测试了。例如本例我们又新建了另一个测试文件mathTest2.java,其代码和mathTest.java一致。新建JUnitTestSuite时,就可以直接将测试类加入其中,一次运行完成所有测试。
package www.gongqingkui.cn;
import junit.framework.Test;
import junit.framework.TestSuite;
public class AllTests {
public static Testsuite() {
TestSuitesuite = new TestSuite("Test for www.gongqingkui.cn");
//$JUnit-BEGIN$
suite.addTestSuite(mathTest.class);
suite.addTestSuite(mathTest2.class);
//$JUnit-END$
return suite;
}
}
JUnit中常用的断言有:assertEquals用于判断是否相等,其第一参数消息是可选的。AssertTrue是判断布尔值是否为真的,与其对应的是assertFalse判断布尔值是否为假,类似assertNull用于判断是对象否为空,assertSame用于判断对象是否是指向同一个的,Fail会使测试立即失败,通常放在测试所不能到达的地方。
参考: