测试驱动?很傻很天真
关键字: tdd我一直认为测试驱动开发可以保证质量,如果要保证质量也必须实行测试驱动开发。我也确实是这么做的,但是就在上个周末,我辛苦“经营”的测试驱动的项目已经倒下了。
就是在上个周五的下午,客户突然说要求改动,好家伙,这个改动实在是太大了,保守的估计也需要3-5天吧。可是客户竟然要求当天晚上必须全部修改完毕!
我简直要崩溃了,我怀疑客户到底是用什么部位在进行思考,看着新的需求,脑袋一团乱,怎么可能一个下午作完3-5天的活??
无奈归无奈,活还是要做滴。看着如此多,如此新的需求,我分析了半天,决定从其中一块开始入手。我打开了测试工程,在DataSet中增加了一个新的表,写了一个测试,然后运行测试..............天哪!竟然提示连接数据库错误!
怎么搞滴!赶紧看看吧,发现只有这新增加的表会出这个问题!此时忽然记起曾经有一位同仁修改过测试工程的配置。我的头大了!
众所周知,M$的产品一旦出现错误,就是那种千奇百怪,难以发现,折磨死人的错误。我分析,google解药,竟然找不到原因!
客户催得紧,这边VS又偏偏不争气,在我被郁闷了两个小时以后,终于无奈的决定,挥泪斩掉测试工程!
速度,客户要求的只有速度,我也一样。质量?见鬼去吧!
终于在凌晨12点的时候,我完成了1/3的需求。同时进行了“简单”的测试。到这个阶段,整个项目的1/3的代码已经被我修改了。我的心理实在没有底,只好请求另一个同仁能周六和我一起加班,他进行测试,我仍然进行修改。
就这样,目前的这个项目只用了短短的2天,就脱离了测试,脱离了持续集成。而当初,我们可是花了1个月时间来积累它的。
所以,正所谓形势比人强啊!我无奈了。
看着机器里的半死的测试工程,想想自己之前还很得意于项目的测试驱动和持续集成,突然觉得“很傻很天真”这个词是如此的亲切。
评论
但是,最后的时刻我被打败了,对于需求的修改,我已经没有时间从测试开始了。
测试驱动开发强调:
以测试作为项目的核心推动力,
没有测试就没有代码,
坚持KISS法则(Keep It Simple, Stupid), 以最简单,最愚蠢的方式实现.
所有代码通过测试就算完成.
坚持小步前进, 测试->重构->测试->重构....
等等.
假设一个需求: 实现数字相加
采用"测试驱动开发"的过程大体是:
定义接口:
public interface Arithmetic {
int add(int x, int y);
}
工具生成实现Stub:
public class ArithmeticImpl {
public int add(int x, int y) {
throw new UnsupportedOperationException();
}
}
写测试用例:
public class ArithmeticTestCase extends TestCase {
private Arithmetic arithmetic;
public void setUp() throws Exception {
arithmetic = new ArithmeticImpl();
}
public void testAdd() {
assertEquals(2, arithmetic.add(1, 1));
}
}
运行测试, 失败. 因为实现类直接抛出异常.
为了测试通过, 修改实现类:
public class ArithmeticImpl {
public int add(int x, int y) {
return 2;
}
}
运行测试, 成功! (并且是采用了最简单的方法使测试通过)
但实现类正确吗? 不正确, 表示测试用例不全面, 完善测试用例:
public class ArithmeticTestCase extends TestCase {
private Arithmetic arithmetic;
public void setUp() throws Exception {
arithmetic = new ArithmeticImpl();
}
public void testAdd() {
assertEquals(2, arithmetic.add(1, 1));
assertEquals(3, arithmetic.add(1, 2));
assertEquals(0, arithmetic.add(0, 0));
}
}
运行测试, 失败.
为了测试通过, 修改实现类:
public class ArithmeticImpl {
public int add(int x, int y) {
return x + y;
}
}
运行测试, 成功!
......
为什么这么麻烦的测? 还故意写错?
这里的目标是使测试用例100%的覆盖,
当有人修改任何一行代码, 测试用例都能感应到,
因为所有代码都是依着测试写出来的,
修改代码后能使测试用例通过, 就表示没问题.
通常在做核心产品时, 可能会采用"测试驱动开发",
普通业务项目这样开发成本太高.
发表评论
- 浏览: 135181 次

- 详细资料
搜索本博客
我的相册
共 3 张
最新评论
-
TDD,想说爱你不容易
stevenwang 写道这个论题我喜欢。 早想写一点文字,来纪念我TDD的失 ...
-- by kozyan -
测试驱动?很傻很天真
同情,很傻很天真
-- by passyt -
BNF范式
确实很有兴趣,刚刚学习完状态机的部分,对比一下CT中状态机的实现,很有收获
-- by yananay -
BNF范式
看来你对编译知识很有兴趣, 希望你能有所突破. BNF本身并不复杂, 只是表达 ...
-- by javatar -
CT中表达式处理的思考
你考虑的很对, 当时设计时, 我也考虑过这个问题, 在编译原理中, 通常都会把" ...
-- by javatar






评论排行榜