本教程先讲解一个实际的例子,给大家一个感性的认识,然后再讲解具体的理论
例子
我们要写一个MathUtil类的一个add方法,方法接口设计如下:
class MathUtil
{
public static Object add(Object a, Object b);
}
要求能够处理以下情形:
a和b都是Integer类型
a和b都是String类型
不好的习惯
Object add(Object a, Object b)
{
return null;
}
这会留下隐患,除非你迫不得已,否则不要这样做。
测试驱动的方式
首先构建一个方法,确定接口
Object add(Object a, Object b)
{
throw new TODOException();
}
编写测试用例
void testAdd() throws Exception
{
Object left = new Integer(1);
Object right = new Integer(2);
Object result = MathUtil.add(left, right);
assertEqual(result, new Integer(3));
}
根据测试用例补充代码
这时,testAdd的测试方法是运行不通过的,怎么处理呢?答案很简单:
根据测试用例的运行结果补充代码!
进一步完善-代码
Object add(Object a, Object b)
{
if (a instanceof Integer && b instanceof Integer)
{
int leftVal = ((Integer)a).intValue();
int rightVal = ((Integer)b).intValue();
return new Integer(leftVal + rightVal);
}
throw new TODOException();
}
补充代码后的情况
补充完上面的代码后,已经能够Integer相加的情况,我们可以通过这种方式继续补充测试用例和实现代码。
简单总结
我们通过上面的例子看到,测试驱动的步骤是:
1、设计主要接口
2、编写测试代码
3、根据测试运行结果补充实现
循环2和3
注意点
- 使用TODOException处理未完成的部分
- 在编写代码时,注意代码执行路径的全集
- 在测试代码中,使用assert
- 功能完成后,可能要进一步进行代码优化
测试驱动和单元测试的区别
- 测试驱动:先设计主要接口,接着编写单元测试,根据测试结果补充代码实现
- 测试驱动是一个开发方法,而单元测试,只是一些对程序的测试代码,或者其它测试手段
为什么需要单元测试
1、复杂的系统,你也许一时难以下手,无法全面构建,测试驱动,使得你能够从容设计,自顶而下。最初设计主要的接口,不管具体的实现。2、这种开发方式,开发完成后,代码质量通常较好,而且很容易进行回归测试。
复杂的例子怎么办
答案是:没什么两样,例如:
String connString = "...";
IDbConnection conn = new SqlClientConnecion(connString);
conn.Open();
asertEquals(conn.State, ConnectionState.Open);
conn.close();
asertEquals(conn.State, ConnectionState.Close);
这个例子测试了Connection对象的状态转换。
转载自:http://www.cnblogs.com/jobs/archive/2004/08/13/33065.html