追求代码质量 - 亲身体验行为驱动开发 - 编程入门网
追求代码质量 - 亲身体验行为驱动开发时间:2010-12-12 IBM Andrew Glover显然,测试本身是件好事。而在早期进行测试 — 例如在编写代码时 — 则 更有益处,这特别有利于提高代码质量。在开发早期编写测试,您将获益良多。 您能够检查代码的行为,并预先对它进行调试,这种动力无疑是巨大的。 即使了解了这种重要性,我们也没有达到关键的一点:使在编写代码之前 编 写测试成为一种标准实践。正如 TDD 是极限编程(Extreme Programming)的下 一个演化阶段(后者推出了单元测试框架),以 TDD 为基础,新的飞跃也将到 来。本月,我邀请您和我一起实现从 TDD 到更具直观性的行为驱动测试(BDD) 的演化。 行为驱动开发 虽然测试优先编程对于有些人比较管用,但是并不适用于每一个人。虽然有 的应用程序开发人员狂热拥护 TDD,但也有人坚决抵制它。即使现在已经有了很 多测试框架,例如 TestNG、 Selenium 和 FEST,但不对 代码进行测试的理由 仍然充分。 不采用 TDD 的两个常见理由是 “没有足够的时间进行测试” 和 “代码太 复杂,难以测试”。测试优先编程的另一个障碍是测试优先概念本身。很多人把 测试看作一种反应型活动,仅比抽象具体一点。经验告诉我们,不能测试不存在 的东西。对于某些开发人员来说,对于这种概念框架,测试优先 是一种矛盾的 说法。 但是,如果不考虑编写测试和如何测试,而是考虑行为,结果会如何呢?这 里所说的行为,是指一个应用程序应该 如何运行 — 实际上就是指它的规范。 实际上,您已经想到了这种方法。我们都想到过。请看下面的对话。 Frank: 什么是栈? Linda: 它是一种数据结构,按先进后出(或后进先出 )的方式收集对象。它通常有一个 API,其中包括 push() 和 pop() 等方法。 有时也有 peek() 方法。 Frank: push() 有什么功能? Linda: push() 接 受一个输入对象,比如说 foo,并将它放入到一个内部容器(例如一个数组)中 。push() 通常不返回结果。 Frank: 如果我 push() 两个对象,比如先是 foo,然后是 bar,结果会怎样? Linda: 第二个对象 bar 应该在栈(至少包 含两个对象)的顶部,所以如果调用 pop(),那么返回的应该是 bar,而不是 foo。如果再次调用 pop(),那么应该返回 foo,然后栈为空(假设在添加这两 个对象之前栈中没有对象)。 Frank: 也就是说,pop 移除最近放入栈中的项 目? Linda: 是的,pop() 应该移除最上面的项目(假设栈中还有可移除的项 目)。peek() 与此类似,只是不移除栈中的对象。peek() 应该保留栈顶的项目 。 Frank: 如果之前没有 push 任何项目,那么调用 pop() 时会怎样? Linda: pop() 应该抛出一个异常,表明栈中尚未 push 任何项。 Frank: 如果 push()null 会怎样? Linda: 栈应该抛出一个异常,因为 null 不是一 个有效的可 push() 的值。 在这段对话中,有没有注意到什么特别的地方呢(除了 Frank 不是计算机科 学专业的)?这里从头到尾没有用到 “测试” 这个词。但是, “应该” 这个词却非常自然地随处闪现。 怎么做才自然? 我应该使用哪种框架? 由于注释(annotation)的缘故,可以使 用 JUnit 和 TestNG 来实践 BDD。我发现使用 JBehave 之类的 BDD 框架更加 有趣,因为它提供了定义行为类的特性,例如异常框架 便于实现更具文学风格 的编程。 BDD 并不是什么新生事物,更不具备什么革命性的突破。它只 是 TDD 的一个分支,其中 “测试” 这个词换成了 “应该 ”。除了语义,很多人还发现,与测试 概念相比,应该 这个概念是一种 更自然的开发驱动因素。考虑行为(应该)会自然而然地促使您先编写规范类, 而后者可以成为一个非常有效 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |