转:创建编码的WebTest

创建编码的WebTest
?通常,通过将现有的已记录Web测试转换为编码的Web测试来创建编码的Web测试。记录的Web测试以“Web测试编辑器”中可见的请求树开头。编码的Web测试是一个生成一系列WebTestRequest的.NET类,可以使用C#或Visual
Basic编写。可以创建编码的Web测试,但推荐做法是将记录的Web测试转换为编码的Web测试。

?将记录的Web测试转换为编码的Web测试之后,可以像编辑任何其他源代码一样编辑该代码。此外,还可以添加循环和分支结构,动态更改测试中的请求数,以及动态生成测试命中的URL集。


生成的代码如下:
namespace
PersonalWebsiteTest
{
    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=\"E:\\My Documents\\Visual Studio
2005\\" +
        "Test.mdb\";Persist
Security Info=False",
Microsoft.VisualStudio.TestTools.WebTesting.DataBindingAccessMethod.Sequential,
"Customer")]
    public class WebTest1Coded :
WebTest
    {

public
WebTest1Coded()
       
{
           
this.PreAuthenticate = true;
       
}

public override
IEnumerator<WebTestRequest>
GetRequestEnumerator()
       
{
           
this.BeginTransaction("Login");
            //Web请求1

WebTestRequest request1 = new WebTestRequest("http://localhost:40022/Personal%20Website/");
           
ExtractHiddenFields rule1 = new
ExtractHiddenFields();
           
rule1.ContextParameterName =
"1";
           
request1.ExtractValues += new
EventHandler<ExtractionEventArgs>(rule1.Extract);
           
yield return
request1;

WebTestRequest request2 = new WebTestRequest("http://localhost:40022/Personal%20Website/default.aspx");
           
request2.ThinkTime =
14;
           
request2.Method =
"POST";
           
FormPostHttpBody request2Body = new
FormPostHttpBody();
           
request2Body.FormPostParameters.Add("__EVENTTARGET",
"");
           
request2Body.FormPostParameters.Add("__EVENTARGUMENT",
"");
           
request2Body.FormPostParameters.Add("__VIEWSTATE",
this.Context["$HIDDEN1.__VIEWSTATE"].ToString());
           
request2Body.FormPostParameters.Add("ctl00$Main$LoginArea$Login1$UserName",
"oscarxie");
           
request2Body.FormPostParameters.Add("ctl00$Main$LoginArea$Login1$Password",
"[email protected]!");
           
request2Body.FormPostParameters.Add("__EVENTVALIDATION",
this.Context["$HIDDEN1.__EVENTVALIDATION"].ToString());
           
request2Body.FormPostParameters.Add("ctl00$Main$LoginArea$Login1$LoginButton.x",
"110");
           
request2Body.FormPostParameters.Add("ctl00$Main$LoginArea$Login1$LoginButton.y",
"8");
           
request2.Body =
request2Body;
           
if ((this.Context.ValidationLevel >=
Microsoft.VisualStudio.TestTools.WebTesting.ValidationLevel.High))
           
{
               
ValidationRuleFindText rule2 = new
ValidationRuleFindText();
               
rule2.FindText =
"oscarxie";
               
rule2.IgnoreCase =
false;
               
rule2.UseRegularExpression =
false;
               
rule2.PassIfTextFound =
true;
               
request2.ValidateResponse += new
EventHandler<ValidationEventArgs>(rule2.Validate);
           
}
            yield
return request2;

WebTestRequest request3 = new WebTestRequest("http://localhost:40022/Personal%20Website/Resume.aspx");
           
request3.ThinkTime =
3;
            yield
return request3;

WebTestRequest request4 = new WebTestRequest("http://localhost:40022/Personal%20Website/Links.aspx");
           
request4.ThinkTime =
2;
            yield
return request4;

WebTestRequest request5 = new WebTestRequest("http://localhost:40022/Personal%20Website/Albums.aspx");
           
request5.ThinkTime =
3;
            yield
return request5;

WebTestRequest request6 = new WebTestRequest("http://localhost:40022/Personal%20Website/Default.aspx");
           
request6.ThinkTime =
1;
           
ExtractHiddenFields rule3 = new
ExtractHiddenFields();
           
rule3.ContextParameterName =
"1";
           
request6.ExtractValues += new
EventHandler<ExtractionEventArgs>(rule3.Extract);
           
yield return request6;

WebTestRequest request7 = new WebTestRequest("http://localhost:40022/Personal%20Website/Default.aspx");
           
request7.Method =
"POST";
           
FormPostHttpBody request7Body = new
FormPostHttpBody();
           
request7Body.FormPostParameters.Add("__EVENTTARGET",
"ctl00$LoginStatus1$ctl00");
           
request7Body.FormPostParameters.Add("__EVENTARGUMENT",
"");
           
request7Body.FormPostParameters.Add("__VIEWSTATE",
this.Context["$HIDDEN1.__VIEWSTATE"].ToString());
           
request7Body.FormPostParameters.Add("__EVENTVALIDATION",
this.Context["$HIDDEN1.__EVENTVALIDATION"].ToString());
           
request7.Body =
request7Body;
           
yield return request7;

this.EndTransaction("Login");
       
}
   
}
}

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

?使用图形化的Web测试编辑器编辑Web测试比直接编辑代码更容易且较少出错。因此,在生成代码之前,您应该尽可能地获得Web测试。
可以参考文章:Web
测试的创作与调试
技术

分支
Web
测试使用数据绑定的用户凭据登录到 Web 站点,如果用户在该系统中不存在,必须创建一个新用户帐户。
 // 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;
    }

循环
 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;
    }
 
}
}

细粒度的事件处理
 Web
测试将两个请求的响应体记录到磁盘,以用于调试和基准调整。
// 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);
  }
粗粒度:表示类别级,即仅考虑对象的类别(the   type  
of  
object),不考虑对象的某个特定实例。比如,用户管理中,创建、删除,对所有的用户都一视同仁,并不区分操作的具体对象实例。  
细粒度:表示实例级,即需要考虑具体对象的实例(the
  instance   of  
object),当然,细粒度是在考虑粗粒度的对象类别之后才再考虑特定实例。比如,合同管理中,列表、删除,需要区分该合同实例是否为当前用户所创建。  
一般权限的设计是解决了粗粒度的问题,因为这部分具有通用性,而细粒度可以看成业务部分,因为其具有不确定性。

模拟
Web Javascrīpt

Web 测试引擎工作
HTTP 层并且不运行 Javascrīpt。以影响 HTTP 层的方式依赖于 Javascrīpt 的 Web 站点,可使用编码的 Web 测试模拟通常由
Javascrīpt 执行的逻辑。例如下面一段JS
<scrīpt type="text/javascrīpt">
//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;
}
<div>
<input name="phoneNumber" id="phoneNumber"
type="text"/>
<input name="submit" type="submit" value="Submit"
ōnclick="FixPhoneNumber()" />
</div>
通过编程后
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 Javascrīpt
      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
测试

对WebTest编程后,需要运行编码的WebTest,验证是否通过
在 Test View 或 Test Manager
窗口中选择该测试,并单击 Run 工具栏按钮

转:创建编码的WebTest,码迷,mamicode.com

时间: 2024-10-04 09:13:52

转:创建编码的WebTest的相关文章

转:WebTest的常见问题与解决

WebTest的常见问题与解决录制好一个WebTest,加上各种规则,编辑后运行并不会像我们想象的那么顺利成功,往往会碰到很多问题,运行不成功的情况比较多,这样我们就遇到了如何解决这些问题的情形.1.使用 Web Test Viewer 验证 Web 测试 ?为了确保一个WebTest在添加到一个负载测试中能够长期运行,需要保证WebTest能够按预期的方式正常工作. ?Web Test Viewer能够提供在运行WebTest时对其监视,并查看测试运行时的所有动作. ?要验证一个新建的 Web

HTTP - 内容编码

HTTP 应用程序有时在发送之前需要对内容进行编码.例如,在把很大的 HTML 文档发送给通过慢速连接上来的客户端之前,服务器可能就会对它进行压缩,这样有助于减少传输实体的时间. 内容编码过程 内容编码的过程如下所述. 网站服务器生成原始响应报文,其中有原始的 Content-Type 和 Content-Length 首部. 内容编码服务器(也可能就是原始的服务器或下行的代理)创建编码后的报文,编码后的报文有同样的 Content-Type 但 Content-Length 可能不同(比如主体

地图开发-地理编码&amp;反地理编码

1.地理编码: 就是把一个'地名字符串'转化成’经纬度' [geocoder geocodeAddressString:<#(NSString *)#> completionHandler:<#^(NSArray *placemarks, NSError *error)completionHandler#>] 2.反地理编码: 是把'经纬度’转换成’地名字符串' [geocoder reverseGeocodeLocation:<#(CLLocation *)#> co

通用的业务编码规则设计实现

一.背景 每一个企业应用中不可避免的都会涉及到业务编码规则的问题,比如订单管理系统中的订单编号,比如商品管理系统中的商品编码,比如项目管理系统中的项目编码等等,这一系列的编码都需要管理起来,那么它们的应该如何编码的,具体的编码规则我们很多时候都是直接写在程序当中 常用的的编码有: 1.数据库自增长ID或最大值加1 2.GUID 3.时间戳 4.常量+自增长 5.常量+时间戳+自增长 6.根据单据属性编码 比如商品编码:第X是代码商品颜色,第Y位是代码商品产地 7.自定义函数处理返回 8.其它 添

前端学HTTP之实体和编码

前面的话 每天都有各种媒体对象经由HTTP传送,如图像.文本.影片以及软件程序等.HTTP要确保它的报文被正确传送,识别.提取以及适当处理.为了实现这些目标,HTTP使用了完善的标签来描述承载内容的实体.本文将详细介绍HTTP的实体和编码 实体介绍 如果把HTTP报文想象成因特网货运系统中的箱子,那么HTTP实体就是报文中实际的货物.下图展示了一个简单的实体,装在HTTP响应报文中 实体首部指出这是一个纯文本文档(Content-Type : text/plain),它只有18个字节长(Cont

对于win8 APP编码的UI测试

通过编码的UI测试轻松测试用户界面 自动化用户界面测试,是打造高品质产品的关键.这些测试可以帮助我们轻松识别UI回归测试.通过visual studio中编码的UI测试,可以生成非常强大的用户界面测试. 基本步骤如下: 1.在visual studio 2013中创建编码的UI测试项目: 在visual studio 2013中一次点击文件->新建->项目,在左侧的已安装->模板->Visual C#中点击测试,在右侧点击编码的UI测试项目后,点击确定. 2.录制UI测试操作: 创

使用VideoToolbox硬编码H.264&lt;转&gt;

文/落影loyinglin(简书作者)原文链接:http://www.jianshu.com/p/37784e363b8a著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. =========================================== 使用VideoToolbox硬编码H.264 前言 H.264是目前很流行的编码层视频压缩格式,目前项目中的协议层有rtmp与http,但是视频的编码层都是使用的H.264.在熟悉H.264的过程中,为更好的了解H.264,尝

通用的业务编码规则设计实现[转:http://www.cnblogs.com/xqin/p/3708367.html]

一.背景 每一个企业应用中不可避免的都会涉及到业务编码规则的问题,比如订单管理系统中的订单编号,比如商品管理系统中的商品编码,比如项目管理系统中的项目编码等等,这一系列的编码都需要管理起来,那么它们的应该如何编码的,具体的编码规则我们很多时候都是直接写在程序当中 常用的的编码有: 1.数据库自增长ID或最大值加1 2.GUID 3.时间戳 4.常量+自增长 5.常量+时间戳+自增长 6.根据单据属性编码 比如商品编码:第X是代码商品颜色,第Y位是代码商品产地 7.自定义函数处理返回 8.其它 添

嵌入式 视频编码(H264)hi3518

这几天在编写视频录制模块,所以,闲暇之余,又粗粗的整理了一下,主要是API,以备不时之用    摄像头获取的模拟信号通过经芯片处理(我们使用的是CX25825),将模拟信号转成数字信号,产生标准的ITU 656 YUV格式的数字信号以帧为单位送到编码卡上的DSP和内存中.分别供视频实时预览.移动侦测处理以及编码等使用.其中编码的作用是将编码卡内存中的YUV数据送到H264编码器中,进过H.264编码产生压缩好的码流,送到主机内存中,供录像或网络传输使用.编码模块完成各个协议编码,协调 MD.VP