- 0
- 0
- 约2.1万字
- 约 28页
- 2017-02-06 发布于湖南
- 举报
beautifulteststhatpeskybinarysearch
美丽测试 讨厌的二分查找
第7章 美丽测试
Alberto Savoia
许多程序员都有过这样的经历:看一段代码,觉得它不仅实现了功能,而且实现得很漂亮。通常,如果一段代码能优雅、简洁地完成了需要完成的功能,我们就认为这样的代码很漂亮。
那对于漂亮代码的测试,尤其是那种开发者在编写代码的同时编写的(或者应该编写的)测试,情况又是怎样的呢?在这一章,我将专注于讨论测试,因为测试本身也可以是漂亮的。更重要的是,它们能起到非常关键的作用,可以帮你写出更漂亮的代码。
正如我们将要看到的,有些东西,如果把它们组合起来会使测试很漂亮。跟代码不同的是,我无法让自己认为某个单一的测试很漂亮,至少跟我看待一个排序函数,并认为它漂亮的情况不一样。原因是测试天生就带有组合性和试探性。代码中的每一条if语句至少需要两个测试(一个用于条件表达式为真的情况,另一个用于为假的情况)。一条拥有多个条件的if语句,比如:
if ( a || b || c )
理论上需要8个测试——每一个对应a、b和c不同值的一个可能的组合。如果再考虑循环中的异常,多个输入参数,对外部代码的依赖,不同的软硬件平台等,所需测试的数量和类型将大大增加。
除了最简单的情况,任何代码,不管漂亮与否,都需要一组(而不是一个)测试,这些测试中的每一个都应该专注于检查代码的一个特定的方面,就像球队一样,不同的队员有不同的职责,负责球场的不同区域。
我们已经知道应该以“组”为单位来对测试进行整体评估,现在我们需要进一步了解都有哪些特性能决定一组测试是否漂亮——“漂亮”,一个很少用来修饰“测试”的形容词。
一般来讲,测试的主要目的是逐步建立,不断加强并再次确认我们对于代码的信心:即代码正确并高效地实现了功能。因此对我来讲,最漂亮的测试是那些能将我们的信心最大化的测试,这个信心就是代码的确实现了它被要求的功能,并将一直保持这一点。由于代码不同方面的属性需要不同类型的测试来验证,所以对于“漂亮”的评判准则也不是固定的。本章考查了能使测试漂亮的三种方法。
测试因简单而漂亮
简单的几行测试代码,使我能描述并验证目标代码的基本行为。通过在每次构建时自动运行那些测试,能确保代码在不断开发的过程中始终保持所要求的行为。本章将使用JUnit测试框架来给出一些比较基本的测试例子,这些只需几分钟就能编写的测试,将在项目的整个生命周期中使我们不断受益。
测试因揭示出使代码更优雅,更可维护和更易测试的方法而漂亮
换句话讲,测试能帮我们把代码变得更漂亮。编写测试的过程不仅能帮我们找出实现中的逻辑错误,还能帮我们发现结构和设计上的问题。在这一章,通过尝试编写测试,我将演示我是怎样找到了一种能使我的代码更健壮、更有可读性、结构也更好的方法的。
测试因其深度和广度而漂亮
深入彻底、覆盖无遗的测试会大大增强开发者的信心,这种信心就是代码不仅在一些基本的、手工挑选的情形下,而且在所有的情形下都实现了所需的功能。在这一章,我将演示怎样根据测试理论中的概念来编写和运行这类测试。
由于大多数程序开发者都已经熟悉了诸如冒烟测试(smoke testing)和边界测试(boundary testing)等基本的测试技术,我将花更多的时间来讨论更有效类型的测试和那些很少被讨论和应用的测试技术。
7.1 讨厌的二分查找
为了演示多种不同的测试技术,同时又保持本章的篇幅合理,需要一个简单、易描述,并能通过几行代码就能实现的例子。同时,这个例子还必须足够生动,拥有一些有趣的挑战测试的特性。最理想的情况是这个例子要有一个悠久的总是被实现出许多bug的历史,从而显出对彻底测试的迫切需要。最后但并非最不重要的一点:如果这个例子本身也被认为是漂亮的代码那就再好不过了。
每当讨论漂亮的代码,就很容易让人联想起Jon Bentley那本经典的由Addison-Wesley出版的《Programming Pearls》 (中文名《编程珠玑》,译者注)。我就是在读那本书的时候,发现了我要找的代码例子:二分查找。
让我们快速复习一下,二分查找是一个简单而又高效的算法(但我们即将看到,要正确实现它也是有点难度的),这个算法用来确定一个预先排好顺序的数组x[0..n-1]中是否含有某个目标元素t。如果数组包含t,程序返回它在数组中的位置,否则返回-1。
Jon Bentley是这样向学生们描述该算法的:
在一个包含t的数组内,二分查找通过对范围的跟综来解决问题。开始时,范围就是整个数组。通过将范围中间的元素与t比较并丢弃一半范围,范围就被缩小。这个过程一直持续,直到在t被发现,或者那个能够包含t的范围已成为空。
他又说到:
大多数程序员认为,有了上面的描述,写出代码是很简单的事情。他们错了。能使你相信这一点的惟一方法是现在就合上书,去亲手写写代码试试看。
您可能关注的文档
- 2007年度安徽建筑业技能大赛理论考试复习题.doc
- 2010-2013年汽车(齿轮箱)变速箱行业研究报告.doc
- 2010年度中国内衣市场调查总报告.doc
- 2013~2014年度第一批中国安装工程优质奖(中国安装之星).doc
- 2013年c语言期末试题(a).doc
- 2013年7月至2014年1月全国各地历史新题分解(人教版必修3分课汇总).doc
- 2015年防汛积水隐患排查表.doc
- 2015年考研数学模拟试题(数学三).doc
- 2017年上半年氧气乙炔胶管及三角带即时供应招标公告.doc
- a1传统经典--山东全线.doc
- 2025-2026学年天津市和平区高三(上)期末数学试卷(含解析).pdf
- 2025-2026学年云南省楚雄州高三(上)期末数学试卷(含答案).pdf
- 2025-2026学年甘肃省天水市张家川实验中学高三(上)期末数学试卷(含答案).docx
- 2025-2026学年福建省厦门市松柏中学高二(上)期末数学试卷(含答案).docx
- 2025-2026学年广西钦州市高一(上)期末物理试卷(含答案).docx
- 2025-2026学年河北省邯郸市临漳县九年级(上)期末化学试卷(含答案).docx
- 2025-2026学年河北省石家庄二十三中七年级(上)期末历史试卷(含答案).docx
- 2025-2026学年海南省五指山市九年级(上)期末化学试卷(含答案).docx
- 2025-2026学年河北省唐山市玉田县九年级(上)期末化学试卷(含答案).docx
- 2025-2026学年河北省邢台市市区九年级(上)期末化学试卷(含答案).docx
原创力文档

文档评论(0)