4.哪个层真正的引起了那个问题?
在Web系统中的错误通常是很难一直重现因为许多由C/S架构的分布式特性而引入的许多变量。(例如,服务器,客户端和网络组件)。在一个web环境中至少由3个常见的怀疑部分:客户端,服务器和网络。客户端和服务器都会携带诶之和兼容性问题,那些和PC环境相似,所有的组件都在一个盒子里。在C/S系统里,问题成倍的增长,然而,由于可能有很多的客户端和服务器链接在一个网络中。典型的C/S配置和兼容性问题涉及到硬件和操作系统的混合(例如,基于UNIX的vs基于windows的盒子)以及在服务器端的软件组合(Web服务器包,数据库服务器包,防火墙,COM对象,CORBA对象等等)。问题也可能涉及客户端的软件组合(TCP/IP堆栈,拨号软件,帮助组件,浏览器带宽和浏览器版本)。另外,浏览器设置,例如一些常见的设置,连接设置,安全设置(包括ActiveX空间,插件,Java,脚本,下载,用户认证等等),内容设置,程序设置,和其他高级设置(包括浏览器选项,多媒体选项,JVM选项,打印选项和HTTP选项)引入很多可以被测试并分析的变量。
网络提供了另一套变量。网络用几个方式影响着Web应用程序,包括由于带宽和响应时间引起的分时相关的问题(竞态条件,性能,超时等等),由于硬件设备例如网关和路由器导致的潜在的配置和兼容性问题,以及和安全实现相关的端问题。
5.静态和动态操作环境是不同的
一般来说,有两类操作环境-每个都有自己独一无二的测试牵连:
静态环境(例如配置和兼容性错误)不兼容性问题可能存在其中,不管可变的条件,例如处理速度和可用的内存
动态环境(例如资源及时间相关的错误)其他方面可兼容的组件可能出现错误在其中,由于内存相关的错误和反应时间条件(我们将在这一节中更详尽的探讨动态环境)
静态操作环境:配置和兼容性变量
配置和兼容性问题可能会出现在web系统中的任何一个点上:客户端,服务器端,或网络中。配置问题包括不同的服务器软件和硬件设置,浏览器设置,网络连接,和TCP/IP堆栈设置。浏览器设置/ 前面提到的JavaScript例子说明了配置问题的一种类型。图1和图2展示的是另一个配置问题的类型,两种可能的物理服务器配置:one-box 和two-box配置。
我们用来示范的所测试应用程序有一些制图的功能,可以让用户生成度量报告,例如条形图和直线图。当用户请求一个度量报告时,应用程序服务器执行的伪码如下:
1.连接服务器并运行查询,
2.编写查询结果到一个名为c:\temp\chart.val的文件中,
3.执行Chart的JavaApplet。从c:\temp\chart.val文件中读取数据以生成一个图表
4.发送JavaApplet到浏览器
在测试这个应用程序过程中,我发现图表功能可以在以上的配置上运行,但是却不能在其他配置上工作。在我更进一步的研究之后,我认识到问题可能出现在two-box配置中。在检查代码之后,我认识到问题在步骤2和3中。在步骤2中,查询结果被写到数据库服务器本地驱动器中c:\temp\chart.val。在步骤3里,Chart JavaApplet是运行在应用服务器上而不是和数据库服务器在一个相同的盒中。当它试图在应用服务器本地驱动器中打开c:\temp\chart.val文件时,文件并不存在。
在这个用例中,我不建议在遇到问题时就阅读代码,我把调试的工作留给开发人员。我只不过想指出识别哪个服务器配置是有问题的,并且在bug报告中含括这些信息。我也会在测试下的应用程序支持的全部的分别式配置下运行一个粗略的测试用例包。
配置问题在静态操作环境中也是很终于的。例如,在图3中我们看到在Netscape Navigator和IE浏览器的一个兼容性区别。
这个例子并不是要说IE比Netscape Navigator更好,它只不过意味着在浏览器之间有不兼容性问题-并且代码应该假设相对路径在所有的浏览器中都可以工作。更重要的是,它建议当你在一个环境中发现一个错误时,如果它是一个环境相关的错误的话,同样的错误可能不会出现在不同的环境中。
动态的操作环境:事情不会保持一样
当特定环境的属性值不是每次都在测试过程中保持常量时,它会引起操作环境变为动态。属性可以从资源特定(可用的RAM,磁盘空间等)转变为时间特定的(网络反应时间,用户要提交的交易顺序等)。
当一个测试用例取决于步骤集和操作环境的准确复制,然而(由于它的动态本质)操作环境不可能被复制,错误变得不可重现或很难重现。
顺便说一下,这也是内存相关错误通常较难重现的原因。当一个内存覆盖的错误出现在代码中时,例如,它常常会引起一个内存覆盖的问题。然而,从一个黑盒测试的角度看,我们永远没有机会看到这个错误的症状直到执行或读取特定的代码或数据溢出字节。在这个例子中,步骤集代表了黑盒测试的准确集合。内存覆盖错误代表了在代码中的真实的错误。被执行或读取的被覆盖的字节的条件代表了动态的操作环境或需要揭露(重现)错误的条件。
这是一个动态环境相关错误的Web应用程序例子,我们在其中将调查一个时间相关错误。功能说明书要求:
·在系统中的项目名称必须是唯一的
·为了可能的复制需要在客户端使用JavaScript来执行错误识别和处理
·用户将可以通过请求项目设置页面增加或删除项目名称
·当一个用户创建一个新的项目名称时,浏览器端的JavaScript检查输入的名称和内嵌在HTML页面中选择列表(如图4)。
看看图5中的时间相关的错误。在项目设置页面之前和之后的屏幕截图中说明了应用程序失败检测重名的“Doomed”。图4解释了这个时间相关的错误,它包括了两个用户增加新的项目名称到同一个数据库中。
如表1中所示,用户A和B同时创建新的项目,但是并不知道其他人的动作。在步骤3中,用户A增加了一个名为Another的项目。由于这个项目名称已经存在,他浏览器的JavaScript会显示一个提示他输入不同项目名称的信息。
用户B增加了一个项目名称为Doomed。她浏览器的JavaScript不会检测Doomed为一个已经存在的项目名并且添加它到数据库中并返回列表。更新过的项目名称列表被发送到用户B。
用户A随后添加相同名称Doomed到项目列表中。他浏览器的JavaScript没有在HTML列表中检测,因此Doomed会再次被添加到数据库中-同样到了返回的列表中。更新的项目名称列表被发送给用户A,并且包括两个Doomed的条目。
这个结果未能满足产品的说明书。除非这种情况出现在一个设计良好的测试用例,偶然发现这个错误并且试图重现它不是一个简单的工作。在这个例子中,实际的错误是应用程序在检查服务器端重名(除了客户端检查以外)的失误。这些步骤包括用户A的活动。通过用户B的活动创建了动态操作环境-这些活动对于用户A是隐藏的或不知道的。
总结
为了有效的在Web环境中分析并重现错误,你需要对操作环境有个掌握。你也需要理解环境特定的变量可能会影响你复制错误的能力。在应用程序有着这份文章中的一些技能,我希望你的Web测试经验将会更少的被挫败和更加开心。
记住没有任何东西将替代你的测试技能-你编写出好的测试用例,问相关what-if的问题,保留仔细的记录,并且有系统的研究难以重现的错误的能力。就是这些技巧不仅在寻找错误中给你提供帮助,而且也会帮助你发现那些和他们相关的隐藏错误。
文章来源于领测软件测试网 https://www.ltesting.net/