Web的系统测试方法
2011年03月21日
Web的系统测试方法
随着Internet和Intranet/Extranet的快速增长,Web已经对商业、工业、银行、财政、教育、政府和娱乐及我们的工作和生活产生了深远的影响。许多传统的信息和数据库系统正在被移植到互联网上,电子商务迅速增长,早已超过了国界。范围广泛的、复杂的分布式应用正在Web环境中出现。Web的流行和无所不在,是因为它能提供支持所有类型内容连接的信息发布,容易为最终用户存取。
Yogesh Deshpande和Steve Hansen在1998年就提出了Web工程的概念。Web工程作为一门新兴的学科,提倡使用一个过程和系统的方法来开发高质量的基于Web的系统。它"使用合理的、科学的工程和管理原则,用严密的和系统的方法来开发、发布和维护基于Web的系统"。目前,对于web工程的研究主要是在国外开展的,国内还刚刚起步。 在基于Web的系统开发中,如果缺乏严格的过程,我们在开发、发布、实施和维护Web的过程中,可能就会碰到一些严重的问题,失败的可能性很大。而且,随着基于Web的系统变得越来越复杂,一个项目的失败将可能导致很多问题。当这种情况发生时,我们对Web和Internet的信心可能会无法挽救地动摇,从而引起Web危机。并且,Web危机可能会比软件开发人员所面对的软件危机更加严重、更加广泛。
在Web工程过程中,基于Web系统的测试、确认和验收是一项重要而富有挑战性的工作。基于Web的系统测试与传统的软件测试不同,它不但需要检查和验证是否按照设计的要求运行,而且还要测试系统在不同用户的浏览器端的显示是否合适。重要的是,还要从最终用户的角度进行安全性和可用性测试。然而,Internet和Web媒体的不可预见性使测试基于Web的系统变得困难。因此,我们必须为测试和评估复杂的基于Web的系统研究新的方法和技术。 一般软件的发布周期以月或以年计算,而Web应用的发布周期以天计算甚至以小时计算。Web测试人员必须处理更短的发布周期,测试人员和测试管理人员面临着从测试传统的C/S结构和框架环境到测试快速改变的Web应用系统的转变。
一、功能测试1、 链接测试
链接是Web应用系统的一个主要特征,它是在页面之间切换和指导用户去一些不知道地址的页面的主要手段。链接测试可分为三个方面。首先,测试所有链接是否按指示的那样确实链接到了该链接的页面;其次,测试所链接的页面是否存在;最后,保证Web应用系统上没有孤立的页面,所谓孤立页面是指没有链接指向该页面,只有知道正确的URL地址才能访问。
链接测试可以自动进行,现在已经有许多工具可以采用。链接测试必须在集成测试阶段完成,也就是说,在整个Web应用系统的所有页面开发完成之后进行链接测试。
2、表单测试
当用户给Web应用系统管理员提交信息时,就需要使用表单操作,例如用户注册、登陆、信息提交等。在这种情况下,我们必须测试提交操作的完整性,以校验提交给服务器的信息的正确性。例如:用户填写的出生日期与职业是否恰当,填写的所属省份与所在城市是否匹配等。如果使用了默认值,还要检验默认值的正确性。如果表单只能接受指定的某些值,则也要进行测试。例如:只能接受某些字符,测试时可以跳过这些字符,看系统是否会报错。
3、Cookies测试
Cookies通常用来存储用户信息和用户在某应用系统的操作,当一个用户使用Cookies访问了某一个应用系统时,Web服务器将发送关于用户的信息,把该信息以Cookies的形式存储在客户端计算机上,这可用来创建动态和自定义页面或者存储登陆等信息。
如果Web应用系统使用了Cookies,就必须检查Cookies是否能正常工作。测试的内容可包括Cookies是否起作用,是否按预定的时间进行保存,刷新对Cookies有什么影响等。
4、设计语言测试
Web设计语言版本的差异可以引起客户端或服务器端严重的问题,例如使用哪种版本的HTML等。当在分布式环境中开发时,开发人员都不在一起,这个问题就显得尤为重要。除了HTML的版本问题外,不同的脚本语言,例如Java、JavaScript、 ActiveX、VBScript或Perl等也要进行验证。 5、数据库测试
在Web应用技术中,数据库起着重要的作用,数据库为Web应用系统的管理、运行、查询和实现用户对数据存储的请求等提供空间。在Web应用中,最常用的数据库类型是关系型数据库,可以使用SQL对信息进行处理。
在使用了数据库的Web应用系统中,一般情况下,可能发生两种错误,分别是数据一致性错误和输出错误。数据一致性错误主要是由于用户提交的表单信息不正确而造成的,而输出错误主要是由于网络速度或程序设计问题等引起的,针对这两种情况,可分别进行测试。 二、性能测试
1、连接速度测试
用户连接到Web应用系统的速度根据上网方式的变化而变化,他们或许是电话拨号,或是宽带上网。当下载一个程序时,用户可以等较长的时间,但如果仅仅访问一个页面就不会这样。如果Web系统响应时间太长(例如超过5秒钟),用户就会因没有耐心等待而离开。
另外,有些页面有超时的限制,如果响应速度太慢,用户可能还没来得及浏览内容,就需要重新登陆了。而且,连接速度太慢,还可能引起数据丢失,使用户得不到真实的页面。
2、负载测试
负载测试是为了测量Web系统在某一负载级别上的性能,以保证Web系统在需求范围内能正常工作。负载级别可以是某个时刻同时访问Web系统的用户数量,也可以是在线数据处理的数量。例如:Web应用系统能允许多少个用户同时在线?如果超过了这个数量,会出现什么现象?Web应用系统能否处理大量用户对同一个页面的请求?
3、压力测试
负载测试应该安排在Web系统发布以后,在实际的网络环境中进行测试。因为一个企业内部员工,特别是项目组人员总是有限的,而一个Web系统能同时处理的请求数量将远远超出这个限度,所以,只有放在Internet上,接受负载测试,其结果才是正确可信的。
进行压力测试是指实际破坏一个Web应用系统,测试系统的反映。压力测试是测试系统的限制和故障恢复能力,也就是测试Web应用系统会不会崩溃,在什么情况下会崩溃。黑客常常提供错误的数据负载,直到Web应用系统崩溃,接着当系统重新启动时获得存取权。
压力测试的区域包括表单、登陆和其他信息传输页面等。
三、可用性测试
1、导航测试
导航描述了用户在一个页面内操作的方式,在不同的用户接口控制之间,例如按钮、对话框、列表和窗口等;或在不同的连接页面之间。通过考虑下列问题,可以决定一个Web应用系统是否易于导航:导航是否直观?Web系统的主要部分是否可通过主页存取?Web系统是否需要站点地图、搜索引擎或其他的导航帮助?
在一个页面上放太多的信息往往起到与预期相反的效果。Web应用系统的用户趋向于目的驱动,很快地扫描一个Web应用系统,看是否有满足自己需要的信息,如果没有,就会很快地离开。很少有用户愿意花时间去熟悉Web应用系统的结构,因此,Web应用系统导航帮助要尽可能地准确。
导航的另一个重要方面是Web应用系统的页面结构、导航、菜单、连接的风格是否一致。确保用户凭直觉就知道Web应用系统里面是否还有内容,内容在什么地方。
Web应用系统的层次一旦决定,就要着手测试用户导航功能,让最终用户参与这种测试,效果将更加明显。
2、图形测试
在Web应用系统中,适当的图片和动画既能起到广告宣传的作用,又能起到美化页面的功能。一个Web应用系统的图形可以包括图片、动画、边框、颜色、字体、背景、按钮等。图形测试的内容有:
(1)要确保图形有明确的用途,图片或动画不要胡乱地堆在一起,以免浪费传输时间。Web应用系统的图片尺寸要尽量地小,并且要能清楚地说明某件事情,一般都链接到某个具体的页面。
(2)验证所有页面字体的风格是否一致。
(3)背景颜色应该与字体颜色和前景颜色相搭配。
(4)图片的大小和质量也是一个很重要的因素,一般采用JPG或GIF压缩。
3、内容测试
内容测试用来检验Web应用系统提供信息的正确性、准确性和相关性。
信息的正确性是指信息是可靠的还是误传的。例如,在商品价格列表中,错误的价格可能引起财政问题甚至导致法律纠纷;信息的准确性是指是否有语法或拼写错误。这种测试通常使用一些文字处理软件来进行,例如使用Microsoft Word的"拼音与语法检查"功能;信息的相关性是指是否在当前页面可以找到与当前浏览信息相关的信息列表或入口,也就是一般Web站点中的所谓"相关文章列表"。
4、整体界面测试
整体界面是指整个Web应用系统的页面结构设计,是给用户的一个整体感。例如:当用户浏览Web应用系统时是否感到舒适,是否凭直觉就知道要找的信息在什么地方?整个Web应用系统的设计风格是否一致?
对整体界面的测试过程,其实是一个对最终用户进行调查的过程。一般Web应用系统采取在主页上做一个调查问卷的形式,来得到最终用户的反馈信息。
对所有的可用性测试来说,都需要有外部人员(与Web应用系统开发没有联系或联系很少的人员)的参与,最好是最终用户的参与。
四、客户端兼容性测试
1、平台测试
市场上有很多不同的操作系统类型,最常见的有Windows、Unix、Macintosh、Linux等。Web应用系统的最终用户究竟使用哪一种操作系统,取决于用户系统的配置。这样,就可能会发生兼容性问题,同一个应用可能在某些操作系统下能正常运行,但在另外的操作系统下可能会运行失败。
因此,在Web系统发布之前,需要在各种操作系统下对Web系统进行兼容性测试。
2、浏览器测试
浏览器是Web客户端最核心的构件,来自不同厂商的浏览器对Java,、JavaScript、 ActiveX、 plug-ins或不同的HTML规格有不同的支持。例如,ActiveX是Microsoft的产品,是为Internet Explorer而设计的,JavaScript是Netscape的产品,Java是Sun的产品等等。另外,框架和层次结构风格在不同的浏览器中也有不同的显示,甚至根本不显示。不同的浏览器对安全性和Java的设置也不一样。
测试浏览器兼容性的一个方法是创建一个兼容性矩阵。在这个矩阵中,测试不同厂商、不同版本的浏览器对某些构件和设置的适应性。
五、安全性测试
Web应用系统的安全性测试区域主要有:
(1)现在的Web应用系统基本采用先注册,后登陆的方式。因此,必须测试有效和无效的用户名和密码,要注意到是否大小写敏感,可以试多少次的限制,是否可以不登陆而直接浏览某个页面等。
(2)Web应用系统是否有超时的限制,也就是说,用户登陆后在一定时间内(例如15分钟)没有点击任何页面,是否需要重新登陆才能正常使用。
(3)为了保证Web应用系统的安全性,日志文件是至关重要的。需要测试相关信息是否写进了日志文件、是否可追踪。
(4)当使用了安全套接字时,还要测试加密是否正确,检查信息的完整性。
(5)服务器端的脚本常常构成安全漏洞,这些漏洞又常常被黑客利用。所以,还要测试没有经过授权,就不能在服务器端放置和编辑脚本的问题。
六、总结
本文从功能、性能、可用性、客户端兼容性、安全性等方面讨论了基于Web的系统测试方法。
基于Web的系统测试与传统的软件测试既有相同之处,也有不同的地方,对软件测试提出了新的挑战。基于Web的系统测试不但需要检查和验证是否按照设计的要求运行,而且还要评价系统在不同用户的浏览器端的显示是否合适。重要的是,还要从最终用户的角度进行安全性和可用性测试。Web下的整体测试
B/S下的功能测试比较简单,关键是如何做好性能测试。目前大多数的测试人员认为只要跑一些测试工具证明我的产品是可以达到性能的就ok了,为了证明而去测试是没有任何价值的,关键是要发现产品性能上的缺陷,定位问题,解决问题,这才是测试要做的。首先我们从两个方面分析如何进行WEB测试,从技术实现上来讲一般的B/S结构,无论是.NET还是J2EE,都是多层构架,有界面层,业务逻辑层,数据层。而从测试的流程上来说,首先是发现问题,分析问题,定位问题,再由开发人员解决问题。那么B/S的结构的测试如何来做?如何发现问题是我首先要介绍的,在做WEB测试之前你需要一些资料,比如产品功能说明书,性能需求说明书,不一定很完善,但一定要有,明确测试目标,这是基本的常识,可是我往往看到的是已经开始动手测了,但还不知自己的系统要达到的性能指标是什么。这里我简单讲一下测试的性能指标:1、通用指标(指Web应用服务器、数据库服务器必需测试项):
* ProcessorTime: 指服务器CPU占用率,一般平均达到70%时,服务就接近饱和;
* Memory Available Mbyte : 可用内存数,如果测试时发现内存有变化情况也要注意,如果
是内存泄露则比较严重;
* Physicsdisk Time : 物理磁盘读写时间情况;
2、Web服务器指标:
* Avg Rps: 平均每秒钟响应次数=总请求时间 / 秒数;
* Avg time to last byte per terstion (mstes):平均每秒业务角本的迭代次数 ,有人会
把这两者混淆;
* Successful Rounds:成功的请求;
* Failed Rounds :失败的请求;
* Successful Hits :成功的点击次数;
* Failed Hits :失败的点击次数;
* Hits Per Second :每秒点击次数;
* Successful Hits Per Second :每秒成功的点击次数;
* Failed Hits Per Second :每秒失败的点击次数;
* Attempted Connections :尝试链接数;
3、数据库服务器指标:
* User 0 Connections :用户连接数,也就是数据库的连接数量;
* Number of deadlocks:数据库死锁;
* Butter Cache hit :数据库Cache的命中情况;上面的指标只是一些通用的指标,起到抛砖引玉的作用,对于不同的应用你还必需作相应的调整,比如程序使用的是.NET技术的,则必需加入一些针对性的测试指标。对于这些指标的详细了解,你可以参考Windows 下面的 SystemMonitor的帮助与LoadRunner、ACT的帮助。对于发现问题,指标的设置非常重要,它会帮你定性的发现一些错误。对于定性的压力测试我就不做过多的分析,工具很多,流行的主要有LoadRunner,ACT,WAS,WebLoad,各个工具有它的使用范围,其中我各个认为LoadRunner 最全面,它提供了多种协议的支持,对复杂的压力测试都可以胜任,WAS与ACT则对微软的技术支持的比较好,其中WAS支持分布式机群测试,ACT则是与.NET集成比较好,支持ViewState (.NET 下控件缓存的支持)的测试,当时我用时,其它测试工具还不支持,现在应该支持了吧,呵呵。在这一阶段测试你要不断的跟据系数的测试目标进行变化,一开始由于系统过于庞大,所以我们要分成若干个子系统,各个子系统的性能目标必需明确,主要是并发指标定一个阀值,同时设定一些与系统相关的测试参数,应用服务器,数据库服务器都要有,对达不到阀值的与一些通用参数有问题的子系统进行深入分析。比如它的并发达不到你的要求,证明子系统性能有问题,或是数据库用户连接过高,程序没有释放用户连接等等。这个我们要对子系统进行详细测试,由于B/S 结构下,图片的请求对性能的影响较大,所以我们对子系统测试时要分两个部分进行,一、非程序部分,即图片等等;二、应用程序本身。通过事务或函数的分离,可以把这两块实现单独的测试,具体做法参考各个工具的手册,我这里就不做说明。对子系统的测试参数的设置要求则更高,它有助你后面精确的定位问题,比如对异常,死锁,网络流量等等前面没有注意到的情况的增加,同时你要注意增加测试参数的收集对系统的性能影响比较大,所以一般不要超过10个,刚刚介绍的整体的性能测试指标也不要增加很多,这样影响会小一点。最后在这一阶段要说明的是数据库的数据量会很大程度的影响性能,所以要根据前面的性能需求说明书向数据库中模拟相应的数据量,来进行测试,这样才有更高的可信度。
上面所说的是对问题的发现,下面就是分析问题原因,这一步的要求比较高,一般由测试人员与程序员配合完成,当然如果你有相当的开发经验,再做这方面的测试,就更为难得。下面我们说说如何精确定位问题,出现问题的可能性可能有很多种,大致分以下几种,一、性能达不到目标;二、性能达到目标,但有一些其它的问题,比如异常,死锁,缓存命中过低,网络流量较大;三、服务器稳定性的问题,比如内存泄漏……。要发现这些问题起马的要求要有一款使用的比较称心的性能分析与优化工具,比如微软的.NET下就有自己开发的工具,对Borland的Java开发工具中也有类似的工具,但我个人认为更好的工具是Rose下的Purify与Quantify,主要是他对.net 与java ,C++都有支持,而且分析效果特别专业,我们先了解一下Rational Purify, Rational Purify 能自动找出Visual C/C++ 和Java 代码中与内存有关的错误,确保整个应用程序的质量和可靠性。在查找典型的Visual C/C++ 程序中的传统内存访
问错误,以及Java,C# 代码中与垃圾内存收集相关的错误方面;Rational Quantity 则是一款针对函数级的性能分析利器,使用它你可以从图形化的界面中得到函数调用的时间,百分比与次数,以及子函数所占时间,使你可以更快的定位性能瓶颈。我们先说性能优化与异常的处理,性能优化有一个原则,即用时间比例最大的进行优化,效果才最明显,比如有个函数它的执行时间为30秒,如果你优化了一百倍则执行时间为0.3秒,提升了29.7秒,而如果它的执行时间为0.3秒,优化后为0.003秒,实际提升了0.297秒,提升的效果并不明显,而且写过程序的人都知道,后者性能优化的代价更大。在性能优化的过程中,一般是先数据库,后程序,因为数据库的优化不需要修改程序,修改的风险很小。但如何才能确定是数据库的问题,这就需要技巧,在使用Quantity时,你一路分析下去,大多数最终会发现,是数据库查询函数占用时间比较大,比如什么,SqlCmd.ExecuteNoQuery等等数据库执行函数,这时你就需要分析数据库,呵呵。数据库的分析原则是先索引,后存储过程,最后表结构视图的优化,索引的优化是最简单也是通常最有效的方法,如果合理的使用会带来意想不到不到的效果。在这里我要给大家简单的介绍一下我的最爱,SQLProfile,SQL查询分析器,Precise,SQLProfile是一个SQL语句跟踪器,可以跟踪程序流程使用的SQL语句与存储过程,结合查询分析器对SQL的分析,可以对索引的优化做出很好的判断,但索引也不是万能的,在增删改较多的表,索引过多会引起这些操作的性能下降,所以判断还是需要一定的经验。同时针对用户使用频度最高的SQL进行优化也是最行之有效的,这时我则需要Precise,它可以观测某一个较长时间内的SQL语句的执行情况。数据库优化的潜能挖光后,如果还是达不到性能要求或是还有问题,则要从程序来进行优化,这是程序员做的事,测试人员要做的,就是告诉他们,哪个函数执行过多引起了性能下降,比如异常过多,某个循环过多,或是DCOM调用过多等等,但说服程序员也是一件不容易的事,你要在这一阶段做的出色一定要有几年的编程经验,并且要让程序员感到听你的性能会有提升,这是一件很不容易的事情哦。
内存的分析,一般是一个长期分析的过程,要做好不容易,首先要有长期奋战的准备,其
次内存泄漏的分析最好是放在单元测试之中同步进行,而不是要等到最后再去发现问题,当然出了问题也只好面对,一般这类问题都是在服务器运行了很久才暴露出来,一旦发现问题后,则需要定位问题,分析的原则采用子系统相互独立运行,找到最小问题的系统集,或是借助内存分析工具观察内存对象情况,初步定位问题,再用Purify进行运行时分析,通常C++ 内存问题比较多,Java与.NET比较少,一般由GC不合理引起。C++的内存错误就比较多了,主要常见的有:
1、 Array Bounds Read (ABR) :数组越界读
2、 Array Bounds Write (ABW):数组越界写
3、 Beyond stack Read (BSR):堆栈越界读
4、 Free Memory Read(FMR):空闲内存读
5、 Invalid pointer Read(IPR):非法指针阅读
6、 Null Pointer Read(NPR):空指针阅读
7、 Uninitialized Memory Read(UMR):未初始化内存读写
8、 Memory Leak:内存泄漏
注:如果需要更多的信息,可以参见Purify的帮助信息。
顺便提一句,为什么我要说单元测试时做这个比较好,由于单元测试针对的是单一功能,
这时结合单元测试案例做内存分析会更快的定位问题,同时由于问题较早的发现,则后期的风
险则会减少,当然如果结合代码覆盖工具PureCoverage 来做就更完美了。注:本篇只是对B/S应用的测试过程作一个整体的描述,对某一个阶段使用的工具只是作
大概的介绍,你也可使用你比较熟悉的工具达到相同的目标。
2011年03月21日
Web的系统测试方法
随着Internet和Intranet/Extranet的快速增长,Web已经对商业、工业、银行、财政、教育、政府和娱乐及我们的工作和生活产生了深远的影响。许多传统的信息和数据库系统正在被移植到互联网上,电子商务迅速增长,早已超过了国界。范围广泛的、复杂的分布式应用正在Web环境中出现。Web的流行和无所不在,是因为它能提供支持所有类型内容连接的信息发布,容易为最终用户存取。
Yogesh Deshpande和Steve Hansen在1998年就提出了Web工程的概念。Web工程作为一门新兴的学科,提倡使用一个过程和系统的方法来开发高质量的基于Web的系统。它"使用合理的、科学的工程和管理原则,用严密的和系统的方法来开发、发布和维护基于Web的系统"。目前,对于web工程的研究主要是在国外开展的,国内还刚刚起步。 在基于Web的系统开发中,如果缺乏严格的过程,我们在开发、发布、实施和维护Web的过程中,可能就会碰到一些严重的问题,失败的可能性很大。而且,随着基于Web的系统变得越来越复杂,一个项目的失败将可能导致很多问题。当这种情况发生时,我们对Web和Internet的信心可能会无法挽救地动摇,从而引起Web危机。并且,Web危机可能会比软件开发人员所面对的软件危机更加严重、更加广泛。
在Web工程过程中,基于Web系统的测试、确认和验收是一项重要而富有挑战性的工作。基于Web的系统测试与传统的软件测试不同,它不但需要检查和验证是否按照设计的要求运行,而且还要测试系统在不同用户的浏览器端的显示是否合适。重要的是,还要从最终用户的角度进行安全性和可用性测试。然而,Internet和Web媒体的不可预见性使测试基于Web的系统变得困难。因此,我们必须为测试和评估复杂的基于Web的系统研究新的方法和技术。 一般软件的发布周期以月或以年计算,而Web应用的发布周期以天计算甚至以小时计算。Web测试人员必须处理更短的发布周期,测试人员和测试管理人员面临着从测试传统的C/S结构和框架环境到测试快速改变的Web应用系统的转变。
一、功能测试1、 链接测试
链接是Web应用系统的一个主要特征,它是在页面之间切换和指导用户去一些不知道地址的页面的主要手段。链接测试可分为三个方面。首先,测试所有链接是否按指示的那样确实链接到了该链接的页面;其次,测试所链接的页面是否存在;最后,保证Web应用系统上没有孤立的页面,所谓孤立页面是指没有链接指向该页面,只有知道正确的URL地址才能访问。
链接测试可以自动进行,现在已经有许多工具可以采用。链接测试必须在集成测试阶段完成,也就是说,在整个Web应用系统的所有页面开发完成之后进行链接测试。
2、表单测试
当用户给Web应用系统管理员提交信息时,就需要使用表单操作,例如用户注册、登陆、信息提交等。在这种情况下,我们必须测试提交操作的完整性,以校验提交给服务器的信息的正确性。例如:用户填写的出生日期与职业是否恰当,填写的所属省份与所在城市是否匹配等。如果使用了默认值,还要检验默认值的正确性。如果表单只能接受指定的某些值,则也要进行测试。例如:只能接受某些字符,测试时可以跳过这些字符,看系统是否会报错。
3、Cookies测试
Cookies通常用来存储用户信息和用户在某应用系统的操作,当一个用户使用Cookies访问了某一个应用系统时,Web服务器将发送关于用户的信息,把该信息以Cookies的形式存储在客户端计算机上,这可用来创建动态和自定义页面或者存储登陆等信息。
如果Web应用系统使用了Cookies,就必须检查Cookies是否能正常工作。测试的内容可包括Cookies是否起作用,是否按预定的时间进行保存,刷新对Cookies有什么影响等。
4、设计语言测试
Web设计语言版本的差异可以引起客户端或服务器端严重的问题,例如使用哪种版本的HTML等。当在分布式环境中开发时,开发人员都不在一起,这个问题就显得尤为重要。除了HTML的版本问题外,不同的脚本语言,例如Java、JavaScript、 ActiveX、VBScript或Perl等也要进行验证。 5、数据库测试
在Web应用技术中,数据库起着重要的作用,数据库为Web应用系统的管理、运行、查询和实现用户对数据存储的请求等提供空间。在Web应用中,最常用的数据库类型是关系型数据库,可以使用SQL对信息进行处理。
在使用了数据库的Web应用系统中,一般情况下,可能发生两种错误,分别是数据一致性错误和输出错误。数据一致性错误主要是由于用户提交的表单信息不正确而造成的,而输出错误主要是由于网络速度或程序设计问题等引起的,针对这两种情况,可分别进行测试。 二、性能测试
1、连接速度测试
用户连接到Web应用系统的速度根据上网方式的变化而变化,他们或许是电话拨号,或是宽带上网。当下载一个程序时,用户可以等较长的时间,但如果仅仅访问一个页面就不会这样。如果Web系统响应时间太长(例如超过5秒钟),用户就会因没有耐心等待而离开。
另外,有些页面有超时的限制,如果响应速度太慢,用户可能还没来得及浏览内容,就需要重新登陆了。而且,连接速度太慢,还可能引起数据丢失,使用户得不到真实的页面。
2、负载测试
负载测试是为了测量Web系统在某一负载级别上的性能,以保证Web系统在需求范围内能正常工作。负载级别可以是某个时刻同时访问Web系统的用户数量,也可以是在线数据处理的数量。例如:Web应用系统能允许多少个用户同时在线?如果超过了这个数量,会出现什么现象?Web应用系统能否处理大量用户对同一个页面的请求?
3、压力测试
负载测试应该安排在Web系统发布以后,在实际的网络环境中进行测试。因为一个企业内部员工,特别是项目组人员总是有限的,而一个Web系统能同时处理的请求数量将远远超出这个限度,所以,只有放在Internet上,接受负载测试,其结果才是正确可信的。
进行压力测试是指实际破坏一个Web应用系统,测试系统的反映。压力测试是测试系统的限制和故障恢复能力,也就是测试Web应用系统会不会崩溃,在什么情况下会崩溃。黑客常常提供错误的数据负载,直到Web应用系统崩溃,接着当系统重新启动时获得存取权。
压力测试的区域包括表单、登陆和其他信息传输页面等。
三、可用性测试
1、导航测试
导航描述了用户在一个页面内操作的方式,在不同的用户接口控制之间,例如按钮、对话框、列表和窗口等;或在不同的连接页面之间。通过考虑下列问题,可以决定一个Web应用系统是否易于导航:导航是否直观?Web系统的主要部分是否可通过主页存取?Web系统是否需要站点地图、搜索引擎或其他的导航帮助?
在一个页面上放太多的信息往往起到与预期相反的效果。Web应用系统的用户趋向于目的驱动,很快地扫描一个Web应用系统,看是否有满足自己需要的信息,如果没有,就会很快地离开。很少有用户愿意花时间去熟悉Web应用系统的结构,因此,Web应用系统导航帮助要尽可能地准确。
导航的另一个重要方面是Web应用系统的页面结构、导航、菜单、连接的风格是否一致。确保用户凭直觉就知道Web应用系统里面是否还有内容,内容在什么地方。
Web应用系统的层次一旦决定,就要着手测试用户导航功能,让最终用户参与这种测试,效果将更加明显。
2、图形测试
在Web应用系统中,适当的图片和动画既能起到广告宣传的作用,又能起到美化页面的功能。一个Web应用系统的图形可以包括图片、动画、边框、颜色、字体、背景、按钮等。图形测试的内容有:
(1)要确保图形有明确的用途,图片或动画不要胡乱地堆在一起,以免浪费传输时间。Web应用系统的图片尺寸要尽量地小,并且要能清楚地说明某件事情,一般都链接到某个具体的页面。
(2)验证所有页面字体的风格是否一致。
(3)背景颜色应该与字体颜色和前景颜色相搭配。
(4)图片的大小和质量也是一个很重要的因素,一般采用JPG或GIF压缩。
3、内容测试
内容测试用来检验Web应用系统提供信息的正确性、准确性和相关性。
信息的正确性是指信息是可靠的还是误传的。例如,在商品价格列表中,错误的价格可能引起财政问题甚至导致法律纠纷;信息的准确性是指是否有语法或拼写错误。这种测试通常使用一些文字处理软件来进行,例如使用Microsoft Word的"拼音与语法检查"功能;信息的相关性是指是否在当前页面可以找到与当前浏览信息相关的信息列表或入口,也就是一般Web站点中的所谓"相关文章列表"。
4、整体界面测试
整体界面是指整个Web应用系统的页面结构设计,是给用户的一个整体感。例如:当用户浏览Web应用系统时是否感到舒适,是否凭直觉就知道要找的信息在什么地方?整个Web应用系统的设计风格是否一致?
对整体界面的测试过程,其实是一个对最终用户进行调查的过程。一般Web应用系统采取在主页上做一个调查问卷的形式,来得到最终用户的反馈信息。
对所有的可用性测试来说,都需要有外部人员(与Web应用系统开发没有联系或联系很少的人员)的参与,最好是最终用户的参与。
四、客户端兼容性测试
1、平台测试
市场上有很多不同的操作系统类型,最常见的有Windows、Unix、Macintosh、Linux等。Web应用系统的最终用户究竟使用哪一种操作系统,取决于用户系统的配置。这样,就可能会发生兼容性问题,同一个应用可能在某些操作系统下能正常运行,但在另外的操作系统下可能会运行失败。
因此,在Web系统发布之前,需要在各种操作系统下对Web系统进行兼容性测试。
2、浏览器测试
浏览器是Web客户端最核心的构件,来自不同厂商的浏览器对Java,、JavaScript、 ActiveX、 plug-ins或不同的HTML规格有不同的支持。例如,ActiveX是Microsoft的产品,是为Internet Explorer而设计的,JavaScript是Netscape的产品,Java是Sun的产品等等。另外,框架和层次结构风格在不同的浏览器中也有不同的显示,甚至根本不显示。不同的浏览器对安全性和Java的设置也不一样。
测试浏览器兼容性的一个方法是创建一个兼容性矩阵。在这个矩阵中,测试不同厂商、不同版本的浏览器对某些构件和设置的适应性。
五、安全性测试
Web应用系统的安全性测试区域主要有:
(1)现在的Web应用系统基本采用先注册,后登陆的方式。因此,必须测试有效和无效的用户名和密码,要注意到是否大小写敏感,可以试多少次的限制,是否可以不登陆而直接浏览某个页面等。
(2)Web应用系统是否有超时的限制,也就是说,用户登陆后在一定时间内(例如15分钟)没有点击任何页面,是否需要重新登陆才能正常使用。
(3)为了保证Web应用系统的安全性,日志文件是至关重要的。需要测试相关信息是否写进了日志文件、是否可追踪。
(4)当使用了安全套接字时,还要测试加密是否正确,检查信息的完整性。
(5)服务器端的脚本常常构成安全漏洞,这些漏洞又常常被黑客利用。所以,还要测试没有经过授权,就不能在服务器端放置和编辑脚本的问题。
六、总结
本文从功能、性能、可用性、客户端兼容性、安全性等方面讨论了基于Web的系统测试方法。
基于Web的系统测试与传统的软件测试既有相同之处,也有不同的地方,对软件测试提出了新的挑战。基于Web的系统测试不但需要检查和验证是否按照设计的要求运行,而且还要评价系统在不同用户的浏览器端的显示是否合适。重要的是,还要从最终用户的角度进行安全性和可用性测试。Web下的整体测试
B/S下的功能测试比较简单,关键是如何做好性能测试。目前大多数的测试人员认为只要跑一些测试工具证明我的产品是可以达到性能的就ok了,为了证明而去测试是没有任何价值的,关键是要发现产品性能上的缺陷,定位问题,解决问题,这才是测试要做的。首先我们从两个方面分析如何进行WEB测试,从技术实现上来讲一般的B/S结构,无论是.NET还是J2EE,都是多层构架,有界面层,业务逻辑层,数据层。而从测试的流程上来说,首先是发现问题,分析问题,定位问题,再由开发人员解决问题。那么B/S的结构的测试如何来做?如何发现问题是我首先要介绍的,在做WEB测试之前你需要一些资料,比如产品功能说明书,性能需求说明书,不一定很完善,但一定要有,明确测试目标,这是基本的常识,可是我往往看到的是已经开始动手测了,但还不知自己的系统要达到的性能指标是什么。这里我简单讲一下测试的性能指标:1、通用指标(指Web应用服务器、数据库服务器必需测试项):
* ProcessorTime: 指服务器CPU占用率,一般平均达到70%时,服务就接近饱和;
* Memory Available Mbyte : 可用内存数,如果测试时发现内存有变化情况也要注意,如果
是内存泄露则比较严重;
* Physicsdisk Time : 物理磁盘读写时间情况;
2、Web服务器指标:
* Avg Rps: 平均每秒钟响应次数=总请求时间 / 秒数;
* Avg time to last byte per terstion (mstes):平均每秒业务角本的迭代次数 ,有人会
把这两者混淆;
* Successful Rounds:成功的请求;
* Failed Rounds :失败的请求;
* Successful Hits :成功的点击次数;
* Failed Hits :失败的点击次数;
* Hits Per Second :每秒点击次数;
* Successful Hits Per Second :每秒成功的点击次数;
* Failed Hits Per Second :每秒失败的点击次数;
* Attempted Connections :尝试链接数;
3、数据库服务器指标:
* User 0 Connections :用户连接数,也就是数据库的连接数量;
* Number of deadlocks:数据库死锁;
* Butter Cache hit :数据库Cache的命中情况;上面的指标只是一些通用的指标,起到抛砖引玉的作用,对于不同的应用你还必需作相应的调整,比如程序使用的是.NET技术的,则必需加入一些针对性的测试指标。对于这些指标的详细了解,你可以参考Windows 下面的 SystemMonitor的帮助与LoadRunner、ACT的帮助。对于发现问题,指标的设置非常重要,它会帮你定性的发现一些错误。对于定性的压力测试我就不做过多的分析,工具很多,流行的主要有LoadRunner,ACT,WAS,WebLoad,各个工具有它的使用范围,其中我各个认为LoadRunner 最全面,它提供了多种协议的支持,对复杂的压力测试都可以胜任,WAS与ACT则对微软的技术支持的比较好,其中WAS支持分布式机群测试,ACT则是与.NET集成比较好,支持ViewState (.NET 下控件缓存的支持)的测试,当时我用时,其它测试工具还不支持,现在应该支持了吧,呵呵。在这一阶段测试你要不断的跟据系数的测试目标进行变化,一开始由于系统过于庞大,所以我们要分成若干个子系统,各个子系统的性能目标必需明确,主要是并发指标定一个阀值,同时设定一些与系统相关的测试参数,应用服务器,数据库服务器都要有,对达不到阀值的与一些通用参数有问题的子系统进行深入分析。比如它的并发达不到你的要求,证明子系统性能有问题,或是数据库用户连接过高,程序没有释放用户连接等等。这个我们要对子系统进行详细测试,由于B/S 结构下,图片的请求对性能的影响较大,所以我们对子系统测试时要分两个部分进行,一、非程序部分,即图片等等;二、应用程序本身。通过事务或函数的分离,可以把这两块实现单独的测试,具体做法参考各个工具的手册,我这里就不做说明。对子系统的测试参数的设置要求则更高,它有助你后面精确的定位问题,比如对异常,死锁,网络流量等等前面没有注意到的情况的增加,同时你要注意增加测试参数的收集对系统的性能影响比较大,所以一般不要超过10个,刚刚介绍的整体的性能测试指标也不要增加很多,这样影响会小一点。最后在这一阶段要说明的是数据库的数据量会很大程度的影响性能,所以要根据前面的性能需求说明书向数据库中模拟相应的数据量,来进行测试,这样才有更高的可信度。
上面所说的是对问题的发现,下面就是分析问题原因,这一步的要求比较高,一般由测试人员与程序员配合完成,当然如果你有相当的开发经验,再做这方面的测试,就更为难得。下面我们说说如何精确定位问题,出现问题的可能性可能有很多种,大致分以下几种,一、性能达不到目标;二、性能达到目标,但有一些其它的问题,比如异常,死锁,缓存命中过低,网络流量较大;三、服务器稳定性的问题,比如内存泄漏……。要发现这些问题起马的要求要有一款使用的比较称心的性能分析与优化工具,比如微软的.NET下就有自己开发的工具,对Borland的Java开发工具中也有类似的工具,但我个人认为更好的工具是Rose下的Purify与Quantify,主要是他对.net 与java ,C++都有支持,而且分析效果特别专业,我们先了解一下Rational Purify, Rational Purify 能自动找出Visual C/C++ 和Java 代码中与内存有关的错误,确保整个应用程序的质量和可靠性。在查找典型的Visual C/C++ 程序中的传统内存访
问错误,以及Java,C# 代码中与垃圾内存收集相关的错误方面;Rational Quantity 则是一款针对函数级的性能分析利器,使用它你可以从图形化的界面中得到函数调用的时间,百分比与次数,以及子函数所占时间,使你可以更快的定位性能瓶颈。我们先说性能优化与异常的处理,性能优化有一个原则,即用时间比例最大的进行优化,效果才最明显,比如有个函数它的执行时间为30秒,如果你优化了一百倍则执行时间为0.3秒,提升了29.7秒,而如果它的执行时间为0.3秒,优化后为0.003秒,实际提升了0.297秒,提升的效果并不明显,而且写过程序的人都知道,后者性能优化的代价更大。在性能优化的过程中,一般是先数据库,后程序,因为数据库的优化不需要修改程序,修改的风险很小。但如何才能确定是数据库的问题,这就需要技巧,在使用Quantity时,你一路分析下去,大多数最终会发现,是数据库查询函数占用时间比较大,比如什么,SqlCmd.ExecuteNoQuery等等数据库执行函数,这时你就需要分析数据库,呵呵。数据库的分析原则是先索引,后存储过程,最后表结构视图的优化,索引的优化是最简单也是通常最有效的方法,如果合理的使用会带来意想不到不到的效果。在这里我要给大家简单的介绍一下我的最爱,SQLProfile,SQL查询分析器,Precise,SQLProfile是一个SQL语句跟踪器,可以跟踪程序流程使用的SQL语句与存储过程,结合查询分析器对SQL的分析,可以对索引的优化做出很好的判断,但索引也不是万能的,在增删改较多的表,索引过多会引起这些操作的性能下降,所以判断还是需要一定的经验。同时针对用户使用频度最高的SQL进行优化也是最行之有效的,这时我则需要Precise,它可以观测某一个较长时间内的SQL语句的执行情况。数据库优化的潜能挖光后,如果还是达不到性能要求或是还有问题,则要从程序来进行优化,这是程序员做的事,测试人员要做的,就是告诉他们,哪个函数执行过多引起了性能下降,比如异常过多,某个循环过多,或是DCOM调用过多等等,但说服程序员也是一件不容易的事,你要在这一阶段做的出色一定要有几年的编程经验,并且要让程序员感到听你的性能会有提升,这是一件很不容易的事情哦。
内存的分析,一般是一个长期分析的过程,要做好不容易,首先要有长期奋战的准备,其
次内存泄漏的分析最好是放在单元测试之中同步进行,而不是要等到最后再去发现问题,当然出了问题也只好面对,一般这类问题都是在服务器运行了很久才暴露出来,一旦发现问题后,则需要定位问题,分析的原则采用子系统相互独立运行,找到最小问题的系统集,或是借助内存分析工具观察内存对象情况,初步定位问题,再用Purify进行运行时分析,通常C++ 内存问题比较多,Java与.NET比较少,一般由GC不合理引起。C++的内存错误就比较多了,主要常见的有:
1、 Array Bounds Read (ABR) :数组越界读
2、 Array Bounds Write (ABW):数组越界写
3、 Beyond stack Read (BSR):堆栈越界读
4、 Free Memory Read(FMR):空闲内存读
5、 Invalid pointer Read(IPR):非法指针阅读
6、 Null Pointer Read(NPR):空指针阅读
7、 Uninitialized Memory Read(UMR):未初始化内存读写
8、 Memory Leak:内存泄漏
注:如果需要更多的信息,可以参见Purify的帮助信息。
顺便提一句,为什么我要说单元测试时做这个比较好,由于单元测试针对的是单一功能,
这时结合单元测试案例做内存分析会更快的定位问题,同时由于问题较早的发现,则后期的风
险则会减少,当然如果结合代码覆盖工具PureCoverage 来做就更完美了。注:本篇只是对B/S应用的测试过程作一个整体的描述,对某一个阶段使用的工具只是作
大概的介绍,你也可使用你比较熟悉的工具达到相同的目标。