Web 测试的创作与调试技术

FLAC3D数值三轴测试 本文介绍了使用FLAC3D进行数值三轴测试的命令流程。通过建立圆柱体模型,设置Mohr-Coulomb本构模型及材料参数,施加边界条件和荷载,并定义Fish函数监测应变和应力。命令包括模型创建、网格划分、材料属性定义、边界约束、荷载施加以及结果监测等步骤。该流程可用于模拟岩土材料在三轴条件下的力学响应,为数值分析提供参考。完整代码可从指定链接下载获取。 阅读详情

Josh Christie
软件设计工程师
Microsoft Visual Studio 2005 - Web 和负载测试

适用于:
Visual Studio 2005 Team Suite
Visual Studio 2005 Team Edition for Software Testers

摘要:学习有关 Visual Studio 2005 Web 测试的更多知识,包括 Web 测试引擎和记录器如何工作,以及如何创建有效的 Web 测试。

*
本页内容
读者读者
简介简介
记录一个 Web 测试记录一个 Web 测试
运行并验证 Web 测试运行并验证 Web 测试
解决常见的 Web 测试问题解决常见的 Web 测试问题
深入研究进行编码的 Web 测试深入研究进行编码的 Web 测试
小结小结

读者

本文面向的测试人员和开发人员,是那些想丰富有关 Microsoft Visual Studio 2005 Team Edition for Software Testers 中 Web 测试功能经验的人员。

简介

Microsoft Visual Studio 2005 Team Edition for Software Testers 引入了一个全新的用于 Web 和负载测试的强大工具集。Web 应用程序的负载测试可跨多个计算机进行并模拟成千上万个用户,但其核心则是一个 Web 测试集合。本文针对的读者是这样一些测试和开发人员,他们想学习更多有关创建有效的 Web 测试并对它们进行调试,以确保按预期方式运行的技术。

记录一个 Web 测试

了解 Web Test Recorder

Web Test Recorder 挂钩到 Internet Explorer 对象模型,侦听不同的导航事件。该类记录的主要优点是,可以记录安全套接字层 (SSL) 和已验证身份的 Web 站点,而没有任何特殊的配置要求。

该记录方法的另一方面是,Web 测试中不记录诸如图像、级联样式表(cascading style sheet,CSS)文件和 JavaScript 文件这样的依赖请求。相反,这些依赖请求在 Web 测试执行过程中从 HTML 页中被分析出来并进行自动请求。该功能有助于 Web 测试能更好地还原装饰性的 Web 站点更改,使测试更关注于 Web 应用程序的实际使用。如果需要,也可以禁用该功能,方法是将请求的 ParseDependentRequests 属性设置为 false。

该记录方法的一个不足是,它可能无法记录由 JavaScript(例如,在 AJAX 站点上)、ActiveX 控件和某些类型的弹出窗口发出的请求,因为 Internet Explorer 无法始终引发所需的事件。在多数情况下,可手动地将丢失的请求添加回 Web 测试来解决这些问题,稍后将阐述这一点。

插入注释

在记录过程中插入注释有助于创建有效的 Web 测试,特别是当 Web 测试包含很多请求时。您应该使用注释来说明在 Web 测试的不同点应该采用什么逻辑操作,例如,“登录”、“将项 X 添加到购物车”等。当您稍后在 Web 测试编辑器中修改 Web 测试时,这些注释是非常有用的。

您也可以使用注释来说明需要添加什么样的验证规则以确保 Web 测试成功。较之于在 Web 测试编辑器中查看 HTTP 请求列表而言,在记录并查看页面时决定需要对每个请求进行哪些验证更容易进行。

谨记要记录 Think Time

Web 测试请求的 ThinkTime 属性是指用户在发出下一个请求之前花在当前页的“思考”时间。Think time 延迟用于在负载测试过程中估算实际用户的行为。由于 Think time 对 Web 测试可以生成的负载量会产生巨大的影响,因此在负载测试中可全面禁用它,以便将更大的负载应用到目标服务器。禁用 Think time 使您能够尽快发出对服务器的请求,而不会产生请求间的延迟。

Web 测试记录器在针对 Web 应用程序的请求进行记录时自动记录 Think time。在记录过程中,尝试估算用户通常在每个页面上将花费的时间。当记录完成后,查看针对每个请求记录的思考时间尤为重要。无意中造成的较长思考时间会极大地影响 Web 测试生成请求的速率。默认情况下,Think time 在 Web Test Viewer 中是关闭的。因此,较长的思考时间不可能立即体现出来。当 Think time 在 Web Test Viewer 中打开时,您将看到 HTTP 状态栏中显示“Thinking…[n]”,直到下一请求开始。默认情况下,Think time 在负载测试中打开。当暂停记录并输入注释时,Think time 计数器停止。

运行并验证 Web 测试

了解 Web 测试引擎

有关 Web 测试引擎需要了解的一个关键概念是,Web 测试在 HTTP 层工作。Web 测试包含一个 HTTP 请求列表;这些请求主要都是由查询字符串参数、窗体参数和针对 Web 服务器的 URL 组成的。Web 测试引擎执行这些 HTTP 请求,从服务器(一个或多个)检索响应,以及收集计时数据。

由于 Web 测试引擎在 HTTP 层起作用,因此它并不直接模拟客户端脚本,例如,JavaScript 或 ActiveX 控件。Web 测试关注在服务器上生成负载。因此,只影响 Web 页外观的客户端脚本对 Web 测试而言并不重要。那些在附加 HTTP 请求(例如,AJAX)中设置参数值或结果的客户端脚本影响服务器上的负载,而且可能需要手动修改 Web 测试来模拟该脚本。本文稍后将描述这些修改类型。

一个常见的误解是,由于记录发生在 Internet Explorer 中,因此认为 Web 测试必须使用 Internet Explorer 执行。事实并非如此。所有请求直接使用 Web 测试引擎执行;不发生与 Internet Explorer 或其他任何浏览器的交互。Web 测试引擎使用标准 HTTP 请求/响应消息直接与目标 Web 服务器通讯。

同样,在 Web Test Viewer 的 Web Browser 选项卡上嵌入的 Internet Explorer 控件只显示由 Web 测试引擎接收的响应页。Web 测试引擎将响应写入磁盘的临时位置,然后将临时文件加载到 Web Test Viewer 中的 Internet Explorer 控件。如果用于其他浏览器的页面没有在 Web Browser 选项卡上中正确显示,则使用 Response 选项卡对其进行验证。

另一个容易令人混淆的方面是,运行 Web 负载测试时可以选择不同的浏览器模板。这些浏览器模板只影响随每个请求发送的默认 HTTP 标头集。Web 服务器用于确定浏览器类型的关键标头是 UserAgent 标头。Web 测试引擎直接使用标准 HTTP 协议发出请求,而无论选择哪个浏览器模板。

使用 Web Test Viewer 验证 Web 测试

在将 Web 测试添加到一个负载测试并进行长期运行之前,重要的是确保该测试按预期方式正常工作。这就是引入 Web Test Viewer 的原因。Web Test Viewer 使您能够在运行 Web 测试时对其进行监视,并查看前一测试运行的所有方面。


图 1

要验证一个新建的 Web 测试是否过载,只需查看该测试运行的结果并查明它是否通过。例如,对于一个不具有验证规则的 Web 测试而言,通过只意味着没有引发异常,没有规则失败,而且没有出现 HTTP 错误。对于验证而言,除了确保无错误执行外,还包括确保 Web 测试在目标 Web 应用程序上表现出正确的行为。重要的是查看每个请求的响应以确保它是正确的。

下表列出验证 Web 测试时需要查看的项,以及有关每种问题类型的附加信息。

表 1
要检查的问题附加信息/解决方案

HTTP 请求错误

HTTP 错误由 400-599 范围内的一个响应状态代码表示。通常,一个 HTTP 错误包含一个指示该问题原因的响应体。

例如,“401 Unauthorized”错误可能指示用户名和密码需要在 Web 测试的根节点进行配置。“404 Not Found”错误可能指示 Web 应用程序从开始记录以来已经发生了更改。“500 Internal Server Error”通常指示 Web 应用程序中有错误。

未找到依赖请求

顶级请求可能由于它其中的一个依赖请求未被发现而导致失败。这可能指示 Web 应用程序的 HTML 有问题。可以通过禁用针对该请求的 ParseDependentRequests 属性避免这些错误。这样就防止依赖请求(例如,图像、CSS 和 javascript)被自动地分析为 HTML 并进行请求。

提取和验证规则失败

提取和验证规则失败在 Details 选项卡中显示。造成失败的原因通常是 Web 服务器返回了包含意外内容的页,例如,重定向到一个登录页或错误的页。

提取规则失败通常引起关于后续请求的错误,例如,“X was not found in the Web test context.”。

测试级异常

在 Web Test Viewer 中,测试级异常显示为最后一次成功请求后的节点。测试级异常包括 WebTestPlugins、PreWebTest 和 PostWebTest 事件处理程序中的异常,以及非特定于编码 Web 测试中具体请求的异常。

请求级异常

请求级异常导致单个请求失败,但允许 Web 测试继续。这些异常包括从 WebTestRequestPlugins、PreRequest 和 PostRequest 事件处理程序,以及提取和验证规则引发的异常。异常消息以及堆栈跟踪(如果可用)在 Web Test Viewer 中 Details 选项卡的底部显示。

服务器返回的错误页内容

要验证 Web 服务器返回正确的内容,通常在 Web Test Viewer 的 Web Browser 和 Response 选项卡中以可视化方式检查每个页面。

在验证 Web 测试工作正常之后,验证规则可用于自动处理该过程。

解决常见的 Web 测试问题

Web 服务器在执行过程和记录过程中的不同响应

在理想情况是:您会将一组请求记录到 Web 应用程序,运行该 Web 测试,从服务器接收您在记录过程中看到的相同响应。但遗憾的是,Web 应用程序有时在 Web 测试的执行与记录过程中的行为表现完全不同。

出现这种问题的原因有多种,通常导致如下所示的错误:

     Request failed: $HIDDEN1.__VIEWSTATE not found in test context.

当 Web 测试尝试在它无法定位的 Web 测试上下文中使用隐藏字段,并从它接收的前一响应页进行提取操作时,会发生该错误。

以下屏幕快照显示该问题由服务器错误引发时的情况。在倒数第二个请求中,服务器错误导致下一请求依赖的隐藏字段不存在于该页上。


图 2

服务器之所以在执行过程和记录过程中有不同的响应,有很多原因。以下几节汇总了较为常见的几个原因。在所有情况中,验证规则可以添加到请求以自动验证服务器响应正确的内容。

一次性数据

该问题的一个常见原因是一次性数据,例如,当一个 Web 应用程序创建一个唯一的用户名时。在不添加数据绑定或随机值的情况下运行这种 Web 测试,可能导致 Web 应用程序在该测试尝试创建重复的用户名时显示错误。

JavaScript 重定向

使用 JavaScript 重定向(设置 window.location)的 Web 应用程序可能在执行中和记录中进行不同的响应,因为该 Web 测试引擎不运行脚本代码。要轻松地解决这种问题,可以插入该脚本重定向到的 URL,并从执行重定向的页将所需的提取规则移到新请求。由于记录之后该问题会立即出现在 Web 测试中,因此,唯一可用的提取规则可能是 ExtractHiddenFields。

重定向到错误页

当出现服务器错误时,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)。

在记录中丢失的请求

正如在“了解 Web Test Recorder”部分中讨论的那样,某些请求(例如,AJAX 请求和一些弹出窗口)不可能由 Web Test Recorder 进行记录。庆幸的是,Eric Lawrence 编写了一个称为 Fiddler 的优秀工具,它对此很有帮助。Fiddler 用作代理服务器,可以截获所有 HTTP 通信量(仍不具有 SSL 支持)。下面描述的两个选项使用 Fiddler 来更正一个无法用标准 Web Test Recorder 进行记录的 Web 测试。


图 3

从 Fiddler 保存 Web 测试

当 Web Test Recorder 丢失一些 AJAX、ActiveX 或弹出窗口请求时,一个选项用于使用 Fiddler 记录整个测试。Fiddler 可以将一系列捕获的请求保存为可以添加到 Visual Studio 2005 测试项目的 .webtest 文件。

当无法使用 Web 测试记录器记录大量请求时,该选项最为适用。该选项的主要限制是,Fiddler 创建的 Web 测试不使用自动隐藏字段跟踪(例如,针对 __VIEWSTATE),而且不筛选诸如图像、CSS 和 JavaScript 的依赖请求。

从 Fiddler 手动添加请求

对于丢失请求的另一个选项是:使用 Fiddler 确定需要将哪些请求手动添加到 Web 测试。当 Web Test Recorder 丢失少量请求时,该方法最适用,因为您仍然可以受益于诸如自动隐藏字段跟踪和依赖请求筛选这样的功能。

在本例中,最好同时使用 Fiddler 和 Web 测试记录器记录 Web 测试。这使您能够比较这两个记录来发现丢失的请求。如果明显丢失了一个请求(例如,如果您知道发生了一个 AJAX 请求),则在记录过程中插入一个注释也是很有帮助的。该注释作为手动创建请求的占位符。

以下屏幕快照显示如何从 Fiddler 捕获手动创建请求。请记住,需要将任何所需的提取规则、用于参数值的上下文绑定以及 ThinkTime 添加到手动创建的请求。


图 4


图 5

深入研究进行编码的 Web 测试

普通的 Web 测试旨在处理大量的 Web 测试方案。尽管数据绑定、提取规则、插件和上下文参数提供了对 Web 测试执行的大量控制,但有时甚至需要更多的控制。通过提供可在 Visual C# 或 Visual Basic 中使用的 .NET API,进行编码的 Web 测试能提供最多的控制和可扩展性。通过该 API,您可以使用 Web 测试引擎的全部功能,包括下一节中描述的功能。

生成代码的时机与原因

只有在正常的 Web 测试达到极限后,才能生成进行编码的 Web 测试。在正常的 Web 测试中,最明显的限制是循环(您无法多次运行请求的子集)和分支(您无法有条件地执行一组请求)。生成代码的其他原因包括细粒度的事件处理以及以编程方式设置参数值。

使用图形化的 Web 测试编辑器编辑 Web 测试比直接编辑代码更容易且较少出错。因此,在生成代码之前,您应该尽可能地获得 Web 测试。这包括添加提取和验证规则,设置数据绑定,创建针对请求组的事务,以及调整思考时间。针对 Web 测试所有这些方面而生成的代码,为深入进行自定义编码的 Web 测试奠定了牢固的基础。

以下几节演示需要对 Web 测试进行编码(或通过编码将明显简化)的一些功能和示例。

分支

当 Web 测试必须有条件地发出不同的请求集时,进行 Web 测试的编码。

以下示例对这一点进行演示,其中 Web 测试使用数据绑定的用户凭据登录到 Web 站点,如果用户在该系统中不存在,必须创建一个新用户帐户。

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.VisualStudio.TestTools.WebTesting;
using Microsoft.VisualStudio.TestTools.WebTesting.Rules;

[DataSource("DataSource1", "Provider=Microsoft.Jet.OLEDB.4.0;Data 
Source=/"test.mdb/"", DataBindingAccessMethod.Sequential, "Credentials")]
[DataBinding("DataSource1", "Credentials", "UserName", 
"DataSource1.Credentials.UserName")]
[DataBinding("DataSource1", "Credentials", "Password", 
"DataSource1.Credentials.Password")]
public class BranchingCoded : WebTest
{
  public BranchingCoded()
  {
  }

  public override IEnumerator GetRequestEnumerator()
  {
    // Go to the Web application's home page

    WebTestRequest request1 = new WebTestRequest("http://testserver/website");
    request1.ThinkTime = 4;
    yield return request1;

    // Go to the login page

    WebTestRequest request2 = new WebTestRequest("http://testserver/website/Login.aspx");
    request2.ThinkTime = 16;
    ExtractHiddenFields rule1 = new ExtractHiddenFields();
    rule1.ContextParameterName = "1";
    request2.ExtractValues += new EventHandler(rule1.Extract);
    yield return request2;

    // Attempt to login 

    WebTestRequest request3 = new WebTestRequest("http://testserver/website/Login.aspx");
    request3.ThinkTime = 6;
    request3.Method = "POST";
    FormPostHttpBody request3Body = new FormPostHttpBody();
    request3Body.FormPostParameters.Add("__VIEWSTATE", this.Context["$HIDDEN1.__VIEWSTATE"].ToString());
    request3Body.FormPostParameters.Add("username", 
this.Context["DataSource1.Credentials.UserName"].ToString());
    request3Body.FormPostParameters.Add("password", 
this.Context["DataSource1.Credentials.Password"].ToString());
    request3.Body = request3Body;
    yield return request3;

    // If the login failed, create a new user account

    if (LastResponse.StatusCode != System.Net.HttpStatusCode.OK)
    {
      WebTestRequest request4 = new WebTestRequest("http://testserver/website/register.aspx");
      request4.ThinkTime = 9;
      ExtractHiddenFields rule2 = new ExtractHiddenFields();
      rule2.ContextParameterName = "1";
      request4.ExtractValues += new EventHandler(rule2.Extract);
      yield return request4;

      WebTestRequest request5 = new WebTestRequest("http://testserver/website/register.aspx");
      request5.ThinkTime = 5;
      request5.Method = "POST";
      FormPostHttpBody request5Body = new FormPostHttpBody();
      request5Body.FormPostParameters.Add("__VIEWSTATE", 
this.Context["$HIDDEN1.__VIEWSTATE"].ToString());
      request3Body.FormPostParameters.Add("username", 
this.Context["DataSource1.Credentials.UserName"].ToString());
      request3Body.FormPostParameters.Add("password", 
this.Context["DataSource1.Credentials.Password"].ToString());
      request5Body.FormPostParameters.Add("confirmpassword", 
this.Context["DataSource1.Credentials.Password"].ToString());
      request5.Body = request5Body;
      yield return request5;
    }

    // Go view the user's profile now that the user is logged in

    WebTestRequest request6 = new WebTestRequest("http://testserver/website/userprofile.aspx");
    yield return request6;
  }
}

循环

当 Web 测试必须循环以发出在测试中动态确定的大量请求时,进行 Web 测试的编码。

以下示例对这一点进行演示,其中 Web 测试执行搜索,然后在搜索结果中连接每个链接。

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.VisualStudio.TestTools.WebTesting;

public class LoopingCoded : WebTest
{
  public LoopingCoded()
  {
  }

  public override IEnumerator GetRequestEnumerator()
  {
    // Issue a search for the term "Microsoft"

    WebTestRequest request7 = new WebTestRequest("http://testserver/website/Search.aspx");
    request7.ThinkTime = 20;
    request7.Method = "POST";
    FormPostHttpBody request7Body = new FormPostHttpBody();
    request7Body.FormPostParameters.Add("txtSearch", "Microsoft");
    request7.Body = request7Body;
    yield return request7;

    // Loop through each anchor tag in the search result and issue a request to each tag's target url (href)

    foreach (HtmlTag tag in this.LastResponse.HtmlDocument.GetFilteredHtmlTags("a"))
    {
      WebTestRequest loopRequest = new WebTestRequest(tag.GetAttributeValueAsString("href"));
      yield return loopRequest;
    }
  }
}

细粒度的事件处理

当只想将 PreRequest 和 PostRequest 事件处理程序应用于特定请求时,进行 Web 测试的编码。正常的 Web 测试将 WebTestRequestPlugins(处理这两种事件)应用于 Web 测试中的所有请求。

以下示例对这一点进行演示,其中 Web 测试将两个请求的响应体记录到磁盘,以用于调试和基准调整。

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using Microsoft.VisualStudio.TestTools.WebTesting;


public class EventHandlingCoded : WebTest
{
  public EventHandlingCoded()
  {
  }

  public override IEnumerator GetRequestEnumerator()
  {
    WebTestRequest request1 = new WebTestRequest("http://testserver/website");
    request1.ThinkTime = 8;
    yield return request1;

    // Log this response out to a file

    WebTestRequest request2 = new WebTestRequest("http://testserver/website/products.aspx");
    request2.ThinkTime = 2;
    request2.QueryStringParameters.Add("CategoryID", "14", false, false);
    request2.PostRequest += new EventHandler(request2_PostRequest);
    yield return request2;

    WebTestRequest request3 = new WebTestRequest("http://testserver/website/products.aspx");
    request3.ThinkTime = 2;
    request3.QueryStringParameters.Add("CategoryID", "15", false, false);
    yield return request3;

    // Log this response out to a file, too

    WebTestRequest request4 = new WebTestRequest("http://testserver/website/products.aspx");
    request4.ThinkTime = 1;
    request4.QueryStringParameters.Add("CategoryID", "20", false, false);
    request4.PostRequest += new EventHandler(request4_PostRequest);
    yield return request4;
  }

  void request2_PostRequest(object sender, PostRequestEventArgs e)
  {
    File.WriteAllBytes("c://request2.html", e.Response.BodyBytes);
  }

  void request4_PostRequest(object sender, PostRequestEventArgs e)
  {
    File.WriteAllBytes("c://request4.html", e.Response.BodyBytes);
  }
}

使用编码的 Web 测试模拟 Web JavaScript

如前所述,Web 测试引擎工作在 HTTP 层并且不运行 JavaScript。以影响 HTTP 层的方式依赖于 JavaScript 的 Web 站点,可使用编码的 Web 测试模拟通常由 JavaScript 执行的逻辑。

以下代码是一个简单的 Web 页,它收集电话号码,并在窗体提交时使用 JavaScript 除去一些非数字字符。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" > 
<head>
 <title>Untitled Page</title> 
<script type="text/javascript"> //get rid of some common non-digit characters // in the phone number string function FixPhoneNumber() 
{ 
var phoneNumberElement = document.getElementById('phoneNumber'); 
var number = phoneNumberElement.value; 
number = number.replace('-', ''); 
number = number.replace('(', ''); 
number = number.replace(')', ''); 
number = number.replace(' ', ''); 
phoneNumberElement.value = number; return true; } 
</script> 
</head> 
<body> 
<form action="http://testserver/testwebsite/showparameters.aspx" method="post"> 
<div> 
<input name="phoneNumber" id="phoneNumber" type="text"/> 
<input name="submit" type="submit" value="Submit" onclick="FixPhoneNumber()" /> 
</div> 
</form> 
</body> 
</html>

当使用具有 phoneNumber 字段的数据绑定测试这种页时,可能会产生问题。如果数据源以不正确的格式包含电话号码,则非预期的数据将提交到服务器,从而导致 Web 测试失败。理想情况是:服务器在禁用 JavaScript 的情况下验证并修复数据,但是可能仍然需要 Web 测试来模拟客户端脚本运行。

在多数情况下,编码的 Web 测试可以轻松模拟影响 HTTP 请求的 JavaScript。以下示例演示如何模拟上面的 JavaScript。

    public override IEnumerator GetRequestEnumerator()
    {
      WebTestRequest request1 = new WebTestRequest("http://testserver/testwebsite/default.aspx");
      yield return request1;

      WebTestRequest request2 = new WebTestRequest("http://testserver/testwebsite/showparameters.aspx");
      request2.Method = "POST";
      FormPostHttpBody request2Body = new FormPostHttpBody();
      
      //get the databound phone number from the context and
      // strip out certain characters to simulate JavaScript
      string phoneNumber = this.Context["PhoneNumber"].ToString();
      phoneNumber = phoneNumber.Replace("-", "");
      phoneNumber = phoneNumber.Replace("(", "");
      phoneNumber = phoneNumber.Replace(")", "");
      phoneNumber = phoneNumber.Replace(" ", "");

      request2Body.FormPostParameters.Add("phoneNumber", phoneNumber);
      request2Body.FormPostParameters.Add("submit", "Submit");
      request2.Body = request2Body;
      yield return request2;
    }

运行并调试编码的 Web 测试

要运行编码的 Web 测试,请在 Test View 或 Test Manager 窗口中选择该测试,并单击 Run 工具栏按钮。当编码的 Web 测试开始运行之后,可双击 Test Results 窗口以显示 Web Test Viewer。同样的功能可用于验证:编码的 Web 测试对于正常的 Web 测试而言是正确的。

由于 Web 测试与 Visual Studio 集成,因此可通过选择 Debug instead of Run 调试一个编码的 Web 测试,如以下屏幕快照所示。可在编码的 Web 测试中的任何位置设置断点,并且所有的标准调试机制均可用。


图 6

小结

对于如何在 Visual Studio 2005 Team Edition for Testers 中创建、验证并调试 Web 测试,希望您现在已经有了更好的了解。有关附加信息和支持资源,请参阅 Web 测试联机文档、我的网络日记以及我们组的 MSDN 支持论坛。

关于作者

Josh Christie 是 Visual Studio Team System Web and Load Testing 小组的软件设计工程师。他主要研究 Web 测试引擎、编码的 Web 测试和浏览器记录器。有关 Web 测试的更多信息,请参阅他的网络日记 http://blogs.msdn.com/joshch/。 

MATLAB 与 STK 互联的两种连接方式详解 批量仿真推荐使用方法一;交互分析推荐使用方法二。可以根据具体任务灵活切换,也可以同时使用两种方式,提升建模与仿真的效率。 阅读详情

相关推荐

MPU6050芯片 寄存器详解与配置指南(详解)

分频值越小,数据刷新越快(如分频值 = 0 时,刷新率 = 8kHz/1=8kHz)。功能:配置采样频率分频系数,控制 ADC 转换速度和数据刷新率。数据刷新率 = 陀螺仪输出时钟频率 /(1 + 分频值)

m0_74696257的博客 1421

软件测试-web端测试方法

软件测试-web端测试方法 一、输入框 1、字符型输入框: (1)字符型输入框:英文全角、英文半角、数字、空或者空格、特殊字符“~!@#¥%……&?[]{}”特别要注意单引号和&符号。禁止直接输入特殊字符时,使用“粘贴、拷贝”功能尝试输入。 (2)长度检查:最小长度、最大长度、最小长度-1、最大长度+1、输入超工字符比如把整个文章拷贝过去。 (3)空格检查:输入的字符间有空格、字符前有空格、字符后有空格、字符前后有空格 (4)多行文本框输入:允许回车换行、保存后再显示能够保存输入的格式、仅输

come_closer的博客 1287

Excel曲线拟合实战:从基础趋势线到高级回归分析

本文系统介绍了Excel曲线拟合的完整工作流,从基础的散点图与趋势线应用,到利用Solver插件进行自定义高级回归分析。文章详细讲解了线性、多项式、指数、对数等六大常用数学模型的适用场景与选择方法,并强调了通过R²值、残差图评估拟合效果、避免过拟合与外推风险的关键步骤,帮助读者掌握从数据探索到预测评估的实战技能。

weixin_29280219的博客 537

软件测试之Web测试流程和方法

一、测试流程   所有测试的流程大体上是一致的:开始测试前准备-->需求分析-->测试设计(测试计划,测试用例)-->执行测试--> 提交BUG-->测试总结。   对于web测试,较之其他软件测试又有所不同,这是细节的不同,这个不同需要我们在不停的测试中去总结   web测试正式测试之前,应先确定如何开展测试,不可盲目的测试。一般网站的测试,应按以下流程来进行:   1)使用HTML Link Validator将网站中的错误链接找出来;   2)测试的顺序为:自顶向下、从左到右;   3)查看页面tit

okcross0的博客 2371

Netapp FAS2750更换磁盘后不同步问题处理

netapp fas2750磁盘更换后不同步问题处理

jetliu05的博客 1256

433M无线遥控器EV1527协议解码实战:从逻辑分析到代码优化

本文详细解析了433M无线遥控器EV1527协议的实战解码过程。从使用逻辑分析仪抓取波形、理解同步头与数据位编码原理开始,逐步深入代码实现。文章重点对比了原始定时器轮询法的痛点,并提出了基于“边沿捕获+时间戳”的优化方案,构建了高效、可移植且具备抗干扰能力的解码引擎,最后分享了跨平台移植的核心技巧。

weixin_29168813的博客 927

[ZZ]Web测试方法

测试中心  刘艳会  在Web工程过程中,基于Web系统的测试、确认和验收是一项重要而富有挑战性的工作。基于Web的系统测试与传统的软件测试不同,它不但需要检查和验证是否按照设计的要求运行,而且还要测试系统在不同用户的浏览器端的显示是否合适。重要的是,还要从最终用户的角度进行安全性和可用性测试。然而,Internet和Web媒体的不可预见性使测试基于Web的系统变得困难。因此,我们必须为测试和评...

weixin_33795093的博客 1375

高通平台 Android T 蓝牙技术全解析:A2DP 与 AVRCP 核心代码路径与交互流程

A2DP 接收端 - 连接流程(AVDTP 打开)

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 290

web应用程序测试_测试Web应用程序的7种方法

web应用程序测试 什么是Web测试,为什么要测试? (What is Web Testing and Why should I Test?) Website testing is checking your web application or website for potential bugs before its made live and is accessible to the gen...

weixin_26755331的博客 1467

【华为OD机试真题 2025双机位A卷】958、 高效的任务规划 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS)

【华为OD机试真题 2025双机位A卷】958、 高效的任务规划 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS) 华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2025e卷,od机试,2025E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2025华为od,

KJ.JK 1074

大数据领域存算分离:教育行业的数据应用探索

在当今数字化时代,教育行业积累了海量的数据,如学生的学习记录、考试成绩、在线学习行为等。如何高效地存储、管理和分析这些数据,以挖掘其潜在价值,为教育决策、教学改进和学生个性化发展提供支持,成为教育行业面临的重要挑战。大数据领域的存算分离技术为解决这一问题提供了新的思路和方法。本文旨在探索存算分离技术在教育行业的数据应用,分析其原理、优势和实际应用场景,为教育行业的数据管理和分析提供参考。本文共分为十个部分。第一部分介绍背景,包括目的和范围、预期读者、文档结构概述和术语表;

AGI×大数据,开启智能时代的认知跃迁;解码AGI,赋能数据驱动的智能革命。 813

转:Web 测试的创作与调试技术

摘要:学习有关 Visual Studio 2005 Web 测试的更多知识,包括 Web 测试引擎和记录器如何工作,以及如何创建有效的 Web 测试。 本页内容 读者简介记录一个 Web 测试运行并验证 Web 测试解决常见的 Web 测试问题深入研究进行编码的 Web 测试小结 读者 本文面向的测试人员和开发人员,是那些想丰富有关 Microsoft Vis...

weixin_30838921的博客 83

Aurix TC3xx系列MCU DMA模块配置方法(二)

本文主要基于英飞凌Aurix TC3xx系列MCU,通过EB tresos配置工具,介绍DMA驱动模块的配置方法。

m0_38045338的博客 2850

VSTS For Testers在MSDN上的相关文章

一、单元测试 1、强化Visual Studio 单元测试 http://www.microsoft.com/china/msdn/library/langtool/vsts/vsunittest.mspx?mfr=true 2、单元测试小技巧 http://www.microsoft.com/china/msdn/library/langtool/vsts/UnitTestingTips...

weixin_34186950的博客 121

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

《单页Web应用:JavaScript从前端到后端》——导读

**前言**Josh是我在找工作的时候认识的,2011年夏天他给我提供了一个Web架构师的职位。尽管最终我决定接受另外一个机会,但是我们相见甚欢,并讨论了一些关于单页Web应用的有趣问题以及互联网的未来。有一天,Josh天真地建议我们俩合写一本书,我傻傻地同意了,于是数百个周末我们把自己关起来,经历着相同的命运。我们最开始预计这会是一本很薄的书,少于3...

weixin_34313182的博客 273

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

基于web的创作系统(源码+开题)

最后,创作需求和接取任务系统将实现创作任务的对接和分配,为作者提供更多的创作机会和收入来源。通过这些措施的实施,我们期望能够构建一个功能完善、用户友好的基于Web的创作系统,为创作者提供一个更加广阔、自由的创作空间。通过本研究,我们预期将取得以下成果:首先,成功构建一个基于Web的创作系统,为创作者提供一个便捷、高效的在线创作平台;在构建基于Web的创作系统的过程中,我们拟解决以下主要问题:首先,如何确保系统的安全性和稳定性,保护用户数据和作品的安全;第二阶段:分析阶段,确定系统功能及性能等需求(3周)

sryue08的博客 940

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

基于Java+SpringBoot+SSM同人创作与分享平台系统(源码+LW+调试文档+讲解等)/同人创作平台/同人分享平台/创作分享系统/同人创作系统/分享平台系统/同人创作与系统/创作与分享系统

前端:Spring+SpringMVC+Mybatis后端:SpringBoot+Mybatis数据库:MySQL、SQLServer开发工具:IDEA、Eclipse、Navicat等✌关于毕设项目技术实现问题讲解也可以给我留言咨询!!!SpringMVC 在 SSM 中扮演着重要的角色。它实现了经典的 MVC 设计模式,将业务逻辑与视图展示分离得更加清晰。程序设计者可以通过 SpringMVC 方便地处理用户请求,进行数据的接收和响应的发送。

擅长Java、Python、小程序、Web网站开发和计算机毕设项目实战✌ 1006

从艺术展览到技术创作:如何构建并展示完整的创作脉络

在技术领域,文档与知识管理是项目成功和团队协作的基石。其核心原理在于通过系统化记录,将隐性的思考过程、决策逻辑和问题解决路径显性化,从而构建可追溯、可复用、可传承的知识资产。这一实践的技术价值在于,它能显著降低项目理解与维护成本,加速团队新成员融入,并避免重复踩坑,是提升工程效率与质量的关键方法论。其应用场景广泛,尤其适用于开源项目布道、复杂技术问题复盘、架构决策记录以及个人学习成长追踪。本文以叙事艺术展为引,深入探讨如何借鉴其‘全脉络’展示理念,通过建立日常记录习惯、利用Git、决策日志等工具,构建一套高

weixin_30920597的博客 440

基于Java+SpringBoot+SSM,Flask基于文学创作的社交论坛系统(源码+LW+调试文档+讲解等)/文学创作/社交论坛/系统/文学创作平台/文学社区/网络文学/写作交流/作家互动

前端:Spring+SpringMVC+Mybatis,Flask、Python Web框架,后端语言Python后端:SpringBoot+Mybatis数据库:MySQL、SQLServer开发工具:IDEA、Eclipse、Navicat等✌关于毕设项目技术实现问题讲解也可以给我留言咨询!!!SSM 框架的整合使用,为程序设计带来了诸多优势。在开发过程中,Spring 负责整体的架构管理和资源整合,SpringMVC 处理用户请求和业务逻辑,MyBatis 进行数据的持久化操作。

2401_85513329的博客 747

VS2005Web测试与负载测试的方法

 1.1    Web测试的目的Web测试的目的可分以下几点:1、   创建Web应用程序的功能测试。2、 创建数据驱动测试,即Web应用程序需要用户提供不同的Web页面的数据,这时用户可以用数据手动输入或批量输入来验证,页面输出的结果是不是与用户预期的输出结果一样。3、 创建并运行可以测试应用程序性能的测试,即判断一个网站的性能怎么样,它能不能同时接受到来至内部与外部的请求。

kongxingzhu的专栏 2102

玩转WEB接口之一 【HTTP调试测试神器 httpbin使用】

httpbin是大神kennethreitz为搭建测试用的http服务而写的项目,httpbin 这个服务应用能测试HTTP请求及响应的各种信息,比如 cookie、ip、headers 和登录验证等,且支持 GET、POST 等多种方法,对 web 开发和测试具有很大的帮助,它是用 Python + Flask 编写的,是一个开源项目。这里选取了四个典型场景: get请求、formdata表单提交、json字符串post提交、带文件 multipart/form-data 提交。

爱码少年 00fly.online 的博客 2万+

springboot《web技术基础》的数字课程平台的设计与开发

前端页面数据处理传输以及页面展示使用Vue技术 采用B/S架构,使用Maven作为项目管理工具,使用Springboot+Mybatis做整合开发 ,springboot《web技术基础》的数字课程平台的设计与开发采用的开发工具:IntelliJ IDEA,VScode;数据库管理软件:Navicat;开发技术框架:MyBatis,Spring Boot,Vue;使用Mysql数据库构建数据库表开发步骤;(1) 创建好数据库并导入,

懒人的博客 905

ChatGPT与AIGC技术如何重塑内容创作流程

AIGC(AI生成内容)技术正通过大语言模型如ChatGPT改变传统内容生产方式。基于Transformer架构的LLM(大语言模型)结合RLHF(人类反馈强化学习)技术,使AI能够理解并生成符合人类偏好的内容。这项技术的核心价值在于将自然语言作为新型编程接口,大幅降低创作门槛。在实际应用中,从文案生成、代码编写到数据分析,AIGC能提升3-10倍效率。特别是Prompt工程的出现,让非技术人员也能通过精心设计的指令调用AI能力。当前内容产业已形成AI处理基础工作、人类专注高阶创作的协作模式,同时催生了Pr

weixin_28267011的博客 344

Web 测试

安全性测试是有关验证应用程序的安全服务和识别潜在安全性缺陷的过程。此节包括一些重要的测试建议,用来验证已创建安全的应用程序。由于攻击者没有闯入的标准方法,因而也没有实施安全性测试的标准方法。另外,目前几乎没有可用的工具来彻底测试各个安全方面。由于应用程序中的功能错误也可代表潜在的安全性缺陷,因此在实施安全性测试以前需要实施功能测试。有一点很重要,应注意安全性测试并不最终证明应用程序是安全的

skyofking 1043
上一篇: MSDN Library May 2006 Edition MS官网下载
下一篇: 通过避免下列 10 个常见 ASP.NET 缺陷使网站平稳运行
可爱的排骨
博客等级 码龄25年 13粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值