2008-03-24

测试驱动?很傻很天真

关键字: tdd

我一直认为测试驱动开发可以保证质量,如果要保证质量也必须实行测试驱动开发。我也确实是这么做的,但是就在上个周末,我辛苦“经营”的测试驱动的项目已经倒下了。

 

就是在上个周五的下午,客户突然说要求改动,好家伙,这个改动实在是太大了,保守的估计也需要3-5天吧。可是客户竟然要求当天晚上必须全部修改完毕!

 

我简直要崩溃了,我怀疑客户到底是用什么部位在进行思考,看着新的需求,脑袋一团乱,怎么可能一个下午作完3-5天的活??

无奈归无奈,活还是要做滴。看着如此多,如此新的需求,我分析了半天,决定从其中一块开始入手。我打开了测试工程,在DataSet中增加了一个新的表,写了一个测试,然后运行测试..............天哪!竟然提示连接数据库错误!

怎么搞滴!赶紧看看吧,发现只有这新增加的表会出这个问题!此时忽然记起曾经有一位同仁修改过测试工程的配置。我的头大了!

 

众所周知,M$的产品一旦出现错误,就是那种千奇百怪,难以发现,折磨死人的错误。我分析,google解药,竟然找不到原因!

客户催得紧,这边VS又偏偏不争气,在我被郁闷了两个小时以后,终于无奈的决定,挥泪斩掉测试工程!

 

速度,客户要求的只有速度,我也一样。质量?见鬼去吧!

 

终于在凌晨12点的时候,我完成了1/3的需求。同时进行了“简单”的测试。到这个阶段,整个项目的1/3的代码已经被我修改了。我的心理实在没有底,只好请求另一个同仁能周六和我一起加班,他进行测试,我仍然进行修改。

 

就这样,目前的这个项目只用了短短的2天,就脱离了测试,脱离了持续集成。而当初,我们可是花了1个月时间来积累它的。

 

所以,正所谓形势比人强啊!我无奈了。

 

看着机器里的半死的测试工程,想想自己之前还很得意于项目的测试驱动和持续集成,突然觉得“很傻很天真”这个词是如此的亲切。

评论
passyt 2008-04-29
同情,很傻很天真
leon_a 2008-04-24
像这种业务逻辑复杂,式样变更较大而且而且开发测试时间明显不足的需求,两个人结对+关业务流程路径键测试覆盖,效果很不错,非关键的测试,只好慢慢补了
yananay 2008-04-07
我们的开发过程从根本上说,确实不是TDD,因为对日外包的项目,几乎不可能让你使用TDD的方式进行开发。但是为了保证质量,我只是使用了各种方式来无限接近这个目标。
但是,最后的时刻我被打败了,对于需求的修改,我已经没有时间从测试开始了。
javatar 2008-04-04
你描述的开发过程不是"测试驱动开发", 只能说你们在开发过程中使用了单元测试, 用例驱动开发,特征驱动开发等同样强调单元测试, 并不是说不是测试驱动开发就不做单元测试了.

测试驱动开发强调:
以测试作为项目的核心推动力,
没有测试就没有代码,
坚持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%的覆盖,
当有人修改任何一行代码, 测试用例都能感应到,
因为所有代码都是依着测试写出来的,
修改代码后能使测试用例通过, 就表示没问题.

通常在做核心产品时, 可能会采用"测试驱动开发",
普通业务项目这样开发成本太高.
skzr.org 2008-04-01
深度同情中,加油,我是搞java的觉得测试驱动还是非常的重要,不过感觉应用中确实太庞杂了,没有什么经验,经常是坚持了几天,然后又抛弃它,如此反复
发表评论

您还没有登录,请登录后发表评论

yananay
搜索本博客
我的相册
D35bafa8-5bf0-475f-aa06-16f3080557a1-thumb
tdd
共 3 张
存档
最新评论