当设计大型程序的时候,您必须时刻留心不同设计选项对诸如性能和可扩展性这样的特征的影响。随着软件产品的日渐复杂及其无所不在的部署,软件的“可测试性”也成了更重要的考虑事项。
彻底测试代码的重要性是显然的。花在编写测试和测试代码上的时间和精力给您带来的回报是维护成本的大幅降低。
然而,除非您很小心,否则您花在测试代码上的精力可能会首先达到花在编写代码上的精力的几倍!我曾看到程序员们齐心协力地对他们的全部代码进行单元测试,结果花在上面的时间使大多数人都以沮丧而告终。
幸运的是,没有必要这样。在您设计软件的时候应用一些基本原则,编写易于测试、甚至使测试成为乐趣的代码是可能的。
跟其它编码原则一样,这些原则也不是不容置疑或不可改变的教条。有时候打破这些规则也是必要的。因此,理解每条原则背后的动机和判断何时这些动机不适用(或应让位给更关心的问题)的能力是很重要的。
原则1:到GUI视图的外面去
尽可能把代码移到GUI视图的外面。然后各种GUI动作就能成了模型上的简单方法调用。为什么您需要这样做呢?
对GUI测试者来说,通过方法调用测试功能比间接地测试功能容易的多。
另一个好处是它使修改程序功能而不影响视图变的更容易。
当然,视图中也可能存在错误。在理想情况下,对程序的测试将同时检查模型和视图。
原则2:使用类型进行错误检查
类型是您的朋友 — 尽可能多地用类型系统自动检查错误。
类型能在程序运行之前自动捕捉程序中的错误。没有静态类型检查的话,类型错误将作为破坏者逗留在您的程序中,直到恰当的执行路径碰巧把它揭露出来为止。
最大限度地发挥使用类型的长处是棘手的。通常,一组数据结构可以在一个抽象级别上一起使用,或者被分出,成为一个单一的、更高抽象级别的一个新的相关数据类型。
事实上,编程语言自身的历史可以看成是可以编程的抽象级别的逐渐提高。汇编语言提供了比特到整数和浮点数的抽象。接下来是记录和函数抽象,然后又是诸如对象、类、线程以及异常这样的抽象。
在每一抽象级别上,达到与更高级别抽象一致的功能是可能的,但那实质上仅仅是耗费更多精力,冒更多的错误风险。
在面向对象语言(其它现代语言也一样)中,一个程序员在设计抽象上有很大的灵活性。在哪个抽象级别上设计程序就成了基于折衷的决定,比如由抽象级别提供的更多的健壮性和由于不能在更低抽象级别上工作而带来的表达性(有时是性能)的损失。
通常,高级别抽象带来的健壮性和简单性的价值很少被其它考虑事项超过。
原则3:使用调节器避免“故障线路”(fault line)
我用“故障线路”来指独立组件之间的接口,独立组件之间和组件与其相应子组件之间相比,很少有交互。这种故障线路的一个典型示例是 GUI 视图和它的模型之间的接口。其它示例包括在编译器中处理的不同阶段之间的接口或操作系统的内核和用户界面之间的接口。
找出程序的故障线路,然后用具有转发功能的调节器快速访问聚合组件。
沿着故障线路隔离测试每个组件通常更容易。但如果每个组件暴露的对象有很多,或者组件中您想测试的一些对象只有通过多个嵌套引用才能访问,那么测试就会变的很乏味。
不用隔离测试,而是拥有您在它上面调用您想测试的各种方法的单个调节器对象通常是有帮助的。这个对象然后能把这些方法调用转发到适当的地方。
沿着相同线路,设计和自己的测试代码串联在一起的程序组件接口是有益的。这将使您把注意力集中在使这些接口尽可能简单上。
原则4:方法:小型签名和缺省参数
使用小型方法说明和重载带缺省方法参数的方法将使您在测试中调用这些方法变的愉快的多。否则,在测试这些方法时您将不得不构造额外参数。如果参数很大,那么将很快导致代码膨胀。更糟的是,它会诱使您编写比在其它情况下更少的测试。
原则5:访问器不应修改内存状态
请在您的测试中使用不修改内存状态的访问器来检查对象状态。
在某些方面,测试和实验室试验相似。它们都想证明特定假设有效。如果特定检查动作改变了该领域的状态,那么要这样做会变得困难的多。
与量子力学领域不同,计算机进程的状态可以不修改就被检查。使用这种原则对您有好处。
原则6:用接口说明外部程序组件
用接口说明外部程序组件使得我们可以容易地在测试案例中模拟这些组件。
这条原则能节省大量时间,特别是当外部组件的实现还未完成时。通常,大多数基本组件都不能准时可用。如果这些组件不在适当位置您就不能测试您自己的代码的话,那么您就在朝灾难走去。您的客户不会关心您只有两个小时来集成迟到了两周的组件。他们知道的全部就是整套产品被延期了和这是违约的。
原则7:优先编写测试代码
优先编写测试代码。这是标准的XP方法,但却总有一种忽视它的诱惑。
每次我屈服于这种诱惑时,我都感到后悔。假设您正努力生产正确的代码,那么您好象能从推迟编写测试代码中节省的时间其实只是一个幻想。
注意:这不是说您应该一次性编写全部测试代码后,再一次性全部实现。编写一些测试代码,实现它们,再编写一些测试代码,再实现它们等等是个更好的办法。设计以这种方式得以进展;在实现阶段捕捉错误并在下一组测试中改正它。以这种方式编写测试也更少会使人畏缩。
代码比您需要的还多?
只需一点点努力,就可能容易地对任何程序进行彻底的测试。当然,不可避免存在这些原则不适用的情况;于是,看起来好像不可能对功能进行测试。
当出现这些情况时,我尽力退一步地看这个问题,“我怎样才可能测试这种代码?”相反地,我问自己,“我怎样才能以可测试方式编写这些代码呢?”这种想法上的改变的结果经常是增加了大量 仅仅服务于简化测试的功能。
什么?别担心!出现这种情况完全正常。
就象很多现有的设计模式,它们只是为了增加程序的可扩展性就往程序中添加很多类(例如 visitor、decorator 等等),开发简化测试的新模式是可以接受的。实际上,面向对象语言的很多特征都是为了简化扩展而包含进去的;为什么语言的未来版本(或全新的语言)不应包含简化测试的特征。
对 Java 语言来说,这已经开始。人们计划在未来版本中包含很多更强大的类型系统、断言(assertion)等等。就象面向对象的语言已经增加了我们重用和扩展现有代码的程度,将来,面向测试的设计和特征将帮助我们增强新老代码的健壮性。
分享到:
相关推荐
在测试环境中,自动负载测试是一个基本的策略,通过在一台或几台PC机上模拟成百或上千的虚拟用户同时执行业务的情景,对应用程序进行测试,同时记录下每一事务处理的时间、中间件服务器峰值数据、数据库状态等。...
标题中的“论坛转帖工具.rar”表明这是一个用于在论坛之间转移帖子的软件工具,通常用于帮助用户方便地将一个论坛的帖子内容复制到另一个论坛,可能是为了分享信息、讨论或保存重要的帖子。这类工具可能包括自动抓取...
3. **调试与测试**:编写无错误的代码是编程竞赛的基本要求。熟练掌握调试工具和测试方法,如单元测试、边界条件检查、随机测试等,能够帮助参赛者快速定位并修复错误,确保代码的正确性和健壮性。 4. **编程语言的...
UBB论坛转帖圣手.exeUBB论坛转帖圣手.exe
【贴吧转帖工具】是一种专为百度贴吧用户设计的便捷工具,主要用于提高用户在贴吧中的互动效率。通过这款工具,用户可以实现一键转帖和一键8经验签到的功能,极大地简化了传统操作流程,节省了用户的时间,提升了...
Java设计模式是软件开发中的重要概念,它是一种在特定情境下解决常见问题的经验总结和最佳实践。这些模式为程序员提供了一种标准化的方式,以便在面向对象编程中有效地组织和构建代码,提高代码的可读性、可维护性和...
根据给定的信息,本文将对一段用于遍历网页的 Delphi 代码进行解析与说明,以便读者能够深入了解其工作原理及应用方式。 ### 一、理解Delphi代码 #### 1.1 概述 本段Delphi代码主要用于在网页上进行元素遍历操作。...
本篇文章将详细探讨“编辑人员转帖去水印工具”,并介绍如何使用名为Teorex Inpaint的1.0.0.2版本的软件来实现这一目标。 首先,我们要理解什么是水印。水印通常是指在图像或视频中添加的半透明标记,它可以是文字...
有时,我们可能需要获取用户通过WebView浏览的网页源代码,以便进行进一步的数据分析或者实现特定功能。这篇博客(原文链接:https://dai-lm.iteye.com/blog/1158470)讨论了如何在Android中通过WebView获取网页源...
"转帖工具插件 for PHPwind 7.5 正式版" 是专门为 PHPwind 7.5 版本设计的一个功能插件,旨在提供便捷的帖子转移功能,帮助管理员或者用户将内容从一个地方轻松移动到另一个地方,而无需直接编辑论坛的原始文件。...
首先,我们需要了解几个基本概念: 1. 图片处理库:在PHP中,GD库和Imagick是常用的两个图像处理库。GD库是PHP的内置库,适用于基本的图像处理任务,如缩放、裁剪和颜色调整。Imagick则基于ImageMagick,功能更加...
转帖图片提取工具可以对论坛图片附件信息进行清除,只保留图片代码,操作很简单,推荐有需要转帖图片工具的朋友下载 转帖图片提取工具使用方法: 将IP138上处理过的东西复制到上方的编辑框内,点击只要图片,下面...
标题《【转帖】4412嵌入式开发板学习笔记(一)》和描述《新手在进行开发学习前,建议先看01-迅为电子开发板入门视频。对开发板和开发环境有一定的了解后,不要盲目接线开机。以下是个人的一点经验,和大家分享一下...
X2转帖工具、采集工具”是针对这个平台设计的辅助软件,主要用于帮助论坛管理员或用户批量发布帖子和采集内容,提高论坛内容更新的效率。 一、批量发帖功能 1. 自动化发布:此工具可以自动化地创建和发布帖子,...
- **跨平台测试**:在多个不同硬件平台上进行测试验证,确保代码兼容性良好。 #### 三、结论 通过对上述四个常见误区的分析与解答,我们了解到在使用VxWorks进行嵌入式系统开发时需要注意的几个关键点。正确理解和...
这些源文件包含了所有与项目相关的元素,包括图形、文本、声音、视频和动作脚本,使得设计师可以对每一个细节进行编辑和调整。FLA文件的重要性在于,它们提供了深入到设计底层的可能性,让开发者或设计师能够完全...
在点集拓扑中,最基本的概念是拓扑空间,它是由一个集合(空间)和一组开集定义的。开集的定义必须满足三个基本性质:空集和整个集合都是开集,开集的任意并集仍然是开集,而有限个开集的交集也是开集。这些性质确保...
HTML2UBBMaxcj 是一款专为Softii论坛设计的转帖工具,它主要用于将HTML格式的帖子内容转换成UBB代码,以便在论坛中更好地显示和分享。UBB(Universal BBCode)是一种轻量级的标记语言,常用于网络论坛,与HTML类似,...
《一键转帖功能插件 for 帝国CMS 6.0 GBK utf8 V1.0》 本文将深入探讨“一键转帖功能插件”在帝国CMS 6.0系统中的应用与实现,该插件适用于GBK及UTF-8编码环境,旨在提升网站内容的分享与传播效率。我们将从安装...
- CE源代码:需要获取CE的源代码进行修改。 - 加花软件:增加程序的混淆性,使其难以被反作弊系统分析。 3. **操作步骤**: - 使用Actual Search and Replace,将源代码中所有与"cheatengine"相关的字符串替换为...