之前对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会使测试立即失败,通常放在测试所不能到达的地方。
参考:
1.JUnit工具使用
2.Eclipse下用Ant运行JUnit