- 互联网单元测试及实践
- 陈卫俊等编著
- 7208字
- 2020-08-27 09:41:24
第1章 单元测试与互联网
在开始正式讨论网站单元测试之前,先了解一下单元测试和互联网的发展历史及现状,熟悉一些网站的应用架构,并初步认识一下网站单元测试,这些都有助于更好地理解本书的后续内容。另外,本章还会介绍一下单元测试的发展趋势,其中一些已经在逐步推广实践中,另一些则刚刚起步。由于信息技术惊人的发展速度,这些单元测试方法可能很快就能结出丰硕的果实,给软件测试工作带来更多的惊喜。
1.1 单元测试与互联网的历史、现状
20世纪60年代末、70年代初,随着软件危机产生的矛盾日益突出,软件工程化的概念逐渐形成,人们开始广泛接受软件生命周期的概念,把软件工程活动分为需求分析、设计、编码、测试和维护等阶段,并意识到在软件开发初期通过测试发现及解决缺陷的成本,要比在后期经过测试而发现缺陷并加以改正的成本低得多。自此,单元测试开始登上历史舞台。巧合的是,差不多同样的时间,1969年,为了能在爆发核战争时保障通信联络,美国国防部高级研究计划署ARPA资助建立了世界上第一个分组交换试验网ARPANET,连接美国四个大学,这个ARPANET就是互联网的始祖。在这以后,单元测试和互联网各自取得了巨大的发展,但是很有意思,两者的发展在时间上仍然保持了很高的一致性。
1.20世纪70年代末80年代初,软件测试技术的研究进入了第一个高潮。大量单元测试的理论、方法和测试工具开始陆续地出现,使得单元测试无论在理论上还是在实践上都具备了高度的可行性;与此同时,计算机网络蓬勃发展,各种各样的计算机网络应运而生,例如MILNET、USENET、BITNET、CSNET等,在网络的规模和数量上都得到了很大的发展,而一系列网络的建设,又产生了不同网络之间互联的需求,并最终导致了TCP/IP协议的诞生。
2.20世纪80年代后期,PC产业迅猛发展,这给桌面应用程序软件带来了巨大的市场,此时单元测试才真正开始大量出现在软件开发过程中,广泛为软件开发者所接受;而在1986年,美国国家科学基金会NSF资助建成了基于TCP/IP技术的主干网NSFNET,连接美国的若干超级计算中心、主要大学和研究机构,世界上第一个互联网诞生,并迅速连接到世界各地,开始为人们所熟悉。
3.进入20世纪90年代,随着Web技术和相应的浏览器的出现,互联网的发展和应用出现了新的飞跃,1995年,NSFNET开始商业化运行,互联网从此进入了全球商用化的时代;而随着互联网应用越来越多,功能不断地增强,用户的要求越来越高,互联网应用测试开始蓬勃发展,单元测试也进入了又一次的发展高峰期,大量适用于互联网的单元测试技术、工具应运而生,新的单元测试理论和方法也层出不穷,而这些又极大地提升了互联网应用的质量,使得互联网在这十几年间进入了发展的黄金时期,取得了惊人的发展,远远超出了人们的想象。
这种种巧合聚集在一起,特别是互联网商用化以后,单元测试和互联网飞速地发展,使得我们有理由相信,单元测试和互联网有着非常密切的关系,而这正是本章接下来要详细阐述的。
1.1.1 单元测试简史
什么是单元测试
在介绍单元测试简史之前,先简单了解一下什么是单元测试。
《软件测试方法和技术》中对单元测试的描述原文如下:“单元测试是对软件基本组成单元的测试。单元测试的对象是软件设计的最小单位——模块。”
单元测试是在软件开发过程中要进行的最低级别的测试活动,在一种传统的结构化编程语言中,比如C,要进行测试的单元一般是函数或子过程。在像C++这样的面向对象的语言中,要进行测试的基本单元是类。对Ada语言来说,开发人员可以选择是在独立的过程和函数,还是在Ada包的级别上进行单元测试。单元测试的原则同样被扩展到第四代语言(4GL)的开发中,在这里基本单元被典型地划分为一个菜单或显示界面。
单元测试是针对“单元”的测试,这是毫无疑问的。但何谓“单元”,则并没有特别明确的区分,在不同的上下文语境中,单元可以是不同的含义。在RUP中,单元测试的对象可以是文件、DLL或是类等等。从“Systematic Software Testing”一书提供的单元测试模板来看,在确定单元测试范围的时候,单元测试范围的内容可以是“Unit/Module/Component”。可见,在该书的作者看来,单元测试的范围可以是Unit (代码片断)、Module(模块)或者是Component(构件)。
从目前的TDD和单元测试的发展趋势来看,在使用面向对象方法开发的系统中,越来越多的人倾向于将单元测试理解为针对类的测试,或是针对几个紧密联系的类的测试,并不需要被测单元具有UI层面上的含义(例如,一个纯粹的算法类)。在实际的工作中,具体“单元”的选取应该是根据具体的情况来确定的,没有一个非常统一的标准。例如,如果该系统大量使用外部的组件(component),单元测试的内容更多的是以组件来进行,但如果系统开发中要求对每个类进行测试,类就应该是单元测试的最佳关注单位。
单元测试不仅仅是作为无错编码一种辅助手段在一次性的开发过程中使用,单元测试必须是可重复的,无论是在软件修改,或是移植到新的运行环境的过程中。因此,所有的测试都必须在整个软件系统的生命周期中进行维护。
经常与单元测试联系起来的另外一些开发活动包括代码走读(Code review),静态分析(Static analysis)和动态分析(Dynamic analysis)。静态分析就是对软件的源代码进行研读,查找错误或收集一些度量数据,并不需要对代码进行编译和执行。动态分析就是通过观察软件运行时的动作,来提供执行跟踪、时间分析,以及测试覆盖度方面的信息。
单元测试具有下面这些优点:
1.它是一种验证行为。对程序中的每一项功能都必须测试以验证其正确性。它为以后的开发提供支持。就算是开发后期,我们也可以轻松地增加功能或更改程序结构,而不用担心这个过程中会破坏重要的东西。而且它为代码的重构提供了保障。这样,我们就可以更自由地对程序进行改进。
2.它是一种设计行为。编写单元测试将使我们从调用者观察、思考。特别是先写测试(test-first),迫使我们把程序设计成易于调用和可测试的,即迫使我们解除软件中的耦合。
3.它是一种编写文档的行为。单元测试是一种无价的文档,它是展示函数或类如何使用的最佳文档。这份文档是可编译、可运行的,并且它总保持最新,永远与代码同步。
4.它具有回归性。自动化的单元测试避免了代码出现回归,编写完成之后,可以随时随地快速地运行测试。
单元测试发展的四个时期
虽然世界上第一台电子计算机(ENIAC)早在1946年2月就在美国诞生并投入使用,但是单元测试的概念却直到20世纪60年代末70年代初才开始逐步形成。早期的计算机运行可靠性差、元器件质量不高、工作不稳定,而有缺陷的程序又运行于其上,当程序运行结果不正确时,很难分辨究竟是计算机硬件本身的问题,还是程序的问题。这个时期测试的概念都尚未形成。
20世纪50年代,计算机元器件的质量已经有了很大的提高,这个时候程序测试的问题开始暴露出来。英国著名的计算机科学家图灵给出了程序测试的原始定义,他认为测试是确认正确性的实验方法的一种极端形式。这时期的测试都是针对机器语言或汇编语言的,由于尚未有软件工程的概念,因此测试仅仅是在程序开发完成后,随机或凭经验、直觉选取不同的输入,运行后检查输出的结果是否正确。之后尽管高级语言开始出现,但是测试的理论和方法仍然没有什么进展。
直到20世纪60年代末70年代初,当时软件危机大规模爆发,造成了巨大的损失,软件质量开始引起人们的重视,许多专家、教授在总结了之前软件开发的经验教训后,开始重视测试技术的研究,并取得了一些初步的成果:F.P.Brooks总结了开发IBM OS/360操作系统中的经验,著成了软件领域的“圣经”《人月神话》,阐明软件测试在大型系统开发中的重要意义;而B.W.Bohem则指出,由于测试工作主要集中在系统递交阶段,使得测试的效果完全依赖于运行情况,这是当时测试工作的一个致命弱点。这个时候软件工程化和软件生命周期的概念被提出,软件工程活动被划分为需求分析、设计、编码、测试和运行维护几个阶段,而且人们普遍意识到在软件开发初期通过测试发现及解决缺陷的成本,要比在后期经过测试而发现缺陷并加以改正的成本低得多。因此各种有关软件生命周期前几个阶段的测试方法和测试理论应运而生,例如W.E.Howden给出了软件生命周期各个阶段的测试目标,I.J.Hayes提出说明书指导的模块测试方法,主张在早期的开发中就处处想到测试的需求。从此时开始,单元测试的概念才真正形成。
单元测试的发展大致可以分成四个时期,如表1.1所示。
表1.1 单元测试发展的四个时期
1.萌芽时期:20世纪60年代末70年代初,软件生命周期概念产生,人们已经意识到测试活动应针对软件生命周期中的各个阶段进行,即测试应分成多个阶段,单元测试的雏形诞生。
2.兴起时期:20世纪70年代末80年代初,软件测试技术的研究达到高潮,J.B.Goodenough和S.L.Gerhart首先提出了软件测试的理论,从而第一次把软件测试提升到理论的高度,之后W.E.Howden又指出了该理论的缺陷并进行了新的开创性工作;与此同时大量单元测试方法也迅速诞生,J.C.Huang提出了“程序插桩”技术,W.E.Howden对路径测试进行了深入的分析,提出了系统功能测试及代数测试等;加上一些单元测试工具逐渐问世,例如RXVP 80(能对FORTRAN和COBOL进行程序静态测试)、Test-master系统和AUT(模拟测试环境,产生驱动模块和桩模块)等等,使得单元测试无论在理论上还是在实践上都具备了高度的可行性,逐渐开始兴起。
3.发展和完善时期:20世纪80年代后期,PC产业的迅猛发展给桌面应用程序软件带来了巨大的市场,这使得软件开发和测试进入了一个新的时代,单元测试真正开始大量出现在软件开发过程中,广泛为软件开发者所接受,并在实践中不断被改进和完善。这个时期的软件生命周期一般都很长,至少为6个月,即使很小的维护版本也只能从6个月缩短为几个星期。
4.高速发展时期:20世纪90年代,尤其是1995年互联网开始全球商用化以后,互联网应用对单元测试提出了更大的挑战,此时出现了互联网软件生命周期,与传统软件生命周期相比,这个周期的时间要短得多。互联网同时带来了分布式应用、开源软件、极限编程(XP)等软件开发的新形式,这些促使单元测试在此时期飞速地发展来满足以上需求。而这也是单元测试发展最迅速的一个时期,自动化测试框架、单元性能测试、测试驱动开发(TDD)等一个接一个地出现,不断地带给人们更大的惊喜。
1.1.2 互联网发展简介
最初,互联网的诞生仅仅是为了能在爆发核战争时保障通信联络这个目的,谁都没有想到,短短的二三十年时间,互联网取得了如此巨大的发展,甚至于改变了人们的许多生活方式。现在,互联网已经成为许多人生活中不可或缺的组成部分,并且其影响力正在以惊人的速度扩大。未来的互联网会怎样?尽管许多令人觉得不可思议的构想已经被提出,但从互联网的发展历史来看,恐怕到时候的互联网会更加地令人难以置信。
和单元测试的发展历史一样,世界互联网的发展历史大致也可以分为四个时期,如表1.2所示。
表1.2 世界互联网发展的四个时期
1.萌芽时期:互联网的雏形诞生于1969年,是由美国国防部高级研究计划局(ARPA)建立的ARPANET。ARPANET建网的初衷旨在帮助那些为美国军方工作的研究人员通过计算机交换信息,它的设计与实现是基于这样的一种主导思想:网络要能够经得住故障的考验而维持正常工作,当网络的一部分因受攻击而失去作用时,网络的其他部分仍能维持正常通信。现代计算机网络的许多概念和方法,如分组交换技术都来自ARPANET。ARPANET不仅进行了租用线互联的分组交换技术研究,而且做了无线、卫星网的分组交换技术研究,为以后互联网的发展打下了良好的基础。
2.兴起时期:20世纪70年代末80年代初,现代互联网的基石,TCP/IP体系结构和协议诞生。这一时期计算机网络蓬勃发展,各种各样的计算机网络应运而生,例如MILNET、USENET、BITNET、CSNET等,在网络的规模和数量上都得到了很大的发展,而一系列网络的建设,又产生了不同网络之间互联的需求,并最终导致了TCP/IP协议的横空出世。1977~1979年,ARPANET推出了目前形式的TCP/IP体系结构和协议。1980年前后,ARPANET上的所有计算机开始了TCP/IP协议的转换工作,并以ARPANET为主干网建立了初期的互联网。1983年,ARPANET的全部计算机完成了向TCP/IP的转换,并在UNIX(BSD 4.1)上实现了TCP/IP。可以说,ARPANET在技术上最大的贡献就是对TCP/IP协议的开发和应用。
3.发展和完善时期:现代的互联网即诞生于这一时期。1985年,美国国家科学基金组织NSF采用TCP/IP协议将分布在美国各地的6个为科研教育服务的超级计算机中心互联,并支持地区网络,形成NSFNET。1986年,NSFNET替代ARPANET成为互联网的主干网,世界上第一个互联网出现了。1988年,互联网开始对外开放,并迅速连接到世界各地。1991年6月,在与互联网连通的计算机中,商业用户首次超过了学术界用户,这是互联网发展史上的一个里程碑,从此互联网成长一发而不可收拾。
4.高速发展时期:进入20世纪90年代后,随着Web技术和相应的浏览器的出现,互联网的发展和应用出现了新的飞跃,互联网进入高速发展时期。1995年,NSFNET开始商业化运行。从这个时候开始,互联网用户数量呈指数增长趋势,平均每半年翻一番。到2001年7月,全球连接的计算机数量约1.26亿台。到2002年5月,全球已经有5亿8千多万用户。其中,北美1.82亿,亚太1.68亿。而互联网还在以超过摩尔定律的速度发展。到了2007年年底,仅美国的互联网用户数量就达到了2.16亿,已经接近2002年全球互联网用户数量的一半;互联网用户数最多的三个国家:美国、中国和日本的用户数之和达5.3亿,已经几乎与2002年全球互联网用户数持平;而这个时候全球互联网用户数更是已经达到了惊人的9.5亿,在短短5年多时间里全球互联网用户数几乎翻了一倍。
更加令人振奋的是互联网应用发生的巨大变化。从网络诞生之初仅仅是为了通信,到之后的资源共享,及至互联网出现,电子邮件、门户网站和搜索引擎三足鼎立,到如今已经是百花齐放。博客、社区、知识搜索、视频分享、软件服务、电子商务、即时通信、网络游戏、在线音乐、垂直网站、网络广告、地图服务、网上银行等等,各种新的应用层出不穷,给人们的生活带了巨大的变化。
与世界互联网的发展相比,中国互联网起步较晚,但是其发展极为迅速。
互联网在中国的发展历程可以大略地划分为三个阶段。
1.第一阶段为1987~1993年,是研究试验阶段。在此期间中国一些科研部门和高等院校开始研究互联网技术,并开展了科研课题和科技合作工作,但这个阶段的网络应用仅限于小范围内的电子邮件服务。
2.第二阶段为1994~1996年,是起步阶段。1994年4月,中关村地区教育与科研示范网络工程进入互联网,从此中国被国际上正式承认为有互联网的国家。之后,Chinanet、CERnet、CSTnet、Chinagbnet等多个互联网络项目在全国范围相继启动,互联网开始进入公众生活,并在中国得到了迅速的发展。到1996年底,中国互联网用户数已达20万,利用互联网开展的业务与应用逐步增多。
3.第三阶段为1997年至今,是互联网在我国高速发展的阶段。国内互联网用户数自1997年以后基本保持每半年翻一番的增长速度。根据BDA咨询公司2008年3月份公布的研究报告,目前中国互联网用户数已经超过美国,跃居全球首位,这是中国互联网发展的一大里程碑。
小资料
2008年3月14日,总部设在北京的BDA咨询公司公布一项研究报告称,中国互联网用户的数量超过美国,跃居世界首位。
BDA咨询公司根据中国互联网信息中心的数据公布该预估结果。中国互联网信息中心数据显示,2007年底中国互联网的用户总数达到2.1亿。
BDA咨询公司称,据Nielsen/NetRatings公司公布数据显示,2007年底美国的网民为2.16亿。
分析师在一份声明中称,“根据这些数据,假设2008年互联网市场按照与2007年相同的增长速度发展,可以得出到目前为止,中国互联网用户已经超过美国,拥有世界上最多的网民。”
BDA咨询公司还补充称,预计电子商务将成为中国下一个蓬勃发展的产业,因为很多公司在消费者进行网络交易的市场上获益不少。
更可喜的是,中国互联网已经全面进入宽带时代。调查显示,各种宽带用户的总和占网络用户总数的85.9%,其中ADSL上网的比例已经达到了46.5%,成为最主流的上网方式。使用宽带上网意味着网速增加、传递超大数据的能力增强,互联网产业发展的重要机遇来临了。与此同时,中国互联网用户的网络消费能力也在快速增长。2005年中国互联网用户人均月互联网消费额为157.8元,2006年增长7.5%,达到169.57元,到2007年达到195.76元,增长15.4%之多,包括网页搜索、博客、电子邮箱、社区、新闻资讯、知识搜索和视频分享在内的7类网络服务,其月度覆盖人数均已超过1亿人。
在这十几年间,中国的互联网公司也取得了长足的进步。阿里巴巴连续7年被福布斯评选为全球最佳B2B网站,淘宝网已经成为亚洲最大的C2C网站,腾讯和百度分别在国内即时通信领域和搜索领域击败包括Google、微软在内的众多国外巨头,长期占据市场份额第一的位置。2008年1月,阿里巴巴集团旗下的阿里软件推出了亚洲首个软件互联平台,从而将SaaS(软件即服务)推到了一个新的高度,引来全世界互联网巨头们的高度关注。
小资料
SaaS是Software-as-a-Service(软件即服务)的简称,简而言之,SaaS可以定义为“将软件部署为托管服务并通过互联网进行访问”。
SaaS概念通常与20世纪90年代的应用程序服务提供商(ASP)有关,ASP通过互联网为企业用户提供“压缩-包装”应用程序。在授权和体系结构等方面,这些早期所尝试的通过互联网交付的软件与传统的内部部署的应用程序有许多共同之处,而与现代的SaaS应用程序的共同之处相对较少。因为这些应用程序最初是作为单租户应用程序构建的,与其他应用程序共享数据和进程的能力比较有限,所以与本地安装的应用程序相比,它们的经济效益较低。
现今,预计SaaS应用程序可以通过单实例、多租户体系结构,利用集中化优势并提供功能丰富的体验,能够与类似的内部部署的应用程序相媲美。典型的SaaS应用程序既可以直接由供应商提供,也可以由称为聚合器的中间方提供。中间方将来自不同供应商的SaaS产品绑定在一起,作为统一应用程序平台的一部分提供。
与常用于内部部署软件的一次性许可模型不同,SaaS应用程序访问权限通常使用订阅模型出售,客户需要持续付费以使用该应用程序。费率结构随应用程序变化;一些提供商收取固定费率,允许无限制地访问应用程序的一些功能或全部功能;另一些提供商收取可变费率,视使用情况而定。
在技术方面,SaaS提供商集中托管应用程序和数据,将修补程序和升级程序透明地部署到应用程序,然后使用浏览器或智能客户端应用程序通过互联网将访问权限交付给最终用户。许多供应商还提供应用程序编程接口(API),它可以将应用程序数据和功能提供给开发人员,供他们在创建复合应用程序时使用。你可以使用各种各样的安全机制,确保传输和存储过程中敏感数据的安全。应用程序提供商还可以提供一些工具,客户能够使用这些工具修改数据架构、工作流以及应用程序运行的其他方面,以满足其使用要求。
正如前文所说,互联网的高速发展极大地促进了单元测试的发展,同时也给单元测试带来了巨大的挑战。单元测试如何来满足互联网应用的需要?网站单元测试要怎么做?今后的发展趋势是什么?接下来,将进一步阐述这些问题。