zoukankan      html  css  js  c++  java
  • Web Capacity Analysis Tool 压力测试工具使用笔记

    一.背景介绍

      Web Capacity Analysis Tool是微软轻量级Web压力测试工具, 早先是IIS 6.0Resource Tool kit 工具包中的一个组件,现在独立出来有一个社区版本,下载地址在http://www.iis.net/downloads/community/2007/05/wcat-63-(x64)。 

    二. 安装与工作原理简介

      a. 执行安装文件后目录结构如下:

      

        简单说明一下: 

       wcctl.exe 主导测试的控制器,负责协调各测试客户端(wcclient.exe),收集客户端的测试结果和服务器性能数据信息

         wcclient.exe 测试客户端,负责接收控制器发送的配置信息(客户端可以在不同的机器上),返回客户端的测试结果

         wcat.wsf  测试启动封装脚本,见后面的具体说明

       wcutil.exe 查看测试结果的工具

       report.xsl  测试的结果是一个xml文件,通过该xsl文件转换成html。该xsl文件和结果xml文件在同一目录,IE直接打开即可(其它浏览器打开会报错).

       BTW, 这个xsl有两个Bug, 具体的修复见这里http://stackoverflow.com/questions/11097084/wcat-report-xsl-invalid.

      b.安装客户端

         1. 以管理员身份运行cmd,进入WCAT安装目录,默认在C:Program Fileswcat

             2. 运行 "cscript //H:Cscript" 

             3. 运行 wcat.wsf –terminate –update –clients {comma separated list of WCAT client machines}, 以逗号分隔指定客户端列表,如果在本机运行测试客户端,指定localhost,  可能会导致机器重起

       4. 把安装目录加入PATH 环境变量(这一步可选),方便在任何目录运行测试

      C.测试运行后的进程视图如下图所示

          测试的执行入口是wcat.wsf,  简单介绍一下它的工作流程:

      1.测试环境初始化  

        1.1 解析传入运行时参数,

               1.2 如果使用了-terminate,中止有正在运行的客户端 

        1.3 如果使用了-time,同步服务器和客户端的时钟

        1.4 如果使用了-update 更新客户端的运行文件

          2. 运行

        1.1 运行客户端

          当客户端启动时,客户端尝试联接控制器获取当前要测试的场景信息, 其中包括要测试的服务器地址和端口,测试的开始热机时间,测试时间,测试结束时间,具体的测试步骤等. 

               1.2运行控制器

           控制器运行根据相关配置文件控制整个测试的过程,一旦客户端的连接数量等于配置的客户端数,发起指令指示所有客户端开始测试

     三. 一个简单的测试用例

      我们先来看一个简单的测试场景,测试一个网站的主页。 为简化起间,所有的组件布署在一台机器上

      3.1 首先在IIS布署好一个网站,我使用了asp.net mvc4默认的模板生成的网站

      3.2编写测试脚本,其中包含两种类型的脚本

        3.2.1 主要是客户端使用的场景文件(Scenario File),内容如下所示:

        scenario

        {
          name = "Test home page"; //测试的场景名字,会最终出现在测试结果的xml文件件中
          warmup = 20; //测试前热机时间,为尽量保证测试准确性,允许所有机器测试前准备一段时间再开始测试,单位是秒
          duration = 60; //测试持续时间, 单位是秒
          cooldown = 20; //结束时间, 单位是秒

          transaction //表示开始一个事务,这个事务表示一个基本完整业务场景,而非数据库里的'事务'
          {
            id = "Home"; //事务标识
            weight = 1; //表示测试选中的比例值,选中事务的计算公式是 weight of current / sum of all tranactions weight
            request //表示具体的请求,可以有多个
            {
              url = "/Home/Index";
              verb = GET;
              statuscode = 200; //期望的返回http状态码
            }
          }
        }

        3.2.2 测试配置信息(Settings File)

        settings

        {
          clientfile = "simple.scenario"; //表示要发送到客户端的测试场景配置文件
          server = "127.0.0.1"; //服务器名字或地址,建议用IP
          clients = 1; //表示客户端数量
          virtualclients = 10; //每个客户端启动的虚拟连接数 所以总的连接数是clients * virtualclients
        }

      
      3.3 运行测试

        wcat.wsf -terminate -run  -f simple.cfg -x  

      3.4 查看结果

        上面的运行命令没有指定保存结果的xml文件名,默认是log.xml ,把report.xsl拷贝到同一步目录,在IE中打开log.xml,下图是本人机器的结果截图

        

        Transaction/sec 表示每秒处理事务数 

        Request/sec 表示系统吞吐量

        详细的参数说明参见说明文档

     四.WCAT配置文件格式和语法

      4.1 基本的语法格式有点类C形式,

      element 

      {

        attribute = string/dynstring/keyword/integer

         }

         四种类型说明如下,

      1. string  表示一个ascii编码的字符串常量, "value"

          2. dynstring  它有三种形式

          2.1  <filename> 表示一个文本文件,运行时将用文本文件内容表示属性值

          2.2 function(p1, p2, …);  表示是一个函数,运行时将函数返回值来表示属性值, WACT支持内部函数和自定义函数,具体的参见说明文档

          2.3 "value" + "value" 表示字符串连接

         3. keyword 表一个关键字(备注:直接写不需要加引号)

       4. integer 整型

         4.2 具体的配置文件格式

      4.2.1 配置文件(Settings File)格式

        settings

        {

              clientfile      = string;  //如前面解释

              server          = string;  //如前面解释

              clients         = integer;  // 如前面解释

              virtualclients  = integer; //如前面解释

              portscalability = integer; //参见http://msdn.microsoft.com/zh-cn/library/cc150670

              loginterval     = integer; //表示屏幕默认显示日志间隔,单位是毫秒

       

              counters {…}  //表示设计性能计数器监视

              registry {…}   //参见说明文档

        }

           

        counters

           {

                interval = integer;   //数据收集间隔

                host     = string;    //数据收集的服务器名或IP

                counter  = string;  // 性能计数器的名字,格式是object(instance)countername 或objectcountername,可打开perfmon.msc查看计数器的名字

           }

       4.2.2客户端场景文件格式

       scenario

      {

          name     = string;     // 如前面解释

          warmup   = integer;  // 如前面解释

          duration = integer;  // 如前面解释

          cooldown = integer;  // 如前面解释

          throttle = integer  //表示限流控制,单位是字节,详见说明文档

          minbps   = integer;  //表示每秒最小流量接收数, 详见说明文档

          library {…}          //表示引用的扩展dll,详见说明文档

          default {…}       //表示一些默认值设置 

          transaction {…}  // 定义一个事务

      }

      default {…}  元素和transaction元素下的request元素属性定义一样,主要是为所有的事务请求提供默认设置,如果在特定request元素中设置了属性值将覆盖默认设置

      transaction  

        {

              // attributes

              id     = string;  //事务标识

              weight = integer;  //见前面说明

              // elements

              request{…}   //事务的具体请求定义,可定义多个

              branch{…}   // 表示分支,branch包含一下goto 元素,根据goto元素定义的request id和weight随机跳转,但要保证没有死偱环

              sleep{…}      // 表示让客户端睡眠一段时间再开始测试,具体参见说明文档

              cookies{…}  // 是否清除上次请求保存的cookie

              close{…}     // 连接设置

          }

      

    request

        {

            id             = string;      //唯一标识一个请求

            url            = dynstring;  //请求url

            verb           = keyword [GET|POST]; //http方法,当前只支持GET和POST

            redirverb      = keyword [GET|POST];  //重定向http方法,未设置使用前请求的请求方法

            statuscode     = integer;   //期望的返回http状态码,如果返回状态码与期望不一致,将产生一个“非期望的状态码”错误,0将忽略状态码检查,默认为200

            redirect       = keyword [true|false]; //是否跟随重定向,默认为false

            cookies        = keyword [true|false]; //是否保存cookie,默认为true

            secure         = keyword [true|false];  //是否使用ssl连接,默认为false

            handshake      = keyword [full|reconnect];  //控制ssl连接方式,默认为full

            protocol       = keyword [PCT1|SSL2|SSL3|TLS1]; //指定ssl连接协议,默认为SSL3

            algorithms     = keyword [RSA_RC4_128_SHA]; //加密算法

            version        = keyword [HTTP10|HTTP11]; //http版本

            postdata       = dynstring;  //post的数据,如果http method设为GET将忽略该属性

            close          = keyword [ka|graceful|reset]; //当前请求完成后连接处理方式, ka 表示Keep alive, graceful表示等待当前连接上未完成的请求完成后关闭,Reset强行关闭

            authentication = keyword [BASIC|NTLM]; //请求验证方式

            username       = dynstring;    //用户名

            password       = dynstring;   //密码

            server         = dynstring;   //请求服务器名字或ip列表

            port           = integer;  //端口

            handler        = function;  //响应的通过扩展处理函数

            setheader  //修改已经存在的http head头信息 

       {  

         name = dynstring;

              value = dynstring;

       } 

            addheader  //添加新的http head

      {

         name = dynstring;

              value = dynstring;

      } 

        }

    五. 更复杂的测试用例

      5.1 模拟一个登录场景, 测试post数据. 场景配置文件如下

    scenario
    {
    name = "Test user login";
    warmup = 20;
    duration = 60;
    cooldown = 20;

    default
    {
    setheader
    {
    name = "Connection";
    value = "keep-alive";
    }

    // set the host header
    setheader
    {
    name = "Host";
    value = server();
    }

    // HTTP1.1 request
    version = HTTP11;

    // keep the connection alive after the request
    close = ka;

    statuscode = 200;
    }

    transaction //模拟用户登录步骤,1. 打开主页 2.用户登录
    {
    id = "User login";
    weight = 1;
    request
    {
    url = "/Home/Index";
    verb = GET;
    }
    request
    {
    url = "/Account/Login";
    verb = POST;
    postdata = "UserName=aa&Password=bb&RememberMe=true"; //可以先在浏览器中正常登录, fidder查看相关的post和head信息
    statuscode = 302;

    setheader
    {
    name = "Content-Type";
    value = "application/x-www-form-urlencoded";
    }
    }
    }
    }

     5.2测试在Setting file 中添加性能计数器, 显示性能计数器Query是成功的,但奇怪的是没有收集到数据.我在测试的服务器上自定义一个性能计数据收集来查看计数结果,也可以通过写脚本或程序获得计数器结果。

    六.总结

      这里只介绍了WCAT的一些基本用法,忽略了一些像测试环境配置信息,测试最佳实建议等许多信息,建议有时间通读一下说明文档。

  • 相关阅读:
    【转】用.NET 2.0压缩/解压封装的类
    复制到剪贴板的js代码(兼容ie、firefox、chorme、safari...什么都兼容!)
    感觉文章和回复都不错,转载了用正则表达式找出不包含连续字符串abc的单词
    订阅到抓虾、google reader、鲜果等的代码
    [转]妙说23种设计模式
    实现Server.UrlEncode和Server.UrlDecode功能的js代码
    【转】用JS操作XML
    添加到某某书签、某某收藏的代码
    [总结]关于在线用户列表的统计![转载]
    多张图片交替变换的实现方法JS实现和flash实现
  • 原文地址:https://www.cnblogs.com/jjyjjyjjy/p/3474113.html
Copyright © 2011-2022 走看看