测试之路是艰辛并漫长的,坚持到底。

发布新日志

  • VSTS For Testers读书笔记(14)

    2007-08-06 11:57:07

    八、WebTest参考文档
    Visual Studio Team System Team Edition for Testers 文档
          http://msdn2.microsoft.com/zh-cn/library/ms182409(vs.80).aspx  
    其他参考文档
    1、Microsoft Visual Studio 2005 Team System Web 测试简介
          http://www.microsoft.com/china/msdn/library/langtool/vsts/VS05TmSysWebTst.mspx?mfr=true
    2、Web 测试的创作与调试技术
          http://www.microsoft.com/china/msdn/library/webservices/WebApp/dnvs05WTAuthDebug.mspx?mfr=true
    3、Visual Studio 2005 Team System:通过更完善的测试实现更好的软件             
          http://www.microsoft.com/china/msdn/library/langtool/vsts/dnvsentvststest.mspx?mfr=true
    4、Lap Around Microsoft Visual Studio Team System 2005         
          http://www.microsoft.com/china/msdn/library/langtool/vsts/VS05TeamSysInt.mspx?mfr=true
    5、http://blogs.msdn.com/joshch/    Josh Christie在MSDN上的Blog
          Josh Christie 是 Visual Studio Team System Web and Load Testing 小组的软件设计工程师
    6、MSDN Visual Studio Team System - Testing Forum   
          http://forums.microsoft.com/msdn/showforum.aspx?forumid=19&siteid=1
          VSTS For Tester论坛,在里面提出的问题一般会有微软的人员来解答
    7、软件测试人员团队中心 
          http://msdn2.microsoft.com/zh-cn/teamsystem/aa718941.aspx
  • VSTS For Testers读书笔记(13)

    2007-08-06 11:56:19

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

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

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

    ØJavascrīpt 重定向
    使用 Javascrīpt 重定向(设置 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 以及其他由 Javascrīpt 修改的隐藏窗体字段
    当隐藏字段由 Javascrīpt OnClick 事件处理程序中修改时,可能会错误地应用自动隐藏字段绑定。这是 Visual Studio 2005 发布版本中的一个已知的错误。
    对于 ASP.NET 站点,该问题通常在 Web 控件调用 __doPostBack() Javascrīpt 方法设置如上所示的 __EVENTTARGET 隐藏字段时发生。自动隐藏字段绑定让窗体参数具有诸如 {{$HIDDEN1.__EVENTTARGET}} 这样的值,而不是实际值 btnNext。要更正该问题,必须将参数值设置为要在 Javascrīpt 中设置的值(例如,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 和 Javascrīpt 的依赖请求。
          缺点:录制所有的信息,没有清晰的结构

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

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



    4、使用编码的WebTest
    可以通过生成编码的WebTest来编程调试解决问题,关于编码的WebTest在前面已经提到过,比如使用分支,循环等控制。
  • VSTS For Testers读书笔记(12)

    2007-08-06 11:54:43

    六、创建编码的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", "hae867@!");
                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 工具栏按钮

  • VSTS For Testers读书笔记(11)

    2007-08-06 11:49:09

    五、WebTest查看器
    2、验证WebTest
     
    记录了某个 Web 测试后,运行该测试并验证该 Web 测试是否正确记录是判断Web测试是否成功的方法。
    当确定记录的测试可以成功运行时,可以开始添加验证规则、提取规则、数据绑定和其他自定义设置。
    验证 Web 测试过程:
    Ø运行 Web 测试并在 Web 测试查看器的两个窗格中检查反馈。
    Ø使用 Web 测试查看器的上窗格可以标识所有有问题的请求。
    Ø通过使用下窗格中的“Web 浏览器”选项卡对请求执行快速目测检验。
    Ø使用“请求、响应和详细信息”窗格检查与 URL、返回代码、页重定向以及从属请求有关的所有问题。 
    Ø可能引起请求失败的一些问题类型包括:
    通过 Javascrīpt 调用的 URL
    ActiveX 控件
    小程序
    由于记录器只能记录来自 Web 浏览器的请求,因此以上所有情况都会引起问题。如果遇到上述一个或多个问题,可以手动向记录的 Web 测试中添加必要的请求。确定必须添加什么请求可能比较复杂。解决上述问题时请考虑以下建议:
    使用 NetMon 等网络分析工具
    检查应用程序的 Web 日志
    检查应用程序的源代码

    3、设置WebTest
    Web 测试查看器中的运行设置由以下选择组成:

    如果在 Web 测试查看器中执行更改,则只将运行设置应用于一个 Web 测试运行。在保存测试时并不会保留这些更改。
    为了保留所做的任何更改,必须更改“运行配置”对话框的“Web 测试”选项卡上的属性。如果更改运行配置中的属性,这些属性会保留并应用于此测试项目中的所有 Web 测试。
    WebTest运行设置可以从2个地方打开,一个是从WebTest查看器里面的按钮,另一个在测试项目中的localtestrun.testrunconfig文件中





    4、使用命令行运行Web测试
    mstest /testcontainer:WebTest1.webtest
    MSTest.exe 是用于运行测试的命令行命令。通过使用此命令的几个选项,可以自定义测试运行。可以将其中的多个选项相互结合使用;实际上,必须将其中一些特定选项与其他选项一起使用
    ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.VSENT.v80.chs/dv_vsetlt01/html/8813ba7f-e790-4e92-9f91-7080508a1c36.htm
  • VSTS For Testers读书笔记(10)

    2007-08-06 11:47:09

    五、WebTest查看器
    •1、概述

    1、概述
    a、Web 测试查看器是用于验证 Web 测试运行和调试 Web 测试问题的主要工具。
    b、通过使用“Web 测试查看器”窗口中的两个窗格,可以查看 Web 测试中每个请求的详细信息以及对这些请求产生的响应。
    c、顶部窗格显示四列: 
          请求
    显示测试中记录的 HTTP 请求。请求旁边的标志符号指示在完成请求之后该请求是通过还是失败。
          HTTP 状态
    指示测试运行期间的请求状态。所有请求的开始状态均为“尚未提交”。在测试运行时将更新状态。在测试结束时,请求状态通常为“OK”。
          响应时间
    显示在完成请求之后 Web 服务器的总响应时间。
          大小
    显示在完成之后请求的响应大小。
    d、Web 测试播放器的下半部分包含以下五个选项卡式页:
          Web 浏览器
    显示从当前 HTTP 请求返回的呈现页。
          请求
    显示当前 HTTP 请求的内容。
          响应
    显示收到的对当前 HTTP 请求的 HTTP 响应。
          上下文
     显示请求上下文的内容
          详细信息
    显示有关当前显示的网页的特定详细信息,其中包括应用的所有验证和提取规则及其结果。此页还显示 Web 测试的上下文集合。该上下文集合是一组名称/值对,其中包含在 Web 测试期间保持的重要信息。
    Web浏览器:不能完全显示Web页面的信息,因为图片和CSS依赖信息不会被记录下来


    请求:Http请求的标头和正文


    响应:响应标头和正文


    上下文:主要是窗体发布参数


    详细信息:主要显示验证规则、提取规则以及异常信息


  • CMMI基础知识

    2007-08-06 11:42:59

    1 CMM及CMMI的全称分别是什么?
    CMM是英文Capability Maturity Model 的缩写,中文意思是:软件能力成熟度模型。
    CMMI是英文Capability Maturity Model Integration的缩写,中文意思是:软件能力成熟度模型集成。

    2 CMM及CMMI的产生背景如何?
    为了保证软件产品的质量,80年代中期,美国联邦政府提出对软件承包商的软件开发能力进行评估的要求。因此,美国卡内基-梅隆大学软件工程研究所 (CMU/SEI) 于1987年研究发布了软件过程成熟度框架,并提供了软件过程评估和软件能力评价两种评估方法和软件成熟度提问单。4年之后,SEI将软件过程成熟度框架进化为软件能力成熟度模型(Capability Maturity Model For Software,简称SW-CMM),并发布了最早的SW-CMM 1.0版。经过两年的试用,1993年SEI正式发布了SW-CMM1.1版,这是目前使用最为广泛的版本。
      按照SEI最初的计划,应该在1998年发表SW-CMM的2.0版。由于软件过程评估(SPA)国际标准项目的进展,美国国防部下令暂时停止推进到SW-CMM 的2.0版,以便吸收SPA的长处,于是便产生了CMMI。
      CMMI-SE/SW 1.0版作为系统工程和软件工程改进的一个集成模型,已于2000年8月11日公布。CMMI-SE/SW 1.0版是为希望改善工程和项目管理过程的产品开发组织而设计的。这一模型由能力成熟度模型集成项目组完成,该项目组是由美国国防部秘书处下属的采办、技术和后勤办公室(OUSD/AT&L)以及国家防御工业协会联合负责的,并由政府、行业和软件工程学会共同参与。该项目的目标是开发一个集成的产品套装,以支持行业和政府的过程和产品改进,该产品套装包括模型、评价方法和培训材料。
      2000~2001年SEI陆续发表了《系统工程和软件工程综合能力成熟度模型》(CMMI-SE/SW)1.0版和CMMI-SE/SW 1.1版以及《系统工程、软件工程和集成产品与过程开发的综合能力成熟度模型》(CMMI-SE/SW/IPPD)1.1版。在发表CMMI-SE/SW1.0时,SEI宣布大约用两年的时间完成从CMM到CMMI的过渡。

    3 CMM及CMMI的主要区别是什么?
    SEI认为合并后的模型(CMMI-SE/SW)与以前系统工程(CMM-SE)和软件工程(CMM-SW)分开的模型的主要区别在于:在某些过程域中的推广将有特定的规范关注点。因此,SEI认为发布合并的模型是更好的选择,可以采用一个模型从而使对规范的关注集中在推广上。CMMI在2级新增加了度量和分析过程域;在3级新增加了风险管理、决策分析和决议过程域;CMMI还扩充了软件产品工程的部分;配置管理作为一个公共的实践适用于所有的过程域。
      借助CMMI-SE/SW,现在使用不同模型对系统工程和软件工程单独进行改进的组织将能够用这样一个集成的模型对过程进行不断改进、培训和评价。由于该模型能够将系统工程和软件工程集成在一起,这一CMMI模型的采用将支持企业级改进。集成后的模型兼具了其源模型(软件能力成熟度模型SW-CMMSM 2.0版草案C和EIA/IS-731系统工程能力模型SECM)的最优特性。同时,该模型还让使用它的组织可以在以前基于SW-CMM或SE-CMM的投资基础上加以改进,并从集成模型的标准化和通用性中受益。使用SE-CMM v1.1的组织应该有能力平稳地过渡到CMMI。

    4 基于CMMI的集成化过程改进策略
    一、引言
      在工程领域,组织的质量和生产率依赖于三个主要的因素:过程、人员和技术。在一些大型系统的开发领域,随着技术的不断进步和人们素质的提高,过程因素逐渐成为制约产品质量和生产效率的瓶颈。因此,在开发组织中进行过程改进,进而增强其过程能力成为了开发组织必须要做的一项工作。
      由美国卡迈基-梅隆大学的软件工程研究所(SEI)所推出的能力成熟度模型(CMM)的成功,导致了各种模型的衍生,并且每一种模型都探讨了某一特定领域中的过程改进问题。但是,随着系统复杂性的不断增长,工程实践的执行越来越多地依赖于交叉学科群组、并行工程以及其他一些高度自动化的过程。面向不同学科领域的过程改进模型已经不能很好地支持并行工程这种混合式的开发环境。在这种情况下,产生了基于CMMI的集成化过程改进。
    二、CMMI简介
      CMMI的全称是Capability Maturity Model Integration,即软件能力成熟度模型集成模型,是由美国国防部与卡内基-梅隆大学和美国国防工业协会共同开发和研制的。现在业界使用的CMMI最新模型是2002年发布的1.1版本系列,如CMMI-SE/SW/IPPD/SS,CMMI-SE/SW/IPPD,CMMI-SE/SW,CMMI-SW等。CMMI是一套融合多学科的、可扩充的产品集合,其研制的初步动机是为了利用两个或者多个单一学科的模型实现一个组织的集成化过程改进。在CMMI的初步研制中集成了三个特殊的过程改进模型:软件(SW-CMM)、系统工程(EIA/IS 731)以及集成化产品和过程开发(IPD CMM);从长期考虑,CMMI产品开发群组建立了一个自动的、可扩充的框架,以便于以后将其他一些学科的过程改进模型也逐步添加到CMMI产品集中。
      CMMI模型中,最基本的概念是“过程域”。与以前的一些过程改进模型一样,CMMI模型也只是选择对过程改进最重要的一些题目,并将其编组到“域”中。在CMMI以前所推出的每一种单一学科过程改进模型中,都包含了一定数量的过程域(或者其他类似名称,如焦点域)。随着各种学科之间的交叉,过程改进人员发现这些不同模型的过程域之间存在很多重复,在涉及多学科的过程改进中带来一些额外工作量,因此产生了将各种过程改进模型进行集成以减少过程域数量的想法。这种想法的最早实现就是CMMI项目首先在软件和系统工程之间实现了较高的集成性,产生了一个公共的过程域集合。随着研究的深入,过程域在不同学科之间的这种公共性越来越明显,因而在CMMI也就渐渐形成了这样一些非常具有通用性的工程过程域。事实上,过程管理和项目管理可以应用于任何学科,因此,CMMI中的这些工程过程域在对不同学科应用时具有不同的实现。总的来说,集成达到了两个目的:一是提炼出了多学科之间的一些公共过程域,另一方面就是减少了过程域的总数量。下面的表1列出了CMMI及其源模型的过程域数目。
      表1:CMMI模型及其源模型中的过程域数量
    ==========================
            模型                        过程域数量
    ==========================
     S W-CMM版本2(c)              19
     EIA/IS731                            19
     IPD-CMM版本0.98                 23
     CMMI-SE/SW/IPPD版本1.1     25
    ==========================
      每一种CMMI模型是一个多达数百页的文档,文档中包含了不同类型的资料,也就是模型构件。CMMI的模型构件主要有三类:需要的(required),期望的(expected),以及提供信息的构件。
    需要的构件只有一种,那就是“目标”。目标表示某个过程域想要达到的最终状态,其实现则表示项目和过程控制已经达到了某种规定程度。针对单一过程域的目标,称之为特定目标;可适用于所有过程域的目标则称为共性目标。
      期望的构件也只有一种,就是“实践”。实践代表了达到目标所“期望的”手段。CMMI模型中每个实践都恰好映射到一个目标。当然,只要能够实现模型中规定的目标,组织可以采用其他一些经过认证的手段作为“替代的”实践,而不一定非要采用模型中规定的实践。因此,实践只是模型中期望的构件,而不是需要的构件。同样,针对单一过程域的实践,称之为特定实践;可是用于所有过程域的实践则称为共性实践。
      提供信息的构件有10种,分别是目的、介绍性说明、引用、名字、实践与目标关系表、注释、典型工作产品、子实践、学科扩充以及共性实践的详尽描述。这些构件为需要构件和期望构件提供了有益的补充。
    三、规范的选择
      如同上面所说,CMMI是一套产品集合。针对不同的学科有不同的规范和标准。并且,每增加一种CMMI学科规范,组织在改进和评估中就要考虑更多的过程需求。比如,原来的SW-CMM模型中描述了300多个实践或活动,而现在的CMMI-SW/SE版本1.1中却描述了400多个实践或活动,用这两种模型进行过程改进或评估所需要的工作量显然是不同的。因此,一个组织要想利用CMMI进行过程改进,首先必须根据自身的主要业务类型,以及改进的目标等因素,在CMMI产品集合中选择适合于自身组织的规范。
      组织在选择适合自身需要的CMMI产品规范时,主要应该考虑一下几方面因素的影响:
      组织的核心业务类型
      这一点对于规范的选择尤其重要。虽然在一些大型项目中总会涉及到多学科、多领域的问题,但是对于组织中的核心业务来说,总是有一门或几门学科是特别重要的。为了减少过程改进中的工作量,避免在改进中引入一些不必要的过程域,组织应该选择对业务成功至关重要的学科规范。
      对于开发产品或服务的组织来说,其业务类型大致包括如下三种:
      1、 组织独立承担对某项新产品的全程开发和维护,开发过程不受外部因素影响。
      以软件开发为例。如果软件开发组织需要开发的是一个面向某一领域的软件系统,并且是独立开发,则首先考虑的规范就应该是CMMI-SW。该规范中对于软件开发过程中需求的建立、项目计划的制定和实施,以及对软件的测试等过程都有详尽的描述。不过,考虑到软件工程与系统工程两个学科之间的大量重复性,以及两者在全程质量管理上的统一性,一般推荐使用CMMI-SW/SE规范,因为CMMI项目在软件与系统工程之间已经进行了比较完美的集成,对于进行独立开发的软件组织来说,采用CMMI-SW/SE规范进行集成化过程改进,是在集成性和工作量二者之间进行折衷的最佳平衡点。
      2、 组织在开发产品或服务中需要集成他人创建的产品,或对产品的开发过程受到某些工程的影响。
      实际上,随着系统复杂性的增长,组织所承接的大部分项目都是属于这种业务类型,这就涉及到开发过程中多学科的交叉以及并行工程等问题。CMMI产品集中的CMMI-SE/SW/IPPD对这种类型的项目开发过程进行了详细描述。一般来说,如果组织在项目开发中需要使用交叉学科群组,需要解决对项目群组的使用、计划和组织,需要解决学科或组之间的沟通以及与集成化产品和过程开发相关的一些问题,则可以考虑选择CMMI-SE/SW/IPPD版本1.1规范。
      3、 组织在开发过程中需要获取或转包某些关键构件。
      这种业务类型主要涉及到对产品的获取和转包,也就是与产品供应商相关的一些问题。CMMI-SE/SW/IPPD/SS版本1.1中对于供应商的选择和监督、集成化供应商管理以及供应商定量管理等方面给出了详尽描述,可以比较成功地解决这些问题。
      组织开展项目的业务环境
      组织开展项目的业务环境也是影响规范选择的一个重要因素。在为过程改进选择规范时,主要应该考虑以下两种业务环境。
      1、 项目开发周期的时间长短及项目的稳定性。
      如果组织所承接的是一个长期项目,具有稳定的工作环境和压力,那么可以考虑选择集成了多学科的过程改进规范。因为,当组织面对一个长期、稳定的项目环境时,一般能够支持在一系列业务活动之上的集成化过程改进工作。并且,由于项目的长期性为过程改进提供了充裕的时间,因而组织可以严格贯彻规范中所描述的过程域中的各项实践和活动,同时还可以从数据和经验积累中感觉到过程改进所带来的益处。
      如果组织所面对的是一个快速发展的环境,所承接的项目是短期的、按进度驱动的工程,那么可以考虑只集中于一个特定的学科进行过程改进,甚至可以只选择某一学科规范中的少数过程域进行改进,这样可以在不影响项目进度的前提下,尽快得到过程改进投资的效益回报。当然,从组织的长远发展来说,这种做法并不可取。但是当一个组织在面对项目进度的压力时,也只能采取这种折衷的做法。
      2、 项目面对的客户基础。
      在选择过程改进规范时,组织所面对的客户也是一个不容忽视的因素。如果组织承接的是对复杂系统有一些关键需求的大型项目,例如国防、航天等项目,则客户往往就会要求组织采用有把握的学科规范来匹配系统开发过程。
      集成化过程改进的范围和目的
      在选择合适的规范之前,首先应该了解所需改善的过程种类和过程改进的目的。如果组织的目的完全是为了进行内部过程改进,那么在选择规范方面可以有很大的余地。针对组织中涉及的项目种类和业务类型,只要有助于组织开发过程的定义、改进的学科规范都可以选择。但是,如果组织进行过程改进是为了认证或定级,以扩大组织的商业影响力,那么就应该有针对性地选择某一特定学科的规范,在过程改进过程中也就要注意对规范实施的严格性和全面性。
    四、选择合适的表示法
      每一种CMMI模型都有两种表示法:阶段式和连续式。这是因为在CMMI的三个源模型中,CMM是“阶段式”模型,系统工程能力模型是“连续式”模型,而集成产品开发(IPD)CMM是一个混合模型,组合了阶段式和连续式两者的特点。两种表示法在以前的使用中各有优势,都有很多支持者,因此,CMMI产品开发群组在集成这三种模型时,为了避免由于淘汰其中任何一种表示法而失去对CMMI支持的风险,并没有选择单一的结构表示法,而是为每一个CMMI都推出了两种不同表示法的版本。
      不同表示法的模型具有不同的结构。连续式表示法强调的是单个过程域的能力,从过程域的角度考察基线和度量结果的改善,其关键术语是“能力”;而阶段式表示法强调的是组织的成熟度,从过程域集合的角度考察整个组织的过程成熟度阶段,其关键术语是“成熟度”。
      尽管两种表示法的模型在结构上有所不同,但CMMI产品开发群组仍然尽最大努力确保了两者在逻辑上的一致性,二者的需要构件和期望部件基本上都是一样的。过程域、目标在两种表法中都一样,特定实践和共性实践在两种表示法中也不存在根本区别。因此,模型的两种表示法并不存在本质上的不同。组织在进行集成化过程改进时,可以从实用角度出发选择某一种偏爱的表示法,而不必从哲学角度考虑两种表法之间的差异。
      从实用角度讲,两种表示法各有优点。
      阶段式表示法
      软件CMM是一种阶段式模型,该模型经过多年的成功使用已经被证明是有效的,这为选择阶段式表示法模型提供了最强有力的证据。考虑从不成熟组织向成熟组织的发展过程,阶段式表示法具有如下两方面优势:
      1、 阶段式模型为支持组织的过程改进提供了一个过程平台。
      对于着眼于改善过程成熟度的组织来说,阶段式模型提供了一种明确的、行之有效的跨越式发展途径。阶段式模型中所描述的组织的5个成熟度等级中,每实现一次等级间的跨越,组织就致力于解决某一方面的问题。例如,组织从成熟度等级1到成熟度等级2,主要致力于有助于改善项目管理的过程域;从成熟度等级2到成熟度等级3,提供了广泛的组织过程定义;从成熟度等级3到成熟度等级4,致力于对过程定量管理的过程域;从等级4到等级5,致力于过程的改进和优化。通过这种方式,阶段式模型确定了组织进行过程改进的最佳次序,如图1。

    图1:模型的阶段式表示法
      2、阶段式模型可以为组织定义一个过程成熟度等级,便于进行跨组织的比较。
      在阶段式模型中,每一个过程域都被指定归属到一个成熟度等级中,因此,基于阶段式模型为组织所定义的成熟度等级中,过程域的预期范围和应用将变得非常清晰。这样,在对不同的组织进行比较时,只要对比组织所达到的不同的成熟度等级,即可知道不同组织在执行过程域方面所存在的差别。
      连续式表示法
      相比之下,连续式模型不如阶段式模型常用,但也不乏支持者,特别是在系统工程师中。采用连续式模型主要有如下两方面的优势:
      首先,连续式模型为用户进行过程改进提供了比较大的自由度。如同上面所说,阶段式模型确定了组织进行过程改进的最佳次序,但同时也限定了用户在进行过程改进时必须遵循单一的改善路径。而连续式模型则允许用户根据组织的业务目的来选择过程改进活动的次序。在连续式模型中,用户可以选择定义组织的成熟度等级,同时还可以选择定义更适合于自身业务环境的过程域的次序。组织可以在一个自己选择的次序中使过程域达到给定的能力等级,而不必遵循单一的阶段式模型的原则。
      其次,基于连续式模型对组织的过程进行的评估,其评估结果具有更好的可见性。在连续式模型中,可以为每个过程域定义多个能力等级,从而可以增强对过程改进中强项和弱点的认识。由于连续式模型是对每个个别的过程域进行单独的评定,并给出个别过程域的能力等级特征图,这显然要比只一个单一的成熟度等级图能提供对过程的更仔细的观察。
    五、CMMI评估的作用及开展
      在过程改进中,评估是非常重要的一个环节。对于组织内部来说,开展对过程的评估是为了找出组织目前所处的位置,诊断组织过程中存在的缺陷。这一点对于过程改进的成功开展是必不可少的。因此,在一个组织中进行集成化过程改进之前,首先要对评估的作用及开展有一个清晰的认识。
      1、正确认识评估的作用
      目前,我国的软件行业中对开展CMMI评估日益重视,很多公司都已经开始实施CMMI评估,并取得了一定的成果。但是,在开展评估中也暴露出了一些问题。其中最主要的问题是对于评估产生的误解。很多组织仅仅是为了评估而评估,只盯住评估的商业目标,急于求成,在评估过程中弄虚作假;评估结束后,只注重认证结果,对评估结果没有好好利用,不能够真正贯彻评估中所给出的建议,从而也不能真正起到过程改进的目的。
      在组织的过程改进中,评估的主要作用就是评定组织当前的所处的位置,即评定过程域的能力等级或组织的成熟度等级,并且找出组织的各个过程域中的强项和弱点,为下一步的过程改进提供建议和支持。同时,考虑到组织的商业目标,在组织中开展评估和认证可以扩大组织的市场影响力,从而带来相应的经济效益。在过程改进中,一定要摆正评估的位置。评估是手段,而过程改进才是组织所要达到的最终目的。
      2、评估的开展
      根据CMM标准中所提出的IDEAL模型,过程改进的开展可以分为五个阶段:⑴初始化:为成功进行过程改进打下基础;⑵诊断:相对预期目标找出组织当前所处的位置;⑶建立计划:计划如何达到目标;⑷行动:按照计划展开行动;⑸学习和扩充:学习以往的过程改进经验,扩充在将来采用新技术的能力。在组织进行过程改进的过程中,这五个阶段需要多次重复进行,逐步改善组织的过程能力。因此,作为诊断阶段中的一项重要活动,评估也不是一次性的行为,同样也需要循环往复进行。
      CMMI产品集中的CMMI Appraisal Requirement 版本1.1给出了基于CMMI的评估中40多条需求,提供了一个综合需求集和评估方法的设计限制。根据这些需求集和设计限制可以开发出相应的基于CMMI的评估方法。
      CMMI产品集中还给出了过程改进的标准方法CMMI评估方法SCAMPI,这一方法是由CMMI产品开发群组开发的,满足全部的CMMI Appraisal Requirement 版本1.1需求。组织在进行过程改进的时候可以参考该方法进行具体实施。
      但是,对于一个具体的组织来说,仅仅根据CMMI产品中对评估的相应描述来照本宣科是远远不够的。特别是对于一些在过程管理方面还很不成熟的组织,在开展CMMI评估的时候更要发挥自身的创造性,灵活运用CMMI产品集中所提供的评估方法。根据CMMI Appraisal Requirement 版本1.1中的描述,评估可分为三类:
      A类评估:全面综合的评估方法,要求在评估中全面覆盖评估中所使用的模型,并且在评估结果中提供对组织的成熟度等级的评定结果。
      B类评估:较少综合,花费也较少。在开始时作部分自我评估,并集中于需要关注的过程域。不评定组织的成熟度等级。
      C类评估:也称为快估。主要是检查特定的风险域,找出过程中的问题所在。该类评估花费很少,需要的培训工作也不多。
      对于一个准备全面实施SCAMPI的组织来说,可以将过程改进分成几个层次进行,在不同层次间逐渐引入较高水平的评估:先通过几次C类评估找出过程缺陷,改进之后再导向B类评估;同样,B类评估也可以执行多次,慢慢导向进行全面的SCAMPI基准评估。如图2所示。
     
    图2:评估的时间层次性
    3、对评估模型的剪裁
      模型是评估中的一个重要因素。在进行具体的评估之前,需要对选定的模型进行剪裁。这样做一方面可以减少评估的工作量,更主要的是建立起适合组织具体情况的具体模型,将标准模型中的角色、活动等部件映射到组织结构中。
      对CMMI模型的剪裁可以从两个不同的角度进行:一是将剪裁模型用于过程改进;另一方面,也可以将剪裁模型用于建立评估基线。
      对于内部过程改进方面的模型剪裁,主要是限制或扩展组织或项目的过程改进范围,是别出支持组织的商业目标和需求的过程域和实践,去掉对组织的业务目标“不适用”的过程域、目标以及实践。当然,由于模型中各组件之间的相互联系,如果将多个过程域、过程域中的多个目标或实践声明为“不适用”,将不可避免地带来评估中的一系列风险,从而削弱了评估的作用。因此,当怀疑某个过程域或目标以及实践不适用时,不应该匆忙做出决定。
      将剪裁模型用于建立评估基线,主要是为了能够通过评估报告在同行业中或者在几个潜在的供应商中比较评估结果。因此,在这种情况下进行模型的剪裁,必须保证在多次评估中参照剪裁模型所得出的定级结果的一致性。从这种角度出发的模型剪裁受到更多的限制。CMMI-SE/SW/IPPD版本1.1中对其具体剪裁方法给出了详尽的描述,组织在通过剪裁定制自己的CMMI模型时可以作为参考。
      组织在进行过程剪裁时,应该综合考虑自身的业务目标、业务模型以及过程改进的资源约束等因素,全面衡量剪裁在减少评估工作量与其所带来的风险之间的利害关系,紧密结合组织本身的核心业务过程,参照CMMI产品集中给出的规范和标准,建立起自身评估中可用的CMMI模型。
    六、结束语
      自从CMMI项目启动以来,基于CMMI的集成化过程改进策略已经在很多知名的大型组织中取得了比较成功的实施。这些组织在进行集成化过程改进中,既取得了巨大的效益,也积累了丰富的经验。本文根据这些组织的实施经验,总结了基于CMMI的集成化过程改进中需要注意的几个关键问题。具体实施中的许多关键技术,如组织标准过程的建立,对模型的剪裁技术,评估的开展中的一些重要技术等,都还有待于进一步的研究。

    5 CMMI阶段式模型中的详细分级和各级中的KPA
    我们在前面介绍了CMMI提供了阶段式和连续式两种表示方法,但是这两种表示法在逻辑上是等价的。我们熟悉的SW-CMM软件能力成熟模型就是阶段式的模型,SE-CMM系统工程模型是连续式模型,而IPD-CMM集成产品开发模型结合了阶段式和连续式两者的特点。下面,我们就阶段式模型,介绍CMMI详细分级和各级中的KPA。
    1 CMMI是如何分级的?
      CMMI阶段式模型当中有5个成熟度等级,分别为:
      1级为初始级
      在成熟度等级1时,过程往往是临时的和混乱的。组织通常不提供一个稳定的环境。在这些组织里成功依赖于组织中个人的胜任能力和个人英雄主义,并不依赖于已被证实的过程的使用。不管这种临时和混乱的环境,处于成熟度等级1的组织通常在那种情况下也能生产出他们的产品和提供服务,但他们会经常超出项目的预算和进度。成熟度等级1的组织的特征事先没有恰当的承诺,关键时刻放任的过程,并且不能重复过去的成功。
      2级为可管理级
      在成熟度等级2,一个组织已达到二级过程域特定和通用的实践的所有目标。换句话说,组织的项目已确保需求是可管理的,过程是有计划的、可实现的、可度量的和得到控制的。
      成熟度2级对应的过程规程帮助确保存在的实践在重要的时刻被保留下来。当这些实践放回原位时,项目可以依据文档化的计划执行和管理。
      2级时,需求、过程、工作产品和服务被管理。工作产品和服务交付的状态在已定义的点上具有管理的透明性(例如,在主要里程碑阶段和主要任务完成时)。
      相关的相关方之间建立了承诺并且在需要时给予修订。工作产品由相关的stakeholders评审并且被控制。工作产品和服务满足他们具体的需求、标准和目标。
      3级为已定义级
    在3级时,组织已达到2级和3级所有过程域的特定和通用的目标。在3级,过程被很好地刻画和理解,并且在标准、规程、工具和方法等方面都进行了描述。
      作为3级的基础组织的标准规程得到建立并随时改进。这些标准的过程用来建立整个组织的一致性。项目依据裁减指南通过裁减组织的一系列标准过程建立他们定义的过程。
      组织的管理者建立基于组织标准过程的过程目标并确保这些目标被适当地表述。
      2级和3级的关键区别在于标准的范围、过程描述和规程。在2级时,标准、过程描述和规程在每一个具体的过程实例中是完全不同的(例如,对于一个特殊的项目)。在3级时,一个项目的标准、过程描述和规程是从组织的标准过程中裁减以适应一个特殊项目或组织单元的。组织的标准过程包括2级和3级时提到的过程。因此,除了裁减指南上允许的差异外,整个组织执行的过程要保持一致性。
      另一个关键的区别是在3级时比2级更详细和更严格地对过程进行了具有代表性的描述。在3级时通过对过程活动间相互关系作用的理解,和对过程、工作产品和服务的详细度量使过程得到了更proactively的管理。
      4级为定量管理级
      管理是量化的管理。所有过程需建立相应的度量方式,所有产品的质量(包括工作产品和提交给用户的最终产品)需要有明确的度量指标。这些度量应是详尽的,且可用于理解和控制软件过程和产品。量化控制将使软件开发真正成为一种工业生产活动。
      5级为持续优化级
      优化级的目标是达到一个持续改善的境界。所谓持续改善是指可以根据过程执行的反馈信息来改善下一步的执行过程,即优化执行步骤。如果企业达到了第五级,就表明该企业能够根据实际的项目性质、技术等因素,不断调整软件生产过程以求达到最佳。
    2 KPA是什么?
      KPA是英文(Key Process Area)的缩写,中文是关键过程域。
    3 CMMI模型中各级有哪些KPA?
      每个成熟度等级由若干关键过程区域组成。每个关键过程区域标识出一串相关的活动,当它们作为群体完成时,就达到一组目标,此组目标对建立该过程成熟度等级是至关重要的。关键过程区域是分别定义在各个成熟度等级并与之相连在一起的。。关键过程区域是一些结构单元,它们指明组织为改进其软件过程应关注的区域。关键过程区域鉴别出为达到某一成熟度等级必须解决的问题。
      图中列出CMMI 中每个成熟度等级的关键过程区域。

    6 CMMI阶段式模型成熟度等级的过程能力和性能预测
    现在我们将成熟度5个等级的过程能力和性能预测进行比较,从而看出执行CMMI规范的好处。
      一个组织的软件过程成熟度能帮助预测一个项目达到其目标的能力。等级1 组织中的不同项目在达到成本、进度、功能和质量等指标的能力上差别很大。正如图中的例子所示,随着组织软件过程成熟,在满足预定目标方面能观察到三个改进之处。
           [软件过程图]
      首先,随着成熟度增长,所有项目的预定目标结果与实际结果间的差异减小。例如,如果有十个相同规模的项目预定在5 月1 日交付,那么随着组织的成熟,它们交付的平均日期会越来越靠近5 月1 日。等级1 组织经常远迟后于其进度表规定的交付日期,而等级5的组织应该能相当精确地满足预定日期要求。这是因为等级5 上组织采用仔细构造的、在已知参数范围内运行的软件过程,而且确定预定日期是基于他们所具有的有关其过程的大量数据,以及运用数据时的性能。(图中,用预定日期线右边曲线下的面积大小表示这一点。)
      其次,随着成熟度增长,实际结果相对预定目标结果的偏差范围减小。例如,等级1组织中,对具有类似规模项目的交付日期是不可预测的,其变化很大。而等级5 组织中的类似项目的交付日期在小得多的范围内变化。在最高成熟度等级上变化范围很小的原因是所有的项目实际上均在接近组织的有关成本、进度、功能和质量等过程能力的受控参数的范围内运行。(图中,以集中于预定目标线附近的面积大小说明这点。)
      第三,随着组织成熟度的增加,预定目标结果得到改善。这就是说,随着软件组织的成熟,成本降低,开发时间缩短、生产率和质量提高。在等级1 上的组织,其开发时间可能十分长,因为必须完成大量的用以纠正错误的返工。相反,等级5 组织采用不断改进过程和缺陷预防技术增加过程有效性和消除费钱的返工,使得开发时间得以缩短。(图中,这点反映在预定目标线在指向原点方向上的水平移动。)
      图中所表示的在预测项目结果方面的改进基于以下假定,即随着噪声(通常以返工形式出现)从软件过程中消除,软件项目结果更加可以预测。但是,无先例的系统会使情况复杂化,因为新的技术和应用问题增加可变性,从而降低过程能力。即使在无先例系统的情况下,与比较不成熟的组织相比,较成熟的组织管理和工程实践的特征能在开发周期的较早阶段帮助识别和阐述问题。由于较早识别出缺陷,能消除后面阶段的返工,从而提高项目的稳定性和性能。风险管理是成熟过程中项目管理的必不可少部分。在某些情况下,一个成熟过程意味着在软件生命周期的早期识别出“失败”项目,使得在徒劳无功的事情上的投资最小。

  • VSTS For Testers读书笔记(7)

    2007-07-17 11:37:08

    四、编辑WebTest
    5、添加事务
    Web 测试中的事务类似于计时器。可以在事务中封装一组操作。您可以将典型的事务视为如下的过程:启动计时器,请求某一页,请求另一页,然后结束计时器。从启动到结束这一系列的操作便构成了事务。
    在负载测试中使用 Web 测试时,事务响应时间会显示在负载测试监视器的事务表中。




    6、添加设置凭据
    可以为使用基本身份验证或集成 Windows 身份验证的任何网站设置凭据。包含个人信息的网站在通过浏览器显示任何信息之前,通常都要求进行用户身份验证。通过为 Web 测试设置凭据,可以在要求此级别的身份验证的网站上进行测试。


    7、参数化Web服务器
    a、可以对 Web 服务器的 URL 进行参数化,这样就可以更加方便地对要运行测试的 Web 服务器进行更改。好处在于,无论是记录测试还是编码测试都可以在另一个服务器上运行,并且仅需要对 Web 服务器上下文参数到另一个服务器的映射进行少许更改。而不必重新记录或重新编写测试。
    b、当您想在特定的 Web 服务器(在非生产环境和生产环境中具有不同的名称)上运行测试时,这非常有用。在这种情况下,两种 Web 服务器都是活动 Web 服务器。
    c、还可以将 Web 测试修改为面向本地计算机上的 ASP.NET Development Web 服务器。可以在本地计算机上创建使用 ASP.NET Development Server 的 Web 服务以承载 Web 应用程序。在运行 Web 测试时,ASP.NET Development Server 将自动启动和停止。
    d、此外,如果在指定的测试 Web 服务器上运行测试以进行生成验证,则可在实际 Web 测试之外标识目标网站。在测试之外标识 Web 服务器可避免对源代码管理下的任何测试部分进行编辑。

  • VSTS For Testers读书笔记(6)

    2007-07-17 11:36:43

    四、编辑WebTest
    4、数据绑定
    数据绑定
    1、执行数据驱动型测试是恰当的负载测试的一个重要方面,原因是这种测试更为真实地模仿了现实世界中的活动,并有助于确保有效地使用服务器缓存等资源。通过使用数据绑定,可以将数据从源数据库绑定到某个要求数据的请求的一部分,例如绑定到某个请求的窗体发送参数。可以通过单击“添加数据源”按钮绑定到数据库中的数据。
    2、使用 OLE DB 数据源进行数据绑定,包括 .csv 文件、Excel、Access 和 SQL Server 数据库。按照一定的格式,TXT文档也可以用来做数据绑定。
    3、属性
          设置凭据
          QueryString 参数
          窗体字段参数
          请求 URL
    添加数据绑定
    1、可以在 Web 测试中使用数据绑定,让数据库充当 Web 测试中涉及 HTTP 请求的用户输入的数据源。例如,可以存储登录名和登录密码的列表,以便在 Web 测试执行过程中尝试重复登录时使用。
     
    2、可以检查测试并决定希望测试的哪一部分成为数据驱动的测试。然后就可以为测试的该部分创建一个数据源,例如包含数据的 Access 数据库。可以在 Web 测试的多个位置绑定数据。
    可以从2个地方添加数据绑定:
    a、针对某个查询字符串参数或是窗体发布窗体添加数据绑定

    b、直接通过快捷方式添加:


    3、访问方式
    在绑定到数据源时,Team Edition for Testers 支持对数据库中的记录进行顺序访问、随机访问和唯一访问。
    顺序
    从第一条记录开始,逐行通过整个表。这是默认设置。这种访问方法在负载测试持续期间会依次通过表中的数据。
    随机
    在表中的行之间随机访问。这种访问方法在负载测试持续期间会依次通过表中的数据。
    唯一
    按顺序逐行访问数据,但每条记录都只访问一次。不循环访问。
    访问方式的设置在属性中:

    当您的 Web 测试汇编到一个负载测试中并在远程 rig 上运行时,必须考虑到各个代理计算机如何使用绑定数据。例如,使用四个代理时,如果访问方法是顺序或随机,则每个代理(而非每个虚拟用户)都会获得数据集的完整副本,而且此数据集将在该代理上创建的所有虚拟用户间共享。不过,如果访问方法是唯一,则数据集将在四个代理之间划分。
  • VSTS For Testers读书笔记(5)

    2007-07-17 11:36:16

    四、编辑WebTest
    3、添加提取规则和自定义提取规则
    添加提取规则
    1、当必须从特定页中捕获一部分数据并且供另一个页使用时,就需要用到提取规则。可以使用提取规则从响应中复制字符串,然后将字符串存储到上下文变量中,以供任何后续请求使用。通过显示“详细信息”窗格,可以在 Web 测试查看器中检查上下文。
    2、WebTest中提供了六个提取规则:



    自定义提取规则
    通过从 ExtractionRule 类派生可以创建自己的提取规则。
    1、创建一个自定义提取规则的类库项目

    2、同样,在类库中需要添加引用Microsoft.VisualStudio.TestTools.WebTesting

    3、创建一个从 ExtractionRule 类派生的类。实现 ExtractRuleName 成员。创建MyExtractionRule 类,MSDN上提供了示例代码:
    using System;
    using System.Collections.Generic;
    using Microsoft.VisualStudio.TestTools.WebTesting;
    using System.Globalization;

    namespace ClassLibrary2
    {
        public class MyExtractionRule : ExtractionRule
        {

            private string name;

            public string Name
            {
                get { return name; }
                set { name = value; }
            }

            public override string RuleName
            {
                get { return "MyExtractionRuleName"; }
            }

            public override string RuleDescrīption
            {
                get { return "MyExtractionRuleDescrīption"; }
            }

            public override void Extract(object sender, ExtractionEventArgs e)
            {
                if (e.Response.HtmlDocument != null)
                {
                    foreach (HtmlTag tag in e.Response.HtmlDocument.GetFilteredHtmlTags(new string[] { "input" }))
                    {
                        if (String.Equals(tag.GetAttributeValueAsString("name"), name, StringComparison.InvariantCultureIgnoreCase))
                        {
                            string formFieldValue = tag.GetAttributeValueAsString("value");
                            if (formFieldValue == null)
                            {
                                formFieldValue = String.Empty;
                            }

                            e.WebTest.Context.Add(this.ContextParameterName, formFieldValue);
                            e.Success = true;
                            return;
                        }
                    }
                }
                e.Success = false;
                e.Message = String.Format(CultureInfo.CurrentCulture, "Not Found: {0}", name);
            }
        }
    }


    4、Build


    5、向测试项目中添加引用


    6、在“添加提取规则”对话框中显示自定义提取规则

    7、MyExtractionRule Demo下载

  • VSTS For Testers读书笔记(4)

    2007-07-17 11:34:46

    四、编辑WebTest
    1、QueryString Parameters & Form Post Parameters
    2、添加验证规则和自定义验证规则


    1、QueryString Parameters & Form Post Parameters查询字符串参数和窗体发布参数

    查询字符串参数一般是URL中如XXX.asp?问号后的内容,窗体发布参数是请求页面中Form中的内容,同时也可以
    提取出隐藏的窗体参数,如AllGiftPwds={{$HIDDEN1.AllGiftPwds}},这些参数可以使用数据绑定来进行参数化,在后面会介绍到。

    2、添加验证规则和自定义验证规则

    添加验证规则:
          预定义的规则包括以下几个:
    查找文本
    窗体区域
    最大请求时间
    请求属性值
    所需的标记
         
          验证级别
          可以使用请求的“验证级别”来控制在特定负载测试中使用哪些验证规则。可以将每个规则的验证级别设置为“低”、“中”或“高”。通常,所设置的验证级别越高,测试的运行速度就越慢。
    见下图:
          
          验证规则的执行对性能有一定影响。
     将负载测试设置设为“低”可执行最少的请求设置级别,适合重载测试和压力运行。将负载测试设置设为“高”可执行最多的规则,适合轻量负载测试期间使用。

    自定义验证规则:
       通过从 ValidationRule 类派生,可以创建自己的验证规则。
    在VSTS For Testers中提供了Test API,因此可以通过建立类库,生成dll文件引用。
    1、创建一个自定义验证规则的类库项目

    2、在该类库项目中,添加一个对 Microsoft.VisualStudio.TestTools.WebTesting.dll 的引用。


    3、创建一个从 ValidationRule 类派生的类。实现 ValidateRuleName 成员。创建CustomValidateTag类,MSDN上提供了示例代码:
    using System;
    using System.Diagnostics;
    using System.Globalization;
    using Microsoft.VisualStudio.TestTools.WebTesting;

    namespace SampleWebTestRules
    {

    //*******************************************************************
    //The Required Tag Validation Rule is used to check that an HTML tag
    // with a particular name is found one or more times in the HTML
    // response.
    //********************************************************************
    public class CustomValidateTag : ValidationRule
    {

    //*********************************************************************
    // Name of the HTML tag that must exist in the HTML document in order
    // for the validation rule to succeed.
    //*********************************************************************
        public string RequiredTagName
        {
            get { return requiredTagName; }
            set { requiredTagName = value; }   
        }

    //*********************************************************************
    // The minimum number of times the HTML tag that must exist in the HTML
    // document for the validation rule to succeed.
    // ********************************************************************
        public int MinOccurrences
        {
            get { return minOccurrences; }
            set { minOccurrences = value; }
        }
       
    //***************************************************************
    /// Specify a user readable name for use in the user interface.
    //*****************************************************************
        public override string RuleName
        {
            get { return "Custom Validate Tag"; }
        }

        public override string RuleDescrīption
        {
            get { return "Validates that the specified tag exists on the page."; }
        }

       //*******************************************************************
    // Validate is called with the test case Context and the
    // request Context.
    // These allow the rule to examine both the request and the response
    // and make sure that the data matchs the required values.
    //********************************************************************
        public override void Validate(object sender, ValidationEventArgs e)
        {
            bool validated = false;

            int numTagsFound = 0;
            foreach (HtmlTag tag in e.Response.HtmlDocument.GetFilteredHtmlTags(requiredTagName))
            {
                Debug.Assert(string.Equals(tag.Name, requiredTagName, StringComparison.InvariantCultureIgnoreCase));
                if ( ++numTagsFound >= minOccurrences )
                {
                    validated = true;
                    break;
                }
            }

            e.IsValid = validated;

        // On failure, set the errorText
            if ( !validated )
            {
                if (numTagsFound > 0)
                {
                    e.Message = String.Format("Only found {0} occurences of the tag", numTagsFound);
                }
                else
                {
                    e.Message = String.Format("Did not find any occurances of tag '{0}'", requiredTagName);
                }
            }
        }

    //*******************************************************************
    // Private Members
    //*********************************************************************
    // Name of the tag required
        private string      requiredTagName;
    // Minimum number of times the tag must appear
        private int         minOccurrences;
    }
    }

    4、Build类库,生成dll文件


    5、在测试项目中,添加对包含自定义验证规则的类库项目的引用。


    6、在“添加验证规则”对话框中就可以显示自定义验证规则


    7、CustomeValidateTag Demo下载。

  • VSTS For Testers读书笔记(3)

    2007-07-17 11:34:22

    三、录制WebTest
    1、录制一般的Web站点测试

    我们以经常使用到的VS2005自带的Personal Web Site Starter Kit为例,首先创建一个WebSite,

    之后在这个Solution上创建一个Test Project,如果安装了VSTS Team Suite版本,在新建项目时有专门的Test Project,确定是否安装有Team Edition For Software Testers,点击VSTS中Help里的About Microsoft Visual Studio,可以查看:

    新建一个Test Project:

    弹出IE后,在地址栏输入URL后就可以开始录制操作,同时实时的录制到VSTS中


    这样就完成了一个录制的过程。

    2、录制Web Service测试
    录制方法和录制Web 站点相同,创建测试项目后在IE中输入WebService的URL来记录操作。

    3、手动添加Web Service测试
    可以参考下面2篇文章,对于WebService测试加入了数据驱动,可以一次将测试数据全部加进去一次运行得到结果
    http://msdn2.microsoft.com/zh-cn/library/ms182557(VS.80).aspx
    http://blog.joycode.com/mango/archive/2007/02/28/94002.aspx
    4、查看WebTest
          Web 测试是一个包含一系列 HTTP URL 的 XML 文件。可以通过使用 Web 测试编辑器记录浏览器会话来创建 Web 测试。
    A、查询字符串参数和窗体发送参数已被检测出来并会自动生成到测试中。传输方法属性 GET 或 POST。
    B、Web 测试记录器会自动检测是否使用了隐藏的窗体字段。
    C、不记录图像。 Parse Dependent Links 属性设置默认为 True
    D、不记录重定向。只有在运行测试时自动根据请求重定向
     

    思考时间”是用户浏览网页所花费的时间,其中包括查看网页和确定下一步操作。思考时间不包括加载网页所需的时间。

    在记录 Web 测试时,会记录每个网页的思考时间。以后,在运行 Web 测试时,会使用或忽略思考时间。在“Web 测试查看器”中使用“思考时间”按钮,可以从使用思考时间切换到不使用思考时间。

    思考时间在负载测试过程中非常重要,因为它们决定了测试的节奏。务必要检查所记录的 Web 测试思考时间,以确保它们能够准确地反映真实的等待时间。在记录会话期间,用户非常容易分神,从而导致意外的超长思考时间,这会给负载测试带来负面影响。为了避免此问题,可以暂停记录器。

  • VSTS For Testers读书笔记(2)

    2007-07-17 11:33:52

    WebTest 
    一、概述
    二、测试引擎和测试记录器
    三、录制WebTest
    四、编辑WebTest
    五、 WebTest查看器
    六、创建编码的WebTest
    七、 WebTest的常见问题与解决
    八、参考

    一、概述
    1、“Web 测试”也称为声明性 Web 测试,它由一系列 HTTP 请求组成。Web 测试通过发出 HTTP 请求在协议层工作。Web 测试不运行 Javascrīpt。但是,可以在运行时通过使用 Web 测试插件、Web 测试请求插件、提取规则或编码 Web 测试来模拟 Javascrīpt 操作。

    2Web 测试用于测试 Web 应用程序的功能以及在负载下测试 Web 应用程序。Web 测试可用于性能测试和压力测试。

    3Web 测试的优点

     创建的 Web 测试可用于广泛的测试目的,包括:

    创建执行 Web 应用程序的功能测试。
    创建数据驱动的测试。
    创建并运行可以测试应用程序性能的测试。
    使用 .NET 语言进行测试创作、调试和测试扩展。

     Web 测试可自动处理这些 HTTP 操作:

    包括 VIEWSTATE 的隐藏字段相关性
    重定向
    从属请求
    身份验证
    通过 HTTPS/SSL 确保安全

    安全

    Web 测试、扩展名为 .webtest 的文件和 Web 测试结果可能包含敏感信息,可用于生成对计算机或网络的攻击。Web 测试和 Web 测试结果包含 URL 和连接字符串。在与他人共享测试或测试结果时应注意这一点。

    二、测试引擎和测试记录器
    Web 测试引擎
    1、有关 Web 测试引擎需要了解的一个关键概念是,Web 测试在 HTTP 层工作。Web 测试包含一个 HTTP 请求列表;这些请求主要都是由查询字符串参数、窗体参数和针对 Web 服务器的 URL 组成的。Web 测试引擎执行这些 HTTP 请求,从服务器(一个或多个)检索响应,以及收集计时数据。
    2、由于 Web 测试引擎在 HTTP 层起作用,因此它并不直接模拟客户端脚本,例如,Javascrīpt 或 ActiveX 控件。Web 测试关注在服务器上生成负载。因此,只影响 Web 页外观的客户端脚本对 Web 测试而言并不重要。那些在附加 HTTP 请求(例如,AJAX)中设置参数值或结果的客户端脚本影响服务器上的负载,而且可能需要手动修改 Web 测试来模拟该脚本
    测试记录器 Web Test Recorder
    1、Web Test Recorder 挂钩到 Internet Explorer 对象模型,侦听不同的导航事件。
    2、优点
          可以记录安全套接字层 (SSL) 和已验证身份的 Web 站点,而没有任何特殊的配置要求。
          不记录诸如图像、级联样式表(cascading style sheet,CSS)文件和 Javascrīpt 文件这样的依赖请求。
          该功能有助于 Web 测试能更好地还原装饰性的 Web 站点更改,使测试更关注于 Web 应用程序的实际使用。
    3、不足
          它可能无法记录由 Javascrīpt(例如,在 AJAX 站点上)、ActiveX 控件和某些类型的弹出窗口发出的请求 ,在多数情况下,可手动地将丢失的请求添加回 Web 测试来解决这些问题 。




  • VSTS For Testers读书笔记(1)

    2007-07-17 11:33:13

    VSTS For Testers
    一、概述
    二、测试类型
    三、Team Test API

    一、概述
     
    Visual Studio Team Edition for Testers 中提供了一套与 Microsoft Visual Studio 2005 紧密集成的测试工具
    Team Edition for Testers 使您能够创建、管理、编辑和运行测试,还可以获取和存储测试结果。除代码覆盖率度量外,Visual Studio 中还集成了几种测试类型,其中包括单元测试、Web 测试、负载测试和手动测试。
    可以使用 Visual Studio IDE 运行测试。此外,还可以从命令行运行手动测试之外的测试组或任何单项测试。
    因为测试工具与 Visual Studio Team System 的其他部分集成在一起,因此,可以将结果发布到数据库、生成趋势和历史记录报告、对比不同种类的数据,以及查看通过测试发现了多少 bug,具体都有哪些。

    下图是我们经常见到的Visual Studio Team System图


    二、测试类型

    单元测试
    是一种编程测试,可以使用能够创建测试的初始源代码的代码生成功能来创建单元测试,也可以完全手动编写测试。

    Web测试
    也称为声明性 Web 测试,它由一系列 HTTP 请求组成。

    负载测试
    主要目标是要模拟许多用户同时访问一台服务器的情况。

    手动测试
    是人工执行的测试。手动测试通常在列出步骤的文本文档或 Microsoft Word 文档中捕获。

    一般测试
    使用一般测试来包装可从命令行运行并返回 Pass Fail 值的现有测试、程序或第三方工具。

    顺序测试
    包含要以指定顺序运行的其他测试。

    三、Team Test API
    命名空间

    Microsoft.VisualStudio.TestTools.LoadTesting
    Microsoft.VisualStudio.TestTools.UnitTesting
    Microsoft.VisualStudio.TestTools.UnitTesting.Web
    Microsoft.VisualStudio.TestTools.WebTesting
    Microsoft.VisualStudio.TestTools.WebTesting.Rules

    程序集

    Microsoft.VisualStudio.QualityTools.WebTestFramework 
       
    Microsoft.VisualStudio.TestTools.WebTesting 
       Microsoft.VisualStudio.TestTools.WebTesting.Rules

    Microsoft.VisualStudio.QualityTools.UnitTestFramework 
       
    Microsoft.VisualStudio.TestTools.UnitTesting  
       
    Microsoft.VisualStudio.TestTools.UnitTesting.Web

    Microsoft.VisualStudio.QualityTools.LoadTestFramework 
       
    Microsoft.VisualStudio.TestTools.LoadTesting

    Web 测试 API 可用来创建编码的 Web 测试、Web 测试插件、请求插件、请求、提取规则以及验证规则。
     

    转载自:http://www.cnblogs.com/oscarxie/archive/2007/04/09/706094.html

  • VSTS For Testers读书笔记(9)

    2007-07-17 11:32:35

    四、编辑WebTest
    9、创建WebTest插件
    Web 测试插件为隔离 Web 测试中各个主声明语句外部的代码提供了一种手段。自定义的 Web 测试插件为在运行 Web 测试时调用某些代码提供了途径。在每个测试迭代中,Web 测试插件都要运行一次。
    通过从 WebTestPlugin 基类派生您自己的类,可以创建自定义的 Web 测试插件。
    可以将自定义 Web 测试插件用于已记录的 Web 测试,这使您只需编写最少量的代码即可获得对 Web 测试的更大控制。此外,还可以将它们用于编码的 Web 测试。
    默认情况下,WebTest没有提供预定义的WebTest插件:

    创建一个WebTest Plugin:
    1、新建一个类库项目
    2、然后右击并选择“添加引用”。
    在“.NET”选项卡上,选择“Microsoft.VisualStudio.TestTools.WebTesting”。单击“确定”。
    3、编写一段获取测试次数的代码,使用MSDN上提供的示例代码:
    using System;
    using System.Collections.Generic;
    using System.Text;
    using Microsoft.VisualStudio.TestTools.WebTesting;
    namespace SampleRules
    {
        public class SampleWebTestPlugin : WebTestPlugin
        {
            static int testIterationNumber;
            public override void PostWebTest(object sender, PostWebTestEventArgs e)
            {
            }
            public override void PreWebTest(object sender, PreWebTestEventArgs e)
            {
                e.WebTest.Context["TestIterationNumber"] = testIterationNumber;
                testIterationNumber++;
            }
        }
    }
    4、Build类库,将生成的Dll文件添加引用到测试项目中

    5、再次点击设置Web测试插件按钮,可以看到MyWebTestPlugin

    点击确定后,可以在WebTest属性中Web测试插件中添加了MyWebTestPlugin:

    6、添加此插件后,运行测试时,将记录下测试的迭代次数。

    7、MyWebTestPlugin Demo下载。

    10、其他编辑功能
    选中WebTest,点击右键,可以看到提供的编辑功能,例如:手动添加请求,添加Web服务请求,添加注释等等,
  • VSTS For Testers读书笔记(8)

    2007-07-17 11:30:08

    四、编辑WebTest
    8、创建WebTest请求插件
    •请求是构成 Web 测试的声明性语句。请求插件为隔离 Web 测试中各个主请求外部的代码提供了一种手段。自定义的请求插件为您提供了一条调用代码的途径,因为每个请求都在一个 Web 测试中运行。通过从 WebTestRequestPlugin 基类派生您自己的类,可以创建自定义的请求插件。
    •自定义的请求插件可以用于已记录下的任何测试。
    •还可以将自定义请求插件用于编码的 Web 测试。
    默认情况下,在WebTest中没有提供任何的WebTest请求插件:

    创建一个自定义的WebTest Request Plugin
    1、新建的类库项目
    2、然后右击并选择“添加引用”。
    在“.NET”选项卡上,选择“Microsoft.VisualStudio.TestTools.WebTesting”。单击“确定”。
    3、编写一段获取代理机器名和请求的URL的代码,使用MSDN上提供的示例代码:
    using System;
    using System.Collections.Generic;
    using System.Windows.Forms;
    using Microsoft.VisualStudio.TestTools.WebTesting;
    namespace RequestPluginNamespace
    {
        public class MyWebRequestPlugin : WebTestRequestPlugin
        {
            public override void PostRequest(object sender, PostRequestEventArgs e)
            {
                MessageBox.Show(e.WebTest.Context.AgentName);
            }
            public override void PreRequest(object sender, PreRequestEventArgs e)
            {
                MessageBox.Show(e.Request.Url);
            }
        }
    }
    4、Build类库,将生成Dll添加引用到测试项目中


    5、再次点击设置请求插件,可以看到MyWebRequestPlugin

    点击确定后,可以在WebTest属性中看到请求插件中添加了MyWebRequestPlugin

    6、添加此插件后,运行测试时,每次Web请求都会弹出一个代理名和Web请求URL的对话框。

    7、MyWebRequestPlugin Demo下载
352/2<12
Open Toolbar