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

发布新日志

  • VSTS For Testers读书笔记(26)

    2007-08-06 12:06:33

    一、顺序测试

    ²顺序测试包含要以特定顺序运行的其他测试

    ²顺序测试可包含除负载测试之外的任何测试类型。但是,如果远程运行顺序测试或从命令行运行顺序测试,则对于此测试运行,将临时从该顺序测试中移除其中包含的所有手动测试,并显示一个警告对话框。

     

    可以将同一个测试多次添加到相同的顺序测试中。进行了多次添加后,测试将按照列出的顺序多次运行(它在顺序列表中出现了多少次就运行多少次)。

    选中“失败后继续”表示无论是否有测试失败,顺序测试都将运行。不选中“失败后继续”表示在首次发生测试失败后,顺序测试将停止运行。

  • VSTS For Testers读书笔记(25)

    2007-08-06 12:05:54

    一、概述

    ²可以使用一般测试来包装旧式测试和其他外部程序。在执行了此操作后,测试引擎将一般测试视为任何其他测试类型

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

    ²一般测试是 Team Edition for Testers 的一种简单形式的扩展;它们允许您运行除预定义测试类型(包括 Web 测试、负载测试、单元测试、手动测试和顺序测试)以外的其他测试,如以前的测试和自定义测试。

    ²传递命令行参数

    可以向一般测试所包装的程序传递命令行参数

    ²部署其他文件

    如果一般测试在运行时需要其他支持文件,可以在运行测试之前先部署这些文件

    ²使用摘要结果文件

    该机制可使您的测试报告具体、详细的测试结果

    远程运行一般测试时,如果使用摘要结果文件,将无法立即查看结果。对于一般测试,必须先运行完测试运行中的所有测试,才能查看测试结果,即使一般测试本身早已完成也是如此。

    二、创建一般测试

    ²在“指定要包装为一般测试的现有程序(测试、测试工具或测试适配器)”下指示要包装为一般测试的测试、程序或第三方工具的路径和文件名

    ²在“传递给一般测试的命令行参数”下键入一个或多个要传递的参数。请用空格分隔多个参数

    ²在“要与一般测试一起部署的其他文件”下指定测试正确运行所必需的所有文件

    ²在“工作目录”下指定可执行文件运行时作为要工作目录使用的目录

    ²指定结果文件的名称

    ²测试将返回 0 或其他数字。测试引擎将 0 解释为“已通过”,其他数字则解释为“已失败”。

     

    EvenOddDemo下载

    命令行参数

    ²对于简单的可以使用单一参数

     

    ²多个参数使用空格分隔

    环境变量

    在下面区域中使用环境变量来显示路径

    ²目标执行

    ²命令行参数

    ²摘要结果文件位置

    ²部署项  

    ²可以使用任何系统定制或自定义的环境变量,比如SystemDrive,ProgramFiles和UserProfile。

    ²特别有用的变量是ComSpec。ComSpec是CMD命令的全名,可以使用ComSpec来运行例如.Bat后缀的命令提示脚本

    ²环境变量不区分大小写

    ²默认情况下,未定义的环境变量扩展成空字符串,例如,如果你在一般测试中指定%MyExecutableDir%MyExecutable.exe ,但MyExecutableDir 没有定义,测试引擎认为这个字符串为 MyExecutable.exe ,并且试图在部署目录中运行它。前提是MyExecutable.exe已经部署

    ²你可以使用一个环境变量来控制测试引擎运行测试的文件夹。例如,如果你设置MyExecutableDir 目录为E:\builds\drop\...\Bin\,那测试引擎试图在这个位置运行文件,这个对于不能移动的测试很有用,这个非常适合测试存放在源代码管理中

    三、收集代码覆盖率

    与手动测试一样,通过LoadTest Config配置中选择代码覆盖配置,见手动测试

    四、创建和使用摘要结果文件

    ²通过使用摘要结果文件,一般测试可以生成特定的详细测试结果

    ²摘要结果文件是 XML 文件,符合特定的 XML 架构

    ²步骤

    Ø使用XSD工具,目的是要使用选择的语言使 xsd 实用工具输出一个包含特定参数和属性的类

     

    Ø编辑要包装为一般测试的程序,使用 xsd 生成的类向一般测试的类中添加参数和属性

    Ø创建一般测试本身来包装现有程序,在一般测试中的“结果设置”之下单击“摘要结果文件”,并指定要放置摘要结果文件的文件夹的路径。

    结果文件示例

    ²<?xml version="1.0" encoding="utf-8" ?>

    ²<SummaryResult>

    ² <TestName>ParentTest</TestName>

    ² <TestResult>Passed</TestResult>

    ² <InnerTests>

    ² <InnerTest>

    ² <TestName>InnerTest1</TestName>

    ² <TestResult>Passed</TestResult>

    ² <ErrorMessage>Everything is fine.</ErrorMessage>

    ²<DetailedResultsFile>D:\Documents and Settings\Results.txt</DetailedResultsFile>

    ² </InnerTest>

    ² <InnerTest>

    ² <TestName>InnerTest2</TestName>

    ² <TestResult>Failed</TestResult>

    ² <ErrorMessage>Something went wrong.</ErrorMessage>

    ² <DetailedResultsFile>D:\Documents and Settings\Results.txt</DetailedResultsFile>

    ² </InnerTest>

    ² </InnerTests>

    ²</SummaryResult>

    五、运行一般测试

    ²测试视图,选择一般测试

    ²测试管理器,选择一般测试

    ²测试结果

    当一般测试包装的可执行程序返回值 0 时,表示测试通过,如果返回任何其他值,则表示测试失败。

  • VSTS For Testers读书笔记(23)

    2007-08-06 12:05:08

    九、参考文档

    —MSDN: 中文——http://msdn2.microsoft.com/zh-cn/library/ms182409(VS.80).aspx

    英文——http://msdn2.microsoft.com/en-us/library/ms182409(VS.80).aspx,推荐看英文的,因为中文的翻译不全,又是翻译机翻的

    —Troubleshooting Load Tests

    http://msdn2.microsoft.com/en-us/library/ms404661(VS.80).aspx

    Bill Barnett's blog

    http://blogs.msdn.com/billbar/

    Ed Glas's blog

    http://blogs.msdn.com/edglas/

    Sean Lumley's Blog

    http://blogs.msdn.com/slumley/

  • VSTS For Testers读书笔记(22)

    2007-08-06 12:04:34

    八、监视与分析

    —监视器和分析器

    —关系图

    —表

    —错误与阈值

    —SQL跟踪

    —分析错误

    —创建插件

    监视器和分析器

    —监视器用来实时查看负载测试结果

    —分析器用于检查已经保存的所有负载测试结果

     

    —分析前提,设置了负载测试结果存储区

     

    嵌入的状态栏显示测试状态以及错误或阈值冲突的总数。

    使用“计数器”窗格中的树结构来快速查看各种性能计数器或各个计算机。

    —计数器

    显示已添加到负载测试中的性能计数器

    —关系图

    显示关系图上来自运行期间收集到的数据的绘制点

    —点

    “关系图”窗格的一部分。显示当前关系图中使用的数据。

    —摘要

    显示从运行中得来的摘要数据。

    —表

    显示一组包含运行数据的表,例如“错误”表和“阈值”表。在分析器中可以查看 SQL 跟踪数据。

    关系图

     

    图形化计数器的图例显示一些有用的数据列

    默认关系图(显示用户负载、吞吐量和响应时间)


     

    —表选项:

    错误

    显示在运行期间创建的错误列表。

    显示在运行中使用的页列表。

    请求

    显示在运行期间发送的所有 HTTP 请求。其中包括从属请求,如图像。

    测试

    显示负载测试中使用的测试列表。

    阈值

    显示运行期间超过的阈值的列表。

    事务

    显示运行中的事务列表。

    SQL 跟踪

    只有在使用 SQL 跟踪时,才可在运行后的分析器中看到该选项。

    代理

    只有在包含多个代理的 rig 上运行测试时,才可看到该选项。

    错误与阈值

    —错误和阈值计数在嵌入的状态栏上显示为链接。

    —单击其中一个链接便会激活相应的表:“错误”表或“阈值”表。

    计数器树显示了阈值冲突。如果当前的采样间隔内发生了阈值冲突,则除了节点名称外,您还会看到一个红色的符号或一个黄色的符号。在运行持续期间,这些符号将保留,但当不再超出阈值时,这些符号就会灰显。

    阈值网格显示了前 1,000 个阈值冲突,包括发生冲突的时间。

    可以找到一个超出阈值的计数器,并通过把符号拖动到关系图上的方式来绘制该计数器。

    警告:

    错误:

    阈值

    —在负载测试中显示阈值冲突时,可以在两种阈值规则中进行选择:

    Ø比较常数

    将性能计数器的值与一个常数值进行比较。

    Ø比较计数器

    将一个性能计数器的值与另一个性能计数器的值进行比较。

    可以设置一个“警告阈值”级别,当达到该警告级别时,负载测试监视器和分析器中便会出现一个指示此警告的黄色符号。

    可以设置一个“关键阈值”级别,当达到该警告级别时,负载测试监视器和分析器中便会出现一个指示此警告的红色符号。

    比较计数器属性设置:临界阈值和警告阈值

    新建比较常数

    新建比较计数器

    SQL跟踪

    —通过收集跟踪数据,可以识别出在所测试的 SQL 数据库中运行速度最慢的查询和存储过程。

    —单击“表”按钮。从“表”列表框中选择“SQL 跟踪”。

    —通常,“持续时间”列是第一个要检查的列。此列中收集的数据的单位为毫秒。

    —SQL 跟踪面板将列出运行速度最慢的 SQL 操作,并根据持续时间按照最慢的操作放在最上面的方式来排序。

     

    —此面板上可以显示的 SQL 跟踪输出中的数据列:

    Ø事件类

    Ø持续时间

    ØCPU

    Ø读取

    Ø写入

    Ø文本数据

    Ø开始时间

    Ø结束时间

    Ø主机名

    Ø应用程序名

    Ø登录名

    ØNT 用户名

     

    如果需要跟踪 SQL 事件而不是跟踪在这些列中标识出的数据,则必须使用与 Visual Studio Team Edition for Testers 分开提供的 SQL Profiler 工具设置自己的自定义 SQL 跟踪。

    分析错误

    —提供了两种查看错误的方式:关系图和表

    —Demo

    —Example:Could not find dependent counter needed to apply threshold rule

    —Example:The load test results database could not be opened.

    解决参考:

    http://msdn2.microsoft.com/en-us/vstudio/aa718685.aspx

    创建插件

    —负载测试提供了API,Microsoft.VisualStudio.TestTools.LoadTesting

    —可以使用API创建负载测试插件

    —Demo

    using System;

    using Microsoft.VisualStudio.TestTools.LoadTesting;

    using System.Net.Mail;

    using System.Windows.Forms;

    namespace DataDrivenUnitTest

    {

    public class MyLoadTestPlugin : ILoadTestPlugin

    {

    LoadTest myLoadTest;

    public void Initialize(LoadTest loadTest)

    {

    myLoadTest = loadTest;

    myLoadTest.LoadTestFinished += new

    EventHandler(myLoadTest_LoadTestFinished);

    }

    void myLoadTest_LoadTestFinished(object sender, EventArgs e)

    {

    try

    {

    // place custom code here

    MailAddress MyAddress = new

    MailAddress("someone@example.com");

    MailMessage MyMail = new MailMessage(MyAddress, MyAddress);

    MyMail.Subject = "Load Test Finished -- Admin Email";

    MyMail.Body = ((LoadTest)sender).Name + " has finished.";

    SmtpClient MySmtpClient = new

    SmtpClient("localhost");

    MySmtpClient.Send(MyMail);

    }

    catch (SmtpException ex)

    {

    MessageBox.Show(ex.InnerException.Message +

    ".\r\nMake sure you have a valid SMTP.");

    }

    }

    }

    }

    —有八种事件与负载测试相关联,且可在负载测试插件中进行处理,以使用负载测试运行自定义代码。以下是事件的列表,这些事件提供对负载测试运行的不同时间段的访问:

    ØLoadTestStarting

    ØLoadTestFinished

    ØLoadTestWarmupComplete

    ØTestStarting

    ØTestFinished

    ØThresholdExceeded

    ØHeartBeat

    ØLoadTestAborted

    Demo下载

  • VSTS For Testers读书笔记(21)

    2007-08-06 12:03:00

    七、运行LoadTest

    —负载测试可从三个位置运行

    Ø“测试视图”窗口

    Ø“测试管理器”窗口

    Ø负载测试编辑器

    —从命令行运行负载测试

    mstest /testcontainer:LoadTest1.loadtest

    —使用代理运行负载测试

    通过远程控制器来运行代理机上的负载测试

  • VSTS For Testers读书笔记(20)

    2007-08-06 12:02:16

    六、创建和编辑LoadTest

    1、创建LoadTest

    新建一个负载测试是通过负载测试向导来完成的

    方案

    —负载测试包含一个或多个方案,用于对用户组与服务器应用程序交互的方式进行建模

    —单个方案由负载模式、测试组合、浏览器组合和网络组合组成

    —其中的每个设置均与“负载测试向导”中的一个页面对应

    —负载测试可包含 Web 测试和单元测试

    负载模式

    —负载模式指定在负载测试期间活动的虚拟用户数以及启动新用户的速率

    —每个负载模式在负载测试中都有不同的目标,必须确定如何实现特定方案的测试目标

    测试组合

    —“测试组合”用于指定虚拟用户运行负载测试方案中的给定测试的概率

    —测试均选自现有 Web 测试和单元测试

    浏览器组合

    —浏览器组合指定虚拟用户运行给定浏览器配置文件的概率

    —浏览器组合应反映特定方案的测试目标

    网络组合

    —“网络组合”指定虚拟用户运行指定网络配置文件的概率

    计数器集

    —计数器集是可用于在负载测试过程中进行监视的一组系统性能计数器

    —计数器集按不同技术划分,例如 ASP.NET 计数器集或 SQL 计数器集

    运行设置

    —“运行设置”是一组影响负载测试方案的属性

    —运行设置和计数器集类似,应用于负载测试中的所有方案,而非单个方案

    —运行设置可决定测试的长度、预热持续时间、报告错误的最大数量、采样速率、连接模型(仅适用于 Web 测试)、结果存储类型、验证级别和 SQL 跟踪

    最后完成一个LoadTest文件建立

    —每个设置都可以在其属性中进行修改值来编辑

    2、编辑LoadTest

    LoadTest文件属性:

    这里有个负载测试的插件设置,在后面会介绍到

    方案属性:

    某个具体计数器的属性:

    这个设置比较重要,在后面运行测试后,排除错误或警告往往需要这个设置

    运行设置属性:

  • VSTS For Testers读书笔记(19)

    2007-08-06 12:01:17

    五、其他设置

    —计数器集

    —运行设置

    —思考时间

    —结果存储区

    1、计数器集

    —计数器集是一组可在负载测试运行期间用于监视的性能计数器。计数器集是负载测试的一部分,可应用于负载测试中的所有方案。计数器集按不同的技术组织在一起,例如 ASP.NET 计数器集或 SQL 计数器集。

    —计数器集与负载测试期间使用的计算机之间的关联就是计数器集映射。

    —默认情况下,在控制器和代理上收集性能计数器。

    —应将正在测试的服务器添加到需要收集其计数器的计算机的列表中,这样就可以在负载测试期间收集和监视任何重要的系统数据

    —计数器阈值是在某个特定的性能计数器上设置的一个警报,用于在负载测试运行期间通报系统资源的使用情况

    —有两种类型的阈值:警告和危急

    —计数器集定义中包含有许多关键的性能计数器的预定义阈值

    使用

    —负载测试工具会不断地使用计数器收集性能数据并绘制相应的图形

    —将在服务器和任何运行测试的计算机上收集计数器数据

    —三种计数器类别:百分比、计数和平均数。这三种计数器类别的例子分别为:“% CPU usage”(CPU 使用百分比)、“SQL Server lock counts”(SQL Server 锁计数)和“IIS requests per second”(每秒的 IIS 请求数)。

    —各个 HTTP 请求的性能数据由运行测试的计算机(如代理计算机)报告

    2、运行设置

    —“运行设置”是能影响负载测试的运行方式的一组属性。在“属性”窗口中,运行设置按类别进行组织。

    负载测试向导设置:

     

    —一个负载测试中可以具有多个运行设置。对于每次负载测试运行,只有一个运行设置可以处于活动状态。其他运行设置提供了一组易于访问的备用设置,以用于后续的测试运行。

    —在“负载测试编辑器”中,活动运行设置以“[Active]”后缀来标识。

    运行设置类别

    —常规

    —结果

    —SQL跟踪

    —计时

    —WebTest连接

    常规

    1、说明

    对运行设置的说明。

    2、最多错误详细信息

    已失败请求的请求与响应详细信息最大存储数。这很重要,因为详细的错误结果可能使用大量的数据库存储区。如果不想记录错误详细信息,则请使用 0 值。

    3、名称

    运行设置显示在“负载测试编辑器”的“运行设置”节点中时使用的名称。

    4、验证级别

    此类别定义了将在负载测试中运行的验证规则的最高级别。验证规则与 Web 测试请求相关联。每个验证规则都有关联的验证级别:高、中或低。此负载测试运行设置将指定在负载测试中运行 Web 测试时将运行哪些验证规则

    结果

    —存储类型

    存储在负载测试中获得的性能计数器的方式

    “None”

    “database” -- 需要具有负载测试结果存储区的 SQL 数据库。

    “XmlResultFile” -- 将结果作为 XML 文件保存在驱动器上。实际我在属性中没有发现此选项。很是奇怪,不知道是不是版本问题。

    —计时详细信息存储

    用于确定要在负载测试结果存储区中存储哪些详细信息

    AllIndividualDetails - 在负载测试结果存储区中收集并存储在负载测试期间运行/发出的每个测试、事务和页的单个计时值。

    “StatisticsOnly”- 在负载测试结果存储区中只收集并存储统计信息,而不是在负载测试期间执行/发出的每个测试、事务和页的单个计时值。

    “None”- 不收集任何单个计时值。这是默认值。

    SQL跟踪

    —“跟踪的 SQL 操作的最短持续时间(以毫秒为单位)”

    要由 SQL 跟踪捕获的 SQL 操作的最短持续时间。

    —“SQL 跟踪连接字符串”

    用于访问要跟踪的数据库的连接字符串。

    —“SQL 跟踪目录”

    跟踪结束后放置 SQL 跟踪文件的位置。SQL Server 必须具有对该目录的写权限,控制器必须具有对它的读权限。

    —“已启用 SQL 跟踪”

    这将启用 SQL 操作的跟踪。默认值为 off。

    计时

    —运行持续时间(秒)

    这是表示负载测试运行持续时间的值,以秒为单位。

    —采样速率(秒)

    用于捕获性能计数器值的间隔。

    —预热持续时间(秒)

    从测试开始到开始记录数据样本之间的时间段。这段时间通常用于在记录采样值之前使负载虚拟用户达到特定的负载级别。在预热期结束之前捕获的采样值将显示在“负载测试监视器”中

    WebTest 连接

    —WebTest 连接模型

    对于在负载测试中运行的 Web 测试,此参数控制从负载测试代理到 Web 服务器之间的连接的用法

    有两个 Web 测试连接模型选项

    Ø “ConnectionPerUser”模型模拟使用真实浏览器的用户的行为。

    Ø“ConnectionPool”模型将在多个虚拟 Web 测试用户之间共享 Web 服务器的连接,从而节约负载测试代理上的资源。

    —WebTest 连接池大小

    这指定要在负载测试代理和 Web 服务器之间建立的最多连接数。此参数只适用于“ConnectionPool”模型。

    3、思考时间

    —思考时间用于模拟人与网站执行的各种交互之间存在等待时间这种行为

    —Web 测试中的各个请求之间以及负载测试方案的各个测试迭代之间均会产生思考时间

    —“思考配置文件”是应用于负载测试中的某个方案的一种设置。此设置决定是否在负载测试过程中使用在各个 Web 测试中保存的思考时间

    三种设置:

    —Off

    忽略思考时间。

    如果希望生成最大负载以便对 Web 服务器进行高强度的压力测试,可使用此设置。如果试图更加真实地模拟用户与 Web 服务器的交互情况,请不要使用此设置。

    —On

    根据记录使用思考时间。

    完全根据记录模拟多个运行 Web 测试的用户。由于负载测试模拟多个用户,使用相同的思考时间会建立一种不自然的负载模式,似乎各个用户正在同步执行操作。

    —正态分布

    使思考时间的变化情况符合正态分布曲线。

    通过对不同请求间的思考时间略加修改,可更真实地模拟虚拟用户的操作。

    4、结果存储区

    —计数器集和性能计数器数据之间有所不同。计数器集是元数据 -定义应从执行特定角色(如 IIS 或 SQL Server)的计算机收集的一组性能计数器。计数器集是负载测试定义的一部分。性能计数器数据是根据计数器集、计数器集到特定计算机的映射以及采样速率收集的数据。

    查询和报告

    —可以使用任何标准 SQL 查询工具对负载测试结果存储区进行查询

    —可以使用任何 SQL 报告工具创建自定义报告

    结果分析

    —在测试运行时,可以使用负载测试监视器查看负载测试运行的结果

    —完成测试之后,可以使用负载测试分析器查看负载测试运行的结果

  • VSTS For Testers读书笔记(18)

    2007-08-06 12:00:13

    四、组合

    —测试组合

    —浏览器组合

    —网络组合

    1、测试组合

    —测试组合指定虚拟用户在负载测试方案中运行指定测试的概率。这样可以更逼真地模拟负载。应用程序中可以有多个工作流而不是仅有一个,这可以更接近最终用户与应用程序交互的方式。

    —向负载测试中添加一组测试之后,测试组合可像其他组合选项一样工作。虚拟用户根据在组合中指定的概率随机选择测试。例如,如果有两个测试,在组合中各占 50% 的概率,则一个新虚拟用户基本上通常会选择运行第一个测试。在 50/50 组合中,如果一个测试较长,另一个较短,则负载更多来自于较长的测试。

    —将测试添加到组合中之后,可以在以后将其移除。也可以使用测试组合控件更改组合的分发方案。

    组合控件

    —通过组合控件可以方便地调整方案中的测试分发方案。可以根据百分比将滑块拖动到相应设置。移动滑块时,将看到百分比发生改变。如果选择锁定列中的框,则锁定该百分比。现在再移动滑块时,锁定的百分比不会发生改变。

    —分发按钮可使分发方案中的所有组合百分比设置为相等。

    —可以直接编辑此百分比。在“%”列中键入您想要的数字。

    2、浏览器组合

    —浏览器组合指定虚拟用户在负载测试方案中运行给定浏览器类型的概率。创建一个负载测试时,可能希望模拟通过多个浏览器生成负载的情况。

    —从提供的浏览器集中向浏览器组合中添加一种浏览器类型时,就会在 Web 测试所提交的每个 HTTP 请求中添加一组与所选浏览器相关联的标头。

    —浏览器组合的工作方式与其他组合选项的工作方式相似。浏览器类型基于浏览器组合与虚拟用户随机关联。该用户的测试基于您在组合中指定的概率在特定浏览器上运行。

    —指定了浏览器组合后,还可以以后向组合中添加以及从中移除浏览器类型。还可以使用浏览器组合控件来更改组合的分发方案。

    —浏览器组合为您提供了一种更真实地模拟负载的方法。负载使用异类浏览器组合而非单一种类的浏览器生成。这样便创建了一种与您的应用程序所用浏览器更为接近的浏览器使用情形。

    3、网络组合

    —网络组合指定了运行某个给定的网络配置的虚拟用户的出现概率。网络配置是在应用层对网络带宽的一种模拟,但它不模拟网络延迟。

    —在创建负载测试时,可能希望模拟通过多种类型的网络连接产生的负载的情况。网络组合提供了几种网络类型,其中包括:

    ØLAN(默认)

    ØT3,6.0Mbps

    ØT1

    ØCable/DSL,1.5Mbps

    ØCable/DSL,768k

    ØCable/DSL,384k

    Ø拨号,56k

    Ø拨号,33.6k

    Ø拨号,28.8k

    —模拟不同的网络。如果选择其中某个选项(如 Cable/DSL 1.5Mbps),便会在测试中注入等待时间以模拟所选择的网络带宽。

    —网络组合的工作方式类似于其他组合选项。根据网络组合,与虚拟用户关联的网络类型是随机选取的。根据在组合中指定的概率,使用特定的网络类型运行该用户的测试

    —在指定网络组合后,可以在以后添加和移除网络类型。还可以使用网络组合控制,更改组合的分布。

    —网络组合为您提供了一种更加真实地模拟负载的手段。负载是使用不同种类的网络类型组合生成的,而不仅仅是一种单一的网络类型。这样可建立更加贴近于最终用户实际的应用程序连接情况的模拟行为。

  • VSTS For Testers读书笔记(17)

    2007-08-06 12:00:13

    三、模式

    —负载模式属性指定在负载测试过程中如何调整模拟用户负载。Team Edition for Testers 提供三种内置负载模式:恒负载模式、单步负载模式和基于目标的负载模式。根据负载测试目标,选择负载模式并将属性调整到合适的级别。

    —负载模式是方案的组件。方案加上定义的负载模式便构成了负载测试。

    负载模式

    —恒负载模式

    —单步负载模式

    —基于目标的负载模式

    恒负载模式

    —恒负载模式用于指定在负载测试期间不发生变化的用户负载

    —对 Web 应用程序运行冒烟测试时,可以设置一个较小的、10 个用户的恒负载

    单步负载模式

    —单步负载模式用于指定随时间不断增加到定义的最大用户负载的用户负载。对于单步负载,指定“初始用户计数”、“最大用户计数”、“单步持续时间(秒)”和“单步用户计数”。

    —注意:如果总的测试持续时间比逐步增加到最大用户负载所需的时间短,则经过测试持续时间后,测试将停止,并且不会达到“最大用户计数”目标。

    基于目标的负载模式

    —基于目标的负载模式与单步模式相似,但它基于相对于定期用户负载调整的性能计数器阈值调整用户负载。

    用户计数限制 :1-100

    性能计数器的目标范围 :70-90

    —基于目标的负载可用于多种不同的用途:

    Ø最大化代理的输出:衡量代理上的关键限制指标,以使代理的输出最大化。通常是 CPU,但也可以是内存。

    Ø在目标服务器上达到某个目标资源级别(通常是 CPU),然后衡量该级别的吞吐量。这样,在服务器上的资源使用级别一致时,就可以进行吞吐量的运行间比较。

    Ø达到服务器上的目标吞吐量级别。

    在负载测试向导中,只提供了恒负载模式和单步负载模式的设置

    使用向导生成LoadTest文件后,可以在负载测试编辑器中设置3种模式

  • VSTS For Testers读书笔记(16)

    2007-08-06 11:58:38

    二、方案

    —负载测试包含一些方案,这些方案包含 Web 测试或单元测试。

    —“方案”是负载测试中的容器,可在方案中指定负载模式、测试组合、浏览器组合和网络组合。

    —通过方案可以灵活地配置测试特征,便于模拟复杂的现实工作负载,因此方案非常重要。

    例如,您可能正在测试某电子商务站点,其 Internet 前端由数百位客户同时访问,这些客户的访问连接速度和浏览器都各不相同。该站点还可以具有管理功能,由内部员工用于产品更新和查看统计信息。这些内部用户通常会使用相同的浏览器和高速 LAN 连接访问该站点。您可能希望将这两种不同用户组的属性封装到不同方案中。每个方案可包含一个虚拟用户类型。在此示例中,可使一个负载测试方案表示虚拟客户,另一个方案表示网站的内部虚拟用户。在此示例中,虚拟用户表示正在浏览网站的单个用户。虚拟用户还可以是 Web 服务的使用者。

    方案设置

    附加设置

    —思考配置文件

    确定在负载测试时是使用还是忽略思考时间

    应用于负载测试中的整个方案

    —测试迭代之间的秒数

    允许一个测试结束和另一个测试开始之间有一定的时间间隔

    —IP 切换

    —新用户百分比

    “IP 切换”和“新用户百分比”属性只可在“负载测试编辑器”中更改,其他属性在负载测试向导和负载测试编辑器都可以设置

  • VSTS For Testers读书笔记(15)

    2007-08-06 11:57:57

    一、概述
    1、负载测试的主要目标是要模拟许多用户同时访问一台服务器的情况。
    2、向负载测试添加 Web 测试时,会模拟多个用户同时连接到一台服务器并发出多个 HTTP 请求的过程。可以在负载测试上设置广泛应用于各个 Web 测试的属性。
    3、向负载测试添加单元测试时,会测试非基于 Web 的服务器组件的性能。负载下单元测试的一个示例应用程序用于测试数据访问模型组件。
    4、负载测试可用于一组称为 rig 的计算机,rig 由多个代理和一个控制器组成。其中Rig需要额外组件Visual Studio 2005 Test Load Agent 支持

    负载测试可用于几种不同的测试类型: 

    —冒烟测试
    确定在短时间内负载较小时应用程序如何执行。

    —压力测试
    确定在较长时间内负载较大时应用程序是否能成功运行。

    —性能测试 
    确定应用程序的响应能力。

    —容量计划测试
    确定在各种容量下应用程序如何执行。

    负载测试由一系列 Web 测试或单元测试组成,这些测试在存在多个模拟用户的情况下运行一段时间。

  • 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请求的标头和正文


    响应:响应标头和正文


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


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


  • 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下载。

251/212>
Open Toolbar