|
近来开发过程中接触了一个叫做测试驱动开发的东东,虽然说测试这个部分的工作是测试工程师的工作,但是作为一个程序员,学习测试驱动开发也是提高个人开发效率的一个办法。学校图书馆关于这方面的书籍少之又少,我找了一个下午才找到一本。测试驱动开发使用的工具:java使用的JUnit,其它开发语言也有对应的。JUnit在eclipse有带,如果使用其它开发工具的话就需要自己去下载咯。
先讲解一个实际的例子,给大家一个感性的认识,然后再讲解具体的理论。
例子:
我们要写一个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对象的状态转换。 |
|