OscarXie.net

关注质量与体验——电子商务与自动化测试

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
七、WebTest的常见问题与解决
录制好一个WebTest,加上各种规则,编辑后运行并不会像我们想象的那么顺利成功,往往会碰到很多问题,运行不成功的情况比较多,这样我们就遇到了如何解决这些问题的情形。
1、使用 Web Test Viewer 验证 Web 测试  
•为了确保一个WebTest在添加到一个负载测试中能够长期运行,需要保证WebTest能够按预期的方式正常工作。
•Web Test Viewer能够提供在运行WebTest时对其监视,并查看测试运行时的所有动作。
•要验证一个新建的 Web 测试是否过载,只需查看该测试运行的结果并查明它是否通过。 *
对于一个不具有验证规则的 Web 测试而言,通过只意味着没有引发异常,没有规则失败,而且没有出现 HTTP 错误。对于验证而言,除了确保无错误执行外,还包括确保 Web 测试在目标 Web 应用程序上表现出正确的行为。重要的是查看每个请求的响应以确保它是正确的。
•下表列出验证 Web 测试时需要查看的项,以及有关每种问题类型的附加信息。
 
2、常见的 Web 测试问题
WebTest的弱点
      简单的记录和回放不适用某些网站
      不能记录JavaScript请求(Ajax、图片等)
      不能记录胖客户端的Web应用请求
      不能测试客户端代码
因此界面测试推荐手工测试
导航测试
      导航直观、清晰
      整体结构、页面结构
图形测试
      图片、动画、颜色、边框、字体、背景、按钮
      风格、大小、用途
表格测试
      表格风格、布局、一致性

常见问题
1、Web 服务器在执行过程和记录过程中的不同响应
      在理想情况是:您会将一组请求记录到 Web 应用程序,运行该 Web 测试,从服务器接收您在记录过程中看到的相同响应。但遗憾的是,Web 应用程序有时在 Web 测试的执行与记录过程中的行为表现完全不同。
     出现这种问题的原因有多种,通常导致如下所示的错误:
      Request failed: $HIDDEN1.__VIEWSTATE not found in test context.
     当 Web 测试尝试在它无法定位的 Web 测试上下文中使用隐藏字段,并从它接收的前一响应页进行提取操作时,会发生该错误。
 

•服务器之所以在执行过程和记录过程中有不同的响应,有以下原因:
Ø一次性数据
当一个 Web 应用程序创建一个唯一的用户名时。在不添加数据绑定或随机值的情况下运行这种 Web 测试,可能导致 Web 应用程序在该测试尝试创建重复的用户名时显示错误。 
解决:数据绑定

ØJavaScript 重定向
使用 JavaScript 重定向(设置 window.location)的 Web 应用程序可能在执行中和记录中进行不同的响应,因为Web 测试引擎不运行脚本代码。
解决:插入该脚本重定向到的 URL,并从执行重定向的页将所需的提取规则移到新请求

Ø重定向到错误页
当出现服务器错误时,Web 应用程序可能重定向到错误页,但并不返回一个 HTTP 400 500 级别响应代码。
错误原因:Web 应用程序自身有问题,或者 Web 测试发出的请求有问题。
 

上图两次请求登陆页面
 
Ø处理视图状态和其他动态参数
ASP.NET 1.0 引入 __VIEWSTATE 隐藏窗体字段之前,Web 应用程序就已经使用动态生成的窗体和查询字符串参数在页面间传递信息了。这些动态参数在 Web 测试中需要特殊考虑,因为每次 Web 测试运行时,它们都可能更改。具有硬编码参数值的 Web 测试在记录后不可能长时间工作,甚至根本无法工作。
Web 测试使用提取规则和上下文绑定启用具有动态参数的测试。提取规则位于包含动态值的页面请求中。当提取规则运行时,它使用诸如“myparam这样的可配置名将动态值提取到 Web 测试上下文中。然后,后续请求包含一个具有值 {{myparam}} 的查询字符串或窗体参数。当 Web 测试运行时,Web 测试上下文中的值替换为 {{myparam}}

提取规则的事件序列如下所示:

•Web 测试引擎开始执行 Request1

•Request1 发送到目标服务器。

从目标服务器接收一个响应。

针对 Request1 的提取规则在响应页上运行。

提取规则在 Web 测试上下文中放置一个项。

•Web 测试引擎开始执行 Request2

查询字符串参数、窗体参数和 Request2 上其他任何上下文绑定的值从 Web 测试上下文替换。

•Request2 发送到目标服务器。


Ø自动隐藏字段跟踪
Web 测试包含用于处理动态隐藏字段(例如,__VIEWSTATE)的特殊支持。当记录一个 Web 测试时,隐藏字段自动与窗体和查询字符串参数匹配。当发现匹配时,ExtractHiddenFields 规则应用于生成隐藏字段源的请求。此时,上下文绑定应用于该请求的参数,从而利用隐藏字段。
ExtractHiddenFields 是一个特殊的提取规则,因为与将值提取到上下文的规则不同,它将页上的每个隐藏字段值提取到 Web 测试上下文。普通的提取规则使用 ContextParameter 属性确定用于上下文参数的名称,但是,ExtractHiddenFields 使用该属性仅用于区分可能同时存在于上下文中的多组隐藏字段。例如,其 ContextParameter 设置为 1 ExtractHiddenFields 规则将提取 __VIEWSTATE 作为“$Hidden1.__VIEWSTATE”。 

Ø修复 __EVENTTARGET 以及其他由 JavaScript 修改的隐藏窗体字段
当隐藏字段由 Javascript OnClick 事件处理程序中修改时,可能会错误地应用自动隐藏字段绑定。这是 Visual Studio 2005 发布版本中的一个已知的错误。
对于 ASP.NET 站点,该问题通常在 Web 控件调用 __doPostBack() JavaScript 方法设置如上所示的 __EVENTTARGET 隐藏字段时发生。自动隐藏字段绑定让窗体参数具有诸如 {{$HIDDEN1.__EVENTTARGET}} 这样的值,而不是实际值 btnNext。要更正该问题,必须将参数值设置为要在 Javascript 中设置的值(例如,btnNext)。

3、辅助工具Fiddler 
由于某些请求(例如,AJAX 请求和一些弹出窗口)不可能由 Web Test Recorder 进行记录 ,Eric Lawrence 编写了一个称为 Fiddler 的 工具。
Fiddler 用作代理服务器,可以截获所有 HTTP 通信量(仍不具有 SSL 支持,不过从2.0版本开始支持了),使用 Fiddler 可以更正一个无法用标准 Web Test Recorder 进行记录的 Web 测试。
http://www.fiddlertool.com
http://www.fiddler2.com  2.0版本开始支持SSL
Fiddler使用说明
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/IETechCol/dnwebgen/IE_IntroFiddler.asp?frame=true
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/IETechCol/dnwebgen/IE_Fiddler2.asp?frame=true

从 Fiddler 保存 Web 测试
      当 Web Test Recorder 丢失一些 AJAX、ActiveX 或弹出窗口请求时,一个选项用于使用 Fiddler 记录整个测试。Fiddler 可以将一系列捕获的请求保存为可以添加到 Visual Studio 2005 测试项目的 .webtest 文件。
      当无法使用 Web 测试记录器记录大量请求时,该选项最为适用。该选项的主要限制是,Fiddler 创建的 Web 测试不使用自动隐藏字段跟踪(例如,针对 __VIEWSTATE),而且不筛选诸如图像、CSS 和 JavaScript 的依赖请求。
      缺点:录制所有的信息,没有清晰的结构

将保存的WebTest文件加入到测试项目中,可以发现结构没有使用记录器录制的清晰

最后可以考虑使用录制的WebTest和使用Fidder录制后手动添加请求相结合的方式来完善WebTest
从 Fiddler 手动添加请求
      对于丢失请求的另一个选项是:使用 Fiddler 确定需要将哪些请求手动添加到 Web 测试。当 Web Test Recorder 丢失少量请求时,该方法最适用,因为您仍然可以受益于诸如自动隐藏字段跟踪和依赖请求筛选这样的功能。
     在本例中,最好同时使用 Fiddler 和 Web 测试记录器记录 Web 测试。这使您能够比较这两个记录来发现丢失的请求。如果明显丢失了一个请求(例如,如果您知道发生了一个 AJAX 请求),则在记录过程中插入一个注释也是很有帮助的。该注释作为手动创建请求的占位符。
      注意:需要将任何所需的提取规则、用于参数值的上下文绑定以及 ThinkTime 添加到手动创建的请求。



4、使用编码的WebTest
可以通过生成编码的WebTest来编程调试解决问题,关于编码的WebTest在前面已经提到过,比如使用分支,循环等控制。
posted on 2007-05-13 21:58  oscarxie  阅读(2118)  评论(1编辑  收藏  举报