之前的同一系列文章Android开发中的单元测试-初级教程(01)、Android开发中的单元测试-初级教程(02)讲述了Android中使用JUnit实现单元测试的例子,那么我们现在需要通过回顾知识点来理解我们的例子(注意,这里相当多的概念引用到了百度百科当中的描述):

单元测试

单元测试是在软件开发过程中要进行的最低级别的测试活动,在单元测试活动中,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。 单元测试不仅仅是作为无错编码一种辅助手段在一次性的开发过程中使用,单元测试必须是可重复的,无论是在软件修改,或是移植到新的运行环境的过程中。因此,所有的测试都必须在整个软件系统的生命周期中进行维护。


简单的说,单元测试是为了测试我们的一个class是否有错误的一种辅助手段,我们通过编写单元测试中的每一个Test Case来检查我们的每一个method。为了不影响测试类,一般我们通过建立另一个Test Class来检测我们的被测试类。

JUnit

JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework)。Junit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件

如何(How)完成功能和完成什么样(What)的功能。


简单的说,JUnit是一个测试框架,这里的目的主要是为了帮助我们进行单元测试。


由于Android不支持JUnit 4,那么好多注释方面的内容(annotation)我们不需要讲,直接看测试结果:



/**
 * 
 */
package com.freesoft.demo.utils;

import android.test.AndroidTestCase;
import android.util.Log;

/**
 * @author Sandy
 *
 */
public class MathUtilTest extends AndroidTestCase {
	
	private static MathUtil mu = new MathUtil();
	private static String TAG = "MathUtilTest";

	/* (non-Javadoc)
	 * @see android.test.AndroidTestCase#setUp()
	 */
	protected void setUp() throws Exception {
		super.setUp();
		Log.v(TAG, "setUp");
	}

	/* (non-Javadoc)
	 * @see android.test.AndroidTestCase#tearDown()
	 */
	protected void tearDown() throws Exception {
		super.tearDown();
		Log.v(TAG, "tearDown");
	}

	/**
	 * Test method for {@link com.freesoft.demo.utils.MathUtil#add(int, int)}.
	 */
	public void testAdd() {
		int result = mu.add(2, 1);
		
		assertEquals(3, result);
	}

	/**
	 * Test method for {@link com.freesoft.demo.utils.MathUtil#sub(int, int)}.
	 */
	public void testSub() {
		int result = mu.sub(2, 1);
		
		assertEquals(1, result);
	}

	/**
	 * Test method for {@link com.freesoft.demo.utils.MathUtil#mul(int, int)}.
	 */
	public void testMul() {
		int result = mu.mul(2, 1);
		
		assertEquals(2, result);
	}

	/**
	 * Test method for {@link com.freesoft.demo.utils.MathUtil#div(int, int)}.
	 */
	public void testDiv() {
		int result = mu.div(2, 1);
		
		assertEquals(2, result);
	}

	/**
	 * Test method for {@link com.freesoft.demo.utils.MathUtil#div(int, int)}.
	 */
	public void testDivByZero() {
		try {
			int result = mu.div(2, 0);
			assertEquals(2, result);
		} catch (ArithmeticException e) {
			assertTrue(true);
		}		
	}
	
	/**
	 * Test method for {@link com.freesoft.demo.utils.MathUtil#mod(int, int)}.
	 */
	public void testMod() {
		int result = mu.mod(2, 1);
		
		assertEquals(0, result);
	}

}




从以上可以看出:


  1. 所有的测试方法以"test"作为前缀;(需要JUnit 4支持@Test标识测试方法)
  2. 测试方法以一个(或多个)assert来判断测试方法是否执行成功;
  3. 每个测试方法执行前将执行setUp方法,每个方法执行完毕将执行tearDown方法;(需要 JUnit 4支持 @Before、@After、@BeforeClass、@AfterClass)
  4. 对于异常处理,这里使用try...catch来将可能出现exception的地方包含进来,并且使用assertTrue来提示框架测试成功通过;(需要JUnit 4支持@Test (ArithmeticException.class)这样的形式)
  5. 对于暂时不想进行的case,使用注释处理掉,或者不要使用“test”前缀开头;(需要JUnit 4支持@Ignore)
  6. 暂不支持测试方法的超时时间;(需要JUnit 4支持@Test(timeout = 1000))