<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US"><title type="html">Sean Lumley&amp;#39;s Blog </title><subtitle type="html">Web/Load Testing</subtitle><id>http://blogs.msdn.com/b/slumley/atom.aspx</id><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/slumley/" /><link rel="self" type="application/atom+xml" href="http://blogs.msdn.com/b/slumley/atom.aspx" /><generator uri="http://telligent.com" version="5.6.50428.7875">Telligent Evolution Platform Developer Build (Build: 5.6.50428.7875)</generator><updated>2009-11-07T00:43:51Z</updated><entry><title>Description of Tables and Columns in VS 2010 Load Test Database</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/slumley/archive/2010/02/12/description-of-tables-and-columns-in-vs-2010-load-test-database.aspx" /><id>http://blogs.msdn.com/b/slumley/archive/2010/02/12/description-of-tables-and-columns-in-vs-2010-load-test-database.aspx</id><published>2010-02-12T18:36:00Z</published><updated>2010-02-12T18:36:00Z</updated><content type="html">&lt;P&gt;In this&amp;nbsp;blog post I am going to update&amp;nbsp;Bill Barnett's post which describes the&amp;nbsp;tables and columns in the load test database.&amp;nbsp;&amp;nbsp;Here is Bill's original post which applies to VS&amp;nbsp;2005 and VS 2008:&amp;nbsp;&amp;nbsp;&lt;A class="" title="2008 Database Structure" href="http://blogs.msdn.com/billbar/articles/529874.aspx" mce_href="http://blogs.msdn.com/billbar/articles/529874.aspx"&gt;2008 Database&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;First, in VS 2010 the default load test database name has been changed from LoadTest to LoadTest2010.&amp;nbsp; Now let's review the tables.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;*** Each new table&amp;nbsp;or column will be prefixed with ***&lt;/P&gt;
&lt;P&gt;Table: &lt;STRONG&gt;LoadTestRun&lt;/STRONG&gt;: Contains one row for each load test that is executed.&lt;/P&gt;
&lt;P&gt;Columns:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;LoadTestRunId (int):&lt;/STRONG&gt; A unique Id for this load test run in this load test results store.&amp;nbsp;&amp;nbsp; The value is 1 for the first load test and increments for each load test that is executed.&amp;nbsp;&amp;nbsp; All of the tables in the load test results store use the LoadTestRunId identify the load test run to which the data belongs. 
&lt;LI&gt;&lt;STRONG&gt;LoadTestName (nvarchar(255)): &lt;/STRONG&gt;The name of the load test 
&lt;LI&gt;&lt;STRONG&gt;RunId (char (36))&lt;/STRONG&gt;: A Guid that identifies the test run in which the load test was run. 
&lt;LI&gt;&lt;STRONG&gt;Description (nvarchar (255)):&lt;/STRONG&gt; A description of the load test from the Analysis dialog in the Load Test Results Viewer. 
&lt;LI&gt;&lt;STRONG&gt;StartTime (datetime):&lt;/STRONG&gt; The time at which the load test started. 
&lt;LI&gt;&lt;STRONG&gt;EndTime (datetime):&lt;/STRONG&gt; The time at which the load test completed or was stopped by the user.&amp;nbsp; EndTime is NULL while the test is in progress. 
&lt;LI&gt;&lt;STRONG&gt;RunDuration (int):&lt;/STRONG&gt; The load test run duration (in seconds) that was specified in the active Run Settings for the load test. 
&lt;LI&gt;&lt;STRONG&gt;WarmupTime (int):&lt;/STRONG&gt; The warmup time (in seconds) that was specified in the active Run Settings for the load test. 
&lt;LI&gt;&lt;STRONG&gt;RunSettingUsed (nvarchar (32)):&lt;/STRONG&gt; The name of the active Run Settings at the time the load test was run. 
&lt;LI&gt;&lt;STRONG&gt;IsLocalRun (bit):&lt;/STRONG&gt; Indicates whether the load test was run locally or a rig (controller &amp;amp; agent(s)): 1 for local; 0 for rig. 
&lt;LI&gt;&lt;STRONG&gt;ControllerName (nvarchar (255)):&lt;/STRONG&gt; Name of the controller computer (or local computer name for a local run). 
&lt;LI&gt;&lt;STRONG&gt;Outcome (nvarchar (32)):&lt;/STRONG&gt; The outcome of the load test, which will be one of: "InProgress", "Completed", "Aborted", or "Error". 
&lt;LI&gt;&lt;STRONG&gt;LoadTest (image): &lt;/STRONG&gt;An encoded version of the LoadTest that was run. 
&lt;LI&gt;&lt;STRONG&gt;Comment (ntext):&lt;/STRONG&gt; A potentially long comment about the load test from the Analysis dialog in the Load Test Results Viewer.&lt;/LI&gt;
&lt;LI&gt;***&lt;STRONG&gt;LoadTestSchemaRev(int):&lt;/STRONG&gt; An integer indicating what version of product the run was created with.&amp;nbsp; If you&amp;nbsp;use VS2008 against this DB, this column will be null.&amp;nbsp; If you use VS2010, it will be 3.&lt;/LI&gt;
&lt;LI&gt;***&lt;STRONG&gt;CooldownTime(int): &lt;/STRONG&gt;This is amount of time spent in cooldown phase.&amp;nbsp; This time is in seconds.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Table:&lt;STRONG&gt; LoadTestCase&lt;/STRONG&gt;: Stores data on the inner tests included in the load test (one row per inner test)&lt;/P&gt;
&lt;P&gt;Columns:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;LoadTestRunId (int):&lt;/STRONG&gt; The unique Id of the load test run 
&lt;LI&gt;&lt;STRONG&gt;ScenarioId (int)&lt;/STRONG&gt;: The unique Id of the Scenario containing the test (from the LoadTestScenario table) 
&lt;LI&gt;&lt;STRONG&gt;TestCaseId (int):&lt;/STRONG&gt; A unique Id for the test within this load test run 
&lt;LI&gt;&lt;STRONG&gt;TestCaseName (nvarchar (64)):&lt;/STRONG&gt; The name of the test&lt;/LI&gt;
&lt;LI&gt;***&lt;STRONG&gt;TestElement (image): &lt;/STRONG&gt;Identifier as to which test type the test case is(Web Test, Unit Test, etc...)&lt;/LI&gt;
&lt;LI&gt;***&lt;STRONG&gt;TestType (nvarchar(64)):&lt;/STRONG&gt; Readable version of what test type the test case is&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Table: &lt;STRONG&gt;LoadTestMessage&lt;/STRONG&gt;: Stores data for each error that occurs during the load test&lt;/P&gt;
&lt;P&gt;Columns:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;LoadTestRunId (int):&lt;/STRONG&gt; The unique Id of the load test run. 
&lt;LI&gt;&lt;STRONG&gt;AgentId (int):&lt;/STRONG&gt; The unique Id of the load test agent on which the error occurred (-1 for errors not specific to an agent) 
&lt;LI&gt;&lt;STRONG&gt;MessageId (int):&lt;/STRONG&gt; A unique Id for the message on the agent during this load test run 
&lt;LI&gt;&lt;STRONG&gt;MessageType (tinyint):&lt;/STRONG&gt; An integer that encodes the type of error; the values used and their meanings are: 0: TestError, 1: Exception, 2; HttpError, 3: ValidationRuleError, 4: ExtractionRuleError, 5: Timeout 
&lt;LI&gt;&lt;STRONG&gt;MessageText nvarchar (2048):&lt;/STRONG&gt; The error message text 
&lt;LI&gt;&lt;STRONG&gt;SubType (nvarchar (64)):&lt;/STRONG&gt; The sub type of the error.&amp;nbsp; The values for this vary depending on the MessageType.&amp;nbsp; For example, if MessageType is Exception, SubType is the name of the Exception class. 
&lt;LI&gt;&lt;STRONG&gt;StackTrace (ntext):&lt;/STRONG&gt; A stack trace for the code location where the error occurred (used when MessageType is Exception or TestError) 
&lt;LI&gt;&lt;STRONG&gt;MessageTimeStamp (datetime):&lt;/STRONG&gt; The time at which the error occurred 
&lt;LI&gt;&lt;STRONG&gt;TestCaseId (int):&lt;/STRONG&gt; The unique Id of the inner test (from the LoadTestCase table) in which the error occurred, or NULL for errors not associated with a specific inner test such as performance counter collection errors. 
&lt;LI&gt;&lt;STRONG&gt;RequestId (int):&lt;/STRONG&gt; The unique Id of the web test request (from the WebLoadTestRequestMap table) on which the error occurred, or NULL for errors not associated with web test request.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;***TestLogId(int):&lt;/STRONG&gt; The unique Id of the test log (from the LoadTestTestLog table).&amp;nbsp; Test log contains the entire testcase and not just the request that failed.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Table: ***&lt;STRONG&gt;LoadTestMessageType&lt;/STRONG&gt;: Stores a row for each type of message that occurs.&amp;nbsp; Whereas LoadTestMessage stores data for each occurence of&amp;nbsp;a message.&lt;/P&gt;
&lt;P&gt;Columns:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;LoadTestRunId (int):&lt;/STRONG&gt; The unique Id of the load test run. 
&lt;LI&gt;&lt;STRONG&gt;MessageTypeId (int):&lt;/STRONG&gt; A unique Id for the message 
&lt;LI&gt;&lt;STRONG&gt;MessageType (tinyint):&lt;/STRONG&gt; An integer that encodes the type of error; the values used and their meanings are: 0: TestError, 1: Exception, 2; HttpError, 3: ValidationRuleError, 4: ExtractionRuleError, 5: Timeout 
&lt;LI&gt;&lt;STRONG&gt;SubType (nvarchar (64)):&lt;/STRONG&gt; The sub type of the error.&amp;nbsp; The values for this vary depending on the MessageType.&amp;nbsp; For example, if MessageType is Exception, SubType is the name of the Exception class. &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Table: &lt;STRONG&gt;LoadTestThresholdMessage:&lt;/STRONG&gt; Stores one row of data for each threshold rule violation&lt;/P&gt;
&lt;P&gt;Columns:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;LoadTestRunId (int):&lt;/STRONG&gt; The unique Id of the load test run 
&lt;LI&gt;&lt;STRONG&gt;TestRunIntervalId (int):&lt;/STRONG&gt; Id of the collection interval during which the threshold rule violation occurred 
&lt;LI&gt;&lt;STRONG&gt;CounterInstanceId (int):&lt;/STRONG&gt; Id of the performance counter instance that had the threshold rule violation 
&lt;LI&gt;&lt;STRONG&gt;MessageId (int):&lt;/STRONG&gt; Unique Id of the threshold rule violation within this load test run 
&lt;LI&gt;&lt;STRONG&gt;MessageText (nvarchar (2048)):&lt;/STRONG&gt; Text describing the threshold rule violation&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Table: ***&lt;STRONG&gt;LoadTestFileAttachment:&lt;/STRONG&gt; Stores one row of data for each file that is beign saved with a run.&amp;nbsp; Typically these will be files that are returned from datacollectors.&lt;/P&gt;
&lt;P&gt;Columns:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;LoadTestRunId (int):&lt;/STRONG&gt; The unique Id of the load test run 
&lt;LI&gt;&lt;STRONG&gt;FileAttachmentId(int):&lt;/STRONG&gt; Unique id for the file 
&lt;LI&gt;&lt;STRONG&gt;MachineName&amp;nbsp;(nvarchar (255)):&lt;/STRONG&gt; Machine where file came from. 
&lt;LI&gt;&lt;STRONG&gt;FileName&amp;nbsp;(nvarchar (260)):&lt;/STRONG&gt; Name of file being stored 
&lt;LI&gt;&lt;STRONG&gt;FileSize(bigint):&lt;/STRONG&gt; Size of file being stored&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Table: ***&lt;STRONG&gt;LoadTestFileAttachmentChunk:&lt;/STRONG&gt; Stores the file content.&amp;nbsp; File is broken into chunks and stored in multiple rows..&lt;/P&gt;
&lt;P&gt;Columns:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;LoadTestRunId (int):&lt;/STRONG&gt; The unique Id of the load test run 
&lt;LI&gt;&lt;STRONG&gt;FileAttachmentId(int):&lt;/STRONG&gt; Unique id for the file.&amp;nbsp; Corresponds to row in LoadTestFileAttachment 
&lt;LI&gt;&lt;STRONG&gt;StartOffset(bigint): &lt;/STRONG&gt;Location in&amp;nbsp;file that where this chunk starts&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;EndOffset(bigint): &lt;/STRONG&gt;Location in&amp;nbsp;file that where this chunk ends&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;ChunkLength(bigint): &lt;/STRONG&gt;Length of bytes being stored&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;ChunkBytes(image): &lt;/STRONG&gt;Actual bytes being stored&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Table: ***&lt;STRONG&gt;LoadTestDataCollectorLog:&lt;/STRONG&gt; Contains one row for each data collector that is running during a loadtest&lt;/P&gt;
&lt;P&gt;Columns:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;LoadTestRunId (int):&lt;/STRONG&gt; The unique Id of the load test run 
&lt;LI&gt;&lt;STRONG&gt;DataCollectorId(int):&lt;/STRONG&gt; Unique id for the data collector.&amp;nbsp; 
&lt;LI&gt;&lt;STRONG&gt;DataCollectorDisplayName(nvarchar(255)): &lt;/STRONG&gt;Name of data collector&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;MachineName(nvarchar(255)): &lt;/STRONG&gt;Name of machine the data collector is running on&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;TimestampColumnName(nvarchar(128)): &lt;/STRONG&gt;Name of column in data collector table which corresponds to time stamp data&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;DurationColumnName(nvarchar(128)):&lt;/STRONG&gt; Name of column in data collector table which corresponds to&amp;nbsp;duration data&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;CreateTableFormatString(nvarchar(max)):&lt;/STRONG&gt; SQL statement used to create table to store data for this data collector&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;EM&gt;Overview of performance counter tables&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; The metadata for all of the performance counters collected during a load test is stored in three related tables: LoadTestPerformanceCounterCategory, LoadTestPerformanceCounter, and LoadTestPerformanceCounter.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; This metadata includes all four components of performance counter identifier: computer name, category name, counter name, and instance name.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Note that these three tables only store metadata about the performance counters; the sampled performance counter values are stored in LoadTestPerformanceCounterSample.&lt;/P&gt;
&lt;P&gt;Table: &lt;STRONG&gt;LoadTestPerformanceCounter&lt;/STRONG&gt;: Stores one row for each performance counter that is collected during the load test &lt;/P&gt;
&lt;P&gt;Columns:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;LoadTestRunId (int):&lt;/STRONG&gt; The unique Id of the load test run 
&lt;LI&gt;&lt;STRONG&gt;CounterCategoryId (int):&lt;/STRONG&gt; The CounterCategoryId from the LoadTestPerformanceCounterCategory row for the catgory containing this counter name 
&lt;LI&gt;&lt;STRONG&gt;CounterId (int):&lt;/STRONG&gt; The unique Id of this performance counter for this load test run 
&lt;LI&gt;&lt;STRONG&gt;CounterName (nvarchar (255)):&lt;/STRONG&gt; The name of the performance counter (for example "Available MBytes")&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;***HigherIsBetter (bit):&lt;/STRONG&gt; A value indicating wheter an increase in this performance counter is a good thing.&amp;nbsp; For example an increase in Available MBytes is typically a good thing.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Table: &lt;STRONG&gt;LoadTestPerformanceCounterCategory&lt;/STRONG&gt;: Stores one row for each performance counter category and computer on which the category is collected&lt;/P&gt;
&lt;P&gt;Columns:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;LoadTestRunId (int):&lt;/STRONG&gt; The unique Id of the load test run 
&lt;LI&gt;&lt;STRONG&gt;CounterCategoryId (int):&lt;/STRONG&gt; The unique Id of this performance counter category for this load test run 
&lt;LI&gt;&lt;STRONG&gt;CategoryName (nvarchar (255)):&lt;/STRONG&gt; The name of the performance counter category (for example "Memory") 
&lt;LI&gt;&lt;STRONG&gt;MachineName (nvarchar (255)):&lt;/STRONG&gt;&amp;nbsp; The name of the computer on which the category was collected 
&lt;LI&gt;&lt;STRONG&gt;StartTimeStamp100nSec (bigint):&lt;/STRONG&gt; A timestamp indicating when the category was first collected during the load test&amp;nbsp;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Table: &lt;STRONG&gt;LoadTestPerformanceCounterInstance&lt;/STRONG&gt;: Stores one for each performce counter instance that is collected during the load test&lt;/P&gt;
&lt;P&gt;Columns:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;LoadTestRunId (int):&lt;/STRONG&gt; The unique Id of the load test run 
&lt;LI&gt;&lt;STRONG&gt;CounterId (int):&lt;/STRONG&gt; The CounterId from the LoadTestPerformanceCounter table for the perf counter of which this is an instance 
&lt;LI&gt;&lt;STRONG&gt;InstanceId (int):&lt;/STRONG&gt; Unique Id of this perf counter instance in this load test run 
&lt;LI&gt;&lt;STRONG&gt;LoadTestItemId (int):&lt;/STRONG&gt; For performance counters in the "LoadTest:*" categories, this uniquely identifies&amp;nbsp;the item in the load test with which&amp;nbsp;this performance counter is associated.&amp;nbsp;&amp;nbsp; For example, for&amp;nbsp;performance counters in the "LoadTest:Request" category, the LoadTestItemId is the value of the RequestId in the WebLoadTestRequestMap table.&amp;nbsp; 
&lt;LI&gt;&lt;STRONG&gt;InstanceName (nvarchar (255)):&lt;/STRONG&gt; The name of the performance counter instance (for example "_Total") 
&lt;LI&gt;&lt;STRONG&gt;CumulativeValue (real):&lt;/STRONG&gt; The final calculated value for this performance counter instance over the entire load test run 
&lt;LI&gt;&lt;STRONG&gt;OverallThresholdRuleResult (tinyint):&lt;/STRONG&gt; Indicates the most severe threshold rule result for this performance counter instance during the load test; 0 for Ok, 1 for Warning, 2 for Critical&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Table: &lt;STRONG&gt;LoadTestPerformanceCounterSample&lt;/STRONG&gt;: Stores the performance counter samples.&amp;nbsp; There is one for each performance counter instance collected for each sampling interval during the loadtest. Many of the columns in this table are fields of the .Net class System.Diagnostics.CounterSample which is used internally by the load test implementation, and their values don't make much sense outside that context.&lt;/P&gt;
&lt;P&gt;Columns:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;LoadTestRunId (int):&lt;/STRONG&gt; The unique Id of the load test run 
&lt;LI&gt;&lt;STRONG&gt;TestRunIntervalId (int):&lt;/STRONG&gt; The sequence number of the collection interval in which this sample was collected 
&lt;LI&gt;&lt;STRONG&gt;InstanceId (int):&lt;/STRONG&gt; The InstanceId from the LoadTestPerformanceCounterInstance table row containing for the performance counter instance of which this is a sample 
&lt;LI&gt;&lt;STRONG&gt;ComputedValue (real):&lt;/STRONG&gt; A value computed for the perf counter based on this sample and the previous sample (or NULL if there was no sample in the previous interval) 
&lt;LI&gt;&lt;STRONG&gt;RawValue (bigint):&lt;/STRONG&gt; The RawValue field of the System.Diagnostics.CounterSample value 
&lt;LI&gt;&lt;STRONG&gt;BaseValue (bigint):&lt;/STRONG&gt; The BaseValue field of the System.Diagnostics.CounterSample value 
&lt;LI&gt;&lt;STRONG&gt;CounterFrequency (bigint): &lt;/STRONG&gt;The CounterFrequency field of the System.Diagnostics.CounterSample value 
&lt;LI&gt;&lt;STRONG&gt;SystemFrequency (bigint):&lt;/STRONG&gt; The SystemFrequency field of the System.Diagnostics.CounterSample value 
&lt;LI&gt;&lt;STRONG&gt;SampleTimeStamp (bigint):&lt;/STRONG&gt; The SampleTimeStamp field of the System.Diagnostics.CounterSample value 
&lt;LI&gt;&lt;STRONG&gt;SampleTimeStamp100nSec (bigint):&lt;/STRONG&gt; The SampleTimeStamp100nSec field of the System.Diagnostics.CounterSample value 
&lt;LI&gt;&lt;STRONG&gt;CounterType (int):&lt;/STRONG&gt; The PerformanceCounterType field of the System.Diagnostics.CounterSample value 
&lt;LI&gt;&lt;STRONG&gt;ThresholdRuleResult (tinyint):&lt;/STRONG&gt; The result of any threshold rule applied to this sample: 0 for Ok, 1 for Warning, 2 for Critical 
&lt;LI&gt;&lt;STRONG&gt;ThresholdRuleMessageId (int):&lt;/STRONG&gt; The MessageId from the LoadTestThresholdMessage row with more details on any threshold violation thrown for this sample, or NULL if there was no threshold violation&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Table: &lt;STRONG&gt;LoadTestRunAgent&lt;/STRONG&gt;: Stores the names of the agent machines used for a load test run&lt;/P&gt;
&lt;P&gt;Columns:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;LoadTestRunId&lt;/STRONG&gt; (int): The unique Id of the load test run 
&lt;LI&gt;&lt;STRONG&gt;AgentId (int):&lt;/STRONG&gt; A unique Id of this agent during this load test run 
&lt;LI&gt;&lt;STRONG&gt;AgentName (nvarchar (255)):&lt;/STRONG&gt; The computer name of the agent&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Table: &lt;STRONG&gt;LoadTestRunInterval&lt;/STRONG&gt;: Stores one row for each performance counter collection interval during the load test run&lt;/P&gt;
&lt;P&gt;Columns:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;LoadTestRunId (int):&lt;/STRONG&gt; The unique Id of the load test run 
&lt;LI&gt;&lt;STRONG&gt;TestRunIntervalId (int):&lt;/STRONG&gt; The unique Id of this interval in this load test run 
&lt;LI&gt;&lt;STRONG&gt;IntervalStartTime (datetime):&lt;/STRONG&gt; The start time of the collection interval 
&lt;LI&gt;&lt;STRONG&gt;IntervalEndTime (datetime):&lt;/STRONG&gt; The end time of the collection interval&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Table: &lt;STRONG&gt;LoadTestScenario:&lt;/STRONG&gt; Stores the names of the Scenarios defined for a load test&lt;/P&gt;
&lt;P&gt;Columns:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;LoadTestRunId (int):&lt;/STRONG&gt; The unique Id of the load test run 
&lt;LI&gt;&lt;STRONG&gt;ScenarioId (int)&lt;/STRONG&gt;: The unique Id of the Scenario within this load test 
&lt;LI&gt;&lt;STRONG&gt;ScenarioName (nvarchar (64)):&lt;/STRONG&gt; The name of the Scenario&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Table: &lt;STRONG&gt;WebLoadTestErrorDetail&lt;/STRONG&gt;: Stores detailed data about a web test request when there is an error associated with a web test request&lt;/P&gt;
&lt;P&gt;Columns:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;LoadTestRunId (int):&lt;/STRONG&gt; The unique Id of the load test run 
&lt;LI&gt;&lt;STRONG&gt;AgentId (int):&lt;/STRONG&gt; The Id of the agent on which the error occurred 
&lt;LI&gt;&lt;STRONG&gt;MessageId (int):&lt;/STRONG&gt; The MessageId from the row in the LoadTestMessage table for the error with which this error detil is associated 
&lt;LI&gt;&lt;STRONG&gt;WebTestRequestResult (image):&lt;/STRONG&gt; A binary encoded version of the object that stores all of the data captured regarding the result of a web test request&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Table: ***&lt;STRONG&gt;LoadTestTestLog&lt;/STRONG&gt;: Stores the entire test case result assoicated with an execution of a testcase.&amp;nbsp; By default just failed tests will be logged, but you can also &lt;BR&gt;configure successful tests to be logged as well.&lt;/P&gt;
&lt;P&gt;Columns:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;LoadTestRunId (int):&lt;/STRONG&gt; The unique Id of the load test run 
&lt;LI&gt;&lt;STRONG&gt;AgentId (int):&lt;/STRONG&gt; The Id of the agent on which testcase was executed 
&lt;LI&gt;&lt;STRONG&gt;TestCaseId (int):&lt;/STRONG&gt; The id of the test case for which log is being stored 
&lt;LI&gt;&lt;STRONG&gt;TestLogId(int):&lt;/STRONG&gt; Unique id for the test log being saved 
&lt;LI&gt;&lt;STRONG&gt;TestLog(image):&lt;/STRONG&gt; A binary encoded version of the object that stores all of the data captured regarding the result of a web test&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Table: &lt;STRONG&gt;WebLoadTestRequestMap&lt;/STRONG&gt;: Stores one row for each unique Uri to which a web test request is sent during the load test&lt;/P&gt;
&lt;P&gt;Columns:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;LoadTestRunId (int):&lt;/STRONG&gt; The unique Id of the load test run 
&lt;LI&gt;&lt;STRONG&gt;RequestId (int):&lt;/STRONG&gt; The unique Id of this request in this load test run 
&lt;LI&gt;&lt;STRONG&gt;TestCaseId (int):&lt;/STRONG&gt; The Id of the web test that generated this request 
&lt;LI&gt;&lt;STRONG&gt;RequestUri (nvarchar (2048)):&lt;/STRONG&gt; The Uri for the request.&amp;nbsp;&amp;nbsp; This excludes the query string parameters except for those query string paramters with the property "&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;***ResponseTimeGoal(float):&lt;/STRONG&gt; If you set a goal for a web test request, that value will be storded in this column&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Table: &lt;STRONG&gt;WebLoadTestTransaction&lt;/STRONG&gt;: Store the names of all transactions defined in the load test (this includes transactions defined in web tests, and transaction defined in unit tests using the BeginTimer()/EndTimer() methods.&lt;/P&gt;
&lt;P&gt;Columns:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;LoadTestRunId (int):&lt;/STRONG&gt; The unique Id of the load test run 
&lt;LI&gt;&lt;STRONG&gt;TransactionId (int):&lt;/STRONG&gt; The unique Id of the transaction in this load test run 
&lt;LI&gt;&lt;STRONG&gt;TestCaseId (int): &lt;/STRONG&gt;The TestCaseid from the LoadTestCase table for the test that defined the transaction 
&lt;LI&gt;&lt;STRONG&gt;TransactionName (nvarchar (64)):&lt;/STRONG&gt; The name of the transaction&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Table: &lt;STRONG&gt;LoadTestSqlTrace&lt;/STRONG&gt;: Stores collected when performing SQL tracing during a load test; the field correspond to SQL trace fields&lt;/P&gt;
&lt;P&gt;Columns:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;LoadTestRunId (int):&lt;/STRONG&gt; The unique Id of the load test run 
&lt;LI&gt;&lt;STRONG&gt;TextData (ntext):&lt;/STRONG&gt; The text of the SQL operation 
&lt;LI&gt;&lt;STRONG&gt;Duration (bigint):&lt;/STRONG&gt; The duration of the SQL operation 
&lt;LI&gt;&lt;STRONG&gt;StartTime (datetime):&lt;/STRONG&gt; The start time of the SQL operation 
&lt;LI&gt;&lt;STRONG&gt;EndTime (datetime):&lt;/STRONG&gt; The end time of the SQL operation 
&lt;LI&gt;&lt;STRONG&gt;Reads (bigint):&lt;/STRONG&gt; The number of reads that occurred while performing the SQL operation 
&lt;LI&gt;&lt;STRONG&gt;Writes (bigint):&lt;/STRONG&gt; The number of writes that occurred while performing the SQL operation 
&lt;LI&gt;&lt;STRONG&gt;CPU (int):&lt;/STRONG&gt; The CPU time required to perform the SQL operation 
&lt;LI&gt;&lt;STRONG&gt;EventClass (int):&lt;/STRONG&gt; An integer identifying the type of SQL operation traced&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Table: &lt;STRONG&gt;LoadTestBrowsers&lt;/STRONG&gt;: Stores the names of all browser types used during the load test&lt;/P&gt;
&lt;P&gt;Columns:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;LoadTestRunId (int):&lt;/STRONG&gt; The unique Id of the load test run 
&lt;LI&gt;&lt;STRONG&gt;BrowserId (int):&lt;/STRONG&gt; The unique Id of this browser 
&lt;LI&gt;&lt;STRONG&gt;BrowserName (nvarchar (255)):&lt;/STRONG&gt; The name of the browser&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Table: &lt;STRONG&gt;LoadTestNetworks&lt;/STRONG&gt;: Stores the names of all network types used during the load test&lt;/P&gt;
&lt;P&gt;Columns:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;LoadTestRunId (int):&lt;/STRONG&gt; The unique Id of the load test run 
&lt;LI&gt;&lt;STRONG&gt;NetworkId (int):&lt;/STRONG&gt; The unique Id of the network type 
&lt;LI&gt;&lt;STRONG&gt;NetworkName (nvarchar (255)):&lt;/STRONG&gt; The name of the network type&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;EM&gt;Tables used to store Timing Details&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;All of the following tables only have data stored in them when the "Timing Details Storage" option on the Load Test Run Settings is set to a value other than "None".&lt;/P&gt;
&lt;P&gt;Table: &lt;STRONG&gt;LoadTestTestDetail:&lt;/STRONG&gt; Stores the results of individual inner tests; there is one row for each test completed during the load test&lt;/P&gt;
&lt;P&gt;Columns: &lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;LoadTestRunId (int)&lt;/STRONG&gt;:The unique Id of the load test run &lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;TestDetailId (int):&lt;/STRONG&gt; A unique Id for this row in the load test run&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;TimeStamp (datetime):&lt;/STRONG&gt; The time that the test completed&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;TestCaseId (int):&lt;/STRONG&gt; The TestCaseId from the LoadTestCase table for the row that identifies the test&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;ElapsedTime (float):&lt;/STRONG&gt; The elapsed time to run the test in seconds&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;AgentId (int):&lt;/STRONG&gt; The AgentId from the LoadTestAgent table row that identifies the agent on which the test was run&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;BrowserId (int):&lt;/STRONG&gt; The BrowserId from the LoadTestBrowser table that identifies the browser type used for a web test&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;NetworkId (int):&lt;/STRONG&gt; The NetworkId from the LoadTestNetwork table that identifies the network type used for a web test&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;***Outcome (tinyint):&lt;/STRONG&gt; A value indicating the outcome of the test case detail&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;***TestLogId (int):&lt;/STRONG&gt; A unique id indicating associated test log from the LoadTestTestLog table&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;***UserId&amp;nbsp;(int):&lt;/STRONG&gt; An int indicating which virtual user executed the test&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;***EndTime (datetime):&lt;/STRONG&gt; The time the test completed&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;***InMeasurementInterval(bit):&lt;/STRONG&gt; 0 if test completed during warmup or cooldown.&amp;nbsp; 1 if test completed during actual duration of load test.&amp;nbsp; Only tests with a value of 1 will be included when computing statistics.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Table: &lt;STRONG&gt;LoadTestPageDetail&lt;/STRONG&gt;: Stores timing results of individual web test pages; there is one row for each web test page completed during the load test&lt;/P&gt;
&lt;P&gt;Columns: &lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;LoadTestRunId (int)&lt;/STRONG&gt;: The unique Id of the load test run &lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;PageDetailId (int)&lt;/STRONG&gt;: A unique Id for this row in the load test run&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;TestDetailId (int):&lt;/STRONG&gt; The TestDetailId from LoadTestTestDetail row with the result for the test containing this page&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;TimeStamp (datetime)&lt;/STRONG&gt;: The time at which the page completed&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;PageId (int):&lt;/STRONG&gt; The RequestId from the WebLoadRequestMap table (join on this to identify the Uri for the page)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;ResponseTime (float):&lt;/STRONG&gt; The response time for the page in seconds&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;ResponseTimeGoal (float):&lt;/STRONG&gt; The response time goal for the page in seconds&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;GoalExceeded (bit):&lt;/STRONG&gt; Bool indicating whether or not the response time goal was exceeded by the response time&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;***EndTime (datetime):&lt;/STRONG&gt; The time the page completed&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;***Outcome (tinyint):&lt;/STRONG&gt; A value indicating the outcome of the page. 0 for pass, 1 for fail&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;***InMeasurementInterval(bit):&lt;/STRONG&gt; 0 if page completed during warmup or cooldown.&amp;nbsp; 1 if&amp;nbsp;page completed during actual duration of load test.&amp;nbsp; Only pages with a value of 1 will be included when computing statistics.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Table: &lt;STRONG&gt;LoadTestTransactionDetail&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Columns:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;LoadTestRunId (int):&lt;/STRONG&gt; The unique Id of the load test run &lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;TransactionDetailId (int):&lt;/STRONG&gt; A unique Id for this row in the load test run&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;TestDetailId (int):&lt;/STRONG&gt; The TestDetailId from LoadTestTestDetail row with the result for the test containing this transaction&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;TimeStamp (datetime):&lt;/STRONG&gt; The time at which the transaction completed &lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;TransactionId (int):&lt;/STRONG&gt; The TransactionId from the WebLoadTestTransaction table (join on this to identify the transaction name)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;ElapsedTime (float):&lt;/STRONG&gt; The elapsed time to complete the transaction in seconds&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;***EndTime (datetime):&lt;/STRONG&gt; The time the&amp;nbsp;transaction completed&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;***InMeasurementInterval(bit):&lt;/STRONG&gt; 0 if transaction completed during warmup or cooldown.&amp;nbsp; 1 if&amp;nbsp;transaction completed during actual duration of load test.&amp;nbsp; Only transactions with a value of 1 will be included when computing statistics.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;***ResponseTime(float):&lt;/STRONG&gt; The difference between this column and the ElapseTime column is that this value does not include thinktime assoicated with a request&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Table: &lt;STRONG&gt;LoadTestTestSummaryData&lt;/STRONG&gt;: Summarizes the detailed Test result data that is stored in LoadTestTestDetail; there is one row for each test in the load test run which rolls up the results for that test&lt;/P&gt;
&lt;P&gt;Columns:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;LoadTestRunId (int):&lt;/STRONG&gt; The unique Id of the load test run &lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;TestCaseId (int):&lt;/STRONG&gt; The TestCaseId from the LoadTestCase table for the row that identifies the test&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;TestsRun (int):&lt;/STRONG&gt; The number of tests completed&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Average (float):&lt;/STRONG&gt; The average time to run the test in seconds&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Minimum (float):&lt;/STRONG&gt; The minimum time to run the test in seconds&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Maximum (float):&lt;/STRONG&gt; The maximim time to run the test in seconds&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Percentile90 (float):&lt;/STRONG&gt; The 90% percentile test time (90% of the tests completed in less than this time)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Percentile95 (float):&lt;/STRONG&gt; The 95% percentile test time (95% of the tests completed in less than this time)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;***Percentile99 (float):&lt;/STRONG&gt; The 99% percentile test time (99% of the tests completed in less than this time)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;***Median(float):&lt;/STRONG&gt; The median time to run the test in seconds&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;***StandardDeviation(float):&lt;/STRONG&gt; The standard deviation of the time to run the test&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Table: &lt;STRONG&gt;LoadTestTransactionSummaryData&lt;/STRONG&gt;: Summarizes the detailed transaction data that is stored in LoadTestTransactionDetail; there is one row for each transaction name used during the load test run which rolls up the results for that transaction.&amp;nbsp; The average column is calculated based on the elapsed time.&amp;nbsp; All other stats are calculated base on the response time of transaction.&amp;nbsp; The response time does not include thinktime.&lt;/P&gt;
&lt;P&gt;Columns:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;LoadTestRunId (int):&lt;/STRONG&gt; The unique Id of the load test run &lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;TransactionId (int):&lt;/STRONG&gt; The TransactionId from the WebLoadTestTransaction table (join on this to identify the transaction name)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;TransactionCount (int):&lt;/STRONG&gt; The number of tests completed&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Average (float):&lt;/STRONG&gt; The average time to run the transaction in seconds&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Minimum (float):&lt;/STRONG&gt; The minimum time to run the transaction in seconds&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Maximum (float):&lt;/STRONG&gt; The maximim time to run the transaction in seconds&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Percentile90 (float):&lt;/STRONG&gt; The 90% percentile transaction time (90% of the transactions completed in less than this time)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Percentile95 (float):&lt;/STRONG&gt; The 95% percentile transaction time (95% of the transactions completed in less than this time)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;***Percentile99 (float):&lt;/STRONG&gt; The 99% percentile transaction time (99% of the transaction completed in less than this time)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;***Median(float):&lt;/STRONG&gt; The median time to run the transaction in seconds&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;***StandardDeviation(float):&lt;/STRONG&gt; The standard deviation of the time to run the transaction &lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;***AverageTransactionTime (float):&lt;/STRONG&gt; The average time to run the transaction in seconds.&amp;nbsp; This value does not include thinktime.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Table: &lt;STRONG&gt;LoadTestPageSummaryData&lt;/STRONG&gt;: Summarizes the detailed page data that is stored in LoadTestPageDetail; there is one row for each page Uri invoked during the load test run which rolls up the results for that page.&lt;/P&gt;
&lt;P&gt;Columns:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;LoadTestRunId (int):&lt;/STRONG&gt; The unique Id of the load test run&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;PageId (int):&lt;/STRONG&gt; The RequestId from the WebLoadRequestMap table (join on this to identify the Uri for the page)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;PageCount (int):&lt;/STRONG&gt; The number of times this page was completed&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Average (float):&lt;/STRONG&gt; The average time to run the page in seconds&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Minimum (float):&lt;/STRONG&gt; The minimum time to run the page in seconds&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Maximum (float):&lt;/STRONG&gt; The maximim time to run the page in seconds&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Percentile90 (float)&lt;/STRONG&gt;: The 90% percentile page time (90% of the pages completed in less than this time)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Percentile95 (float):&lt;/STRONG&gt; The 95% percentile page time (95% of the pages completed in less than this time)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;***Percentile99 (float):&lt;/STRONG&gt; The 99% percentile page time (99% of the pages completed in less than this time)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;***Median(float):&lt;/STRONG&gt; The median time to run the page in seconds&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;***StandardDeviation(float):&lt;/STRONG&gt; The standard deviation of the time to run the page &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Table: &lt;STRONG&gt;LoadTestPageSummaryByNetwork&lt;/STRONG&gt;: Summarizes the detailed page data that is stored in LoadTestPageDetail by network type; there is one row for each page Uri for each network type invoked during the load test run which rolls up the results for that page on each network type.&lt;/P&gt;
&lt;P&gt;Columns:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;LoadTestRunId (int):&lt;/STRONG&gt; The unique Id of the load test run&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;PageId (int):&lt;/STRONG&gt; The RequestId from the WebLoadRequestMap table (join on this to identify the Uri for the page)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;NetworkId (int):&lt;/STRONG&gt; The NetworkId from the LoadTestNetwork table that identifies the network type used for a web&amp;nbsp; test&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;PageCount (int):&lt;/STRONG&gt; The number of times this page was completed (on the the network type identified by NetworkId)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Average (float):&lt;/STRONG&gt; The average time to run the page in seconds (on the the network type identified by NetworkId)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Minimum (float):&lt;/STRONG&gt; The minimum time to run the page in seconds (on the the network type identified by NetworkId)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Maximum (float):&lt;/STRONG&gt; The maximim time to run the page in seconds (on the the network type identified by NetworkId)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Percentile90 (float):&lt;/STRONG&gt; The 90% percentile page time (on the the network type identified by NetworkId)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Percentile95 (float):&lt;/STRONG&gt; The 95% percentile page time (on the the network type identified by NetworkId)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Goal (float):&lt;/STRONG&gt; The response time goal for the page&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;PagesMeetingGoal (int):&lt;/STRONG&gt; The number of pages run (on the the network type identified by NetworkId) with a response time less than the goal.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;***Median(float):&lt;/STRONG&gt; The median time to run the page in seconds (on the the network type identified by NetworkId)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;***StandardDeviation(float):&lt;/STRONG&gt; The standard deviation of the time to run the page&amp;nbsp;(on the the network type identified by NetworkId)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;***Percentile99 (float):&lt;/STRONG&gt; The 99% percentile page time (on the the network type identified by NetworkId)&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Table: ***&lt;STRONG&gt;LoadTestDetailMessge&lt;/STRONG&gt;: This table will show the links between a test or page detail and an error message.&amp;nbsp; For example, you can use this to figure out what page details failed with a HTTP Status Code of 404.&lt;/P&gt;
&lt;P&gt;Columns:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;LoadTestRunId (int):&lt;/STRONG&gt; The unique Id of the load test run&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;LoadTestDetailMessageId (int):&lt;/STRONG&gt; The unique id for this message/test/page combination.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;TestDetailId(int):&lt;/STRONG&gt; The TestDetailId from LoadTestTestDetail table which corresponds to this test&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;PageDetailId(int):&lt;/STRONG&gt; The PageDetailId from LoadTestPageDetail table which corresponds to this page&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;MessageTypeId (int):&lt;/STRONG&gt; The unique id for the message assoicated with this test/page detail.&amp;nbsp; This corresponds to a row in LoadTestMessageType.&lt;/LI&gt;&lt;/UL&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9962779" width="1" height="1"&gt;</content><author><name>slumley</name><uri>http://blogs.msdn.com/slumley/ProfileUrlRedirect.ashx</uri></author><category term="VSTS" scheme="http://blogs.msdn.com/b/slumley/archive/tags/VSTS/" /><category term="Web Test" scheme="http://blogs.msdn.com/b/slumley/archive/tags/Web+Test/" /><category term="Load Test" scheme="http://blogs.msdn.com/b/slumley/archive/tags/Load+Test/" /><category term="VSTS2010" scheme="http://blogs.msdn.com/b/slumley/archive/tags/VSTS2010/" /><category term="Visual Studio 2010" scheme="http://blogs.msdn.com/b/slumley/archive/tags/Visual+Studio+2010/" /><category term="VSTS Testing" scheme="http://blogs.msdn.com/b/slumley/archive/tags/VSTS+Testing/" /></entry><entry><title>Convert Comments entered in Web Test Recorder into Transactions</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/slumley/archive/2010/01/26/convert-comments-entered-in-web-test-recorder-into-transactions.aspx" /><id>http://blogs.msdn.com/b/slumley/archive/2010/01/26/convert-comments-entered-in-web-test-recorder-into-transactions.aspx</id><published>2010-01-26T20:22:00Z</published><updated>2010-01-26T20:22:00Z</updated><content type="html">&lt;P&gt;This post is going to be one more sample of a Web Test Recorder Plug-in.&amp;nbsp; The recorder plug-ins are a new feature in VS 2010.&amp;nbsp; In this sample, we will convert comments that are entered in the recorder into transactions.&amp;nbsp; I have heard this request from a number of people and thought it would be a useful plug-in.&amp;nbsp;&amp;nbsp;&amp;nbsp; Here are 2 previous recorder plug-in posts: &lt;A href="http://blogs.msdn.com/slumley/archive/2009/06/04/vsts-2010-feature-extensible-recorder-plugins-for-modifying-recorded-web-tests-including-adding-custom-dynamic-parameter-correlation.aspx" target=_blank mce_href="http://blogs.msdn.com/slumley/archive/2009/06/04/vsts-2010-feature-extensible-recorder-plugins-for-modifying-recorded-web-tests-including-adding-custom-dynamic-parameter-correlation.aspx"&gt;Correlation plugin&lt;/A&gt;&amp;nbsp; and &lt;A href="http://blogs.msdn.com/slumley/archive/2010/01/26/vsts-2010-feature-another-sample-web-test-recorder-plug-in.aspx" target=_blank mce_href="http://blogs.msdn.com/slumley/archive/2010/01/26/vsts-2010-feature-another-sample-web-test-recorder-plug-in.aspx"&gt;Plug-in which adds Validation rule to test&lt;/A&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Follow these steps to create plug-in which converts comments to transactions.&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Create a new class library project &lt;/LI&gt;
&lt;LI&gt;Right Click references node and select “Add reference…” &lt;/LI&gt;
&lt;LI&gt;Click the .NET tab and add the Microsoft.Visual Studio.QualityTools.WebTestFramework assembly &lt;/LI&gt;
&lt;LI&gt;Copy the code below and add it to your class file&amp;nbsp; &lt;/LI&gt;&lt;PRE class=csharpcode&gt;&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; System.ComponentModel;
&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; Microsoft.VisualStudio.TestTools.WebTesting;
&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; Microsoft.VisualStudio.TestTools.WebTesting.Rules;

&lt;SPAN class=kwrd&gt;namespace&lt;/SPAN&gt; SampleRecorderPlugin
{
    
    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; CovertRecordedCommentsToTransactions : WebTestRecorderPlugin
    {
        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;override&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; PostWebTestRecording(&lt;SPAN class=kwrd&gt;object&lt;/SPAN&gt; sender, PostWebTestRecordingEventArgs e)
        {
            &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; (&lt;SPAN class=kwrd&gt;int&lt;/SPAN&gt; i = 0; i &amp;lt; e.RecordedWebTest.Items.Count; i++)
            {
                &lt;SPAN class=rem&gt;//get the item and see if it is a comment&lt;/SPAN&gt;
                WebTestItem item = e.RecordedWebTest.Items[i];
                Comment c = item &lt;SPAN class=kwrd&gt;as&lt;/SPAN&gt; Comment;
                &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (c!=&lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;)
                {
                    &lt;SPAN class=rem&gt;//if it is a comment create a transaction&lt;/SPAN&gt;
                    TransactionTimer tt = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; TransactionTimer();

                    &lt;SPAN class=rem&gt;//set name of transaction to the comment text&lt;/SPAN&gt;
                    tt.Name = c.CommentText;
                    
                    &lt;SPAN class=rem&gt;//now add all items up until next comment&lt;/SPAN&gt;
                    &lt;SPAN class=kwrd&gt;int&lt;/SPAN&gt; j = i+1;
                    &lt;SPAN class=kwrd&gt;while&lt;/SPAN&gt; (j &amp;lt; e.RecordedWebTest.Items.Count)
                    {
                        WebTestItem nextItem = e.RecordedWebTest.Items[j];                        

                        &lt;SPAN class=rem&gt;//if the item is not a comment move it into the transaction&lt;/SPAN&gt;
                        &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (!(nextItem &lt;SPAN class=kwrd&gt;is&lt;/SPAN&gt; Comment))
                        {
                            tt.Items.Add(nextItem);
                            e.RecordedWebTest.Items.RemoveAt(j);
                        }
                        &lt;SPAN class=kwrd&gt;else&lt;/SPAN&gt;
                        {
                            &lt;SPAN class=kwrd&gt;break&lt;/SPAN&gt;;
                        }
                    }

                    &lt;SPAN class=rem&gt;//add the transaction to the web test&lt;/SPAN&gt;
                    e.RecordedWebTest.Items.Insert(j, tt);

                    &lt;SPAN class=rem&gt;//remove the comment from the web test&lt;/SPAN&gt;
                    e.RecordedWebTest.Items.RemoveAt(i);

                    &lt;SPAN class=rem&gt;//indicate that the web test has been modified&lt;/SPAN&gt;
                    e.RecordedWebTestModified = &lt;SPAN class=kwrd&gt;true&lt;/SPAN&gt;;
                    
                }
            }
            
        }
    }
}&lt;/PRE&gt;&lt;PRE class=csharpcode&gt;&lt;/PRE&gt;
&lt;STYLE type=text/css&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/STYLE&gt;

&lt;LI&gt;Compile the project&lt;/LI&gt;
&lt;LI&gt;Copy the dll to \Program Files\Microsoft Visual Studio 10.0\Common \IDE\PrivateAssemblies\WebTestPlugins&lt;/LI&gt;
&lt;LI&gt;Restart VS and go to your test project.&lt;/LI&gt;
&lt;LI&gt;
&lt;P&gt;Add a new Web Performance Test. You will see the following dialog:&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;A href="http://blogs.msdn.com/photos/slumley/picture9953698.aspx" target=_blank mce_href="http://blogs.msdn.com/photos/slumley/picture9953698.aspx"&gt;&lt;IMG src="http://blogs.msdn.com/photos/slumley/images/9953698/original.aspx" border=0 mce_src="http://blogs.msdn.com/photos/slumley/images/9953698/original.aspx"&gt;&lt;/A&gt;&lt;/P&gt;&lt;/LI&gt;
&lt;LI&gt;Select the CovertRecordedCommentsToTransactions&amp;nbsp; plug-in. &lt;/LI&gt;
&lt;LI&gt;
&lt;P&gt;In your web test add some comments while you are recording.&amp;nbsp; Here is what test looks like in the recorder.&amp;nbsp; You can see the Browse, Add To Cart, and Checkout comments&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;A href="http://blogs.msdn.com/photos/slumley/picture9953696.aspx" target=_blank mce_href="http://blogs.msdn.com/photos/slumley/picture9953696.aspx"&gt;&lt;IMG src="http://blogs.msdn.com/photos/slumley/images/9953696/original.aspx" border=0 mce_src="http://blogs.msdn.com/photos/slumley/images/9953696/original.aspx"&gt;&lt;/A&gt;&lt;/P&gt;&lt;/LI&gt;
&lt;LI&gt;Then hit stop on the recorder&lt;/LI&gt;
&lt;LI&gt;
&lt;P&gt;You can see that back in the Web Test Editor these comments have been converted to transactions and the requests have been moved under the transactions.&amp;nbsp; I have the plug-in removing the comment once it creates the transaction but you can easily change that. 
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;A href="http://blogs.msdn.com/photos/slumley/picture9953697.aspx" target=_blank mce_href="http://blogs.msdn.com/photos/slumley/picture9953697.aspx"&gt;&lt;IMG src="http://blogs.msdn.com/photos/slumley/images/9953697/original.aspx" border=0 mce_src="http://blogs.msdn.com/photos/slumley/images/9953697/original.aspx"&gt;&lt;/A&gt;&lt;/P&gt;&lt;/LI&gt;&lt;/OL&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Let walk through the code.&amp;nbsp; First I am looping through the web test looking for comments:&amp;nbsp; &lt;/P&gt;&lt;PRE class=csharpcode&gt;&lt;SPAN class=kwrd&gt;            for&lt;/SPAN&gt; (&lt;SPAN class=kwrd&gt;int&lt;/SPAN&gt; i = 0; i &amp;lt; e.RecordedWebTest.Items.Count; i++)
            {
                &lt;SPAN class=rem&gt;//get the item and see if it is a comment&lt;/SPAN&gt;
                WebTestItem item = e.RecordedWebTest.Items[i];
                Comment c = item &lt;SPAN class=kwrd&gt;as&lt;/SPAN&gt; Comment;
                &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (c!=&lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;)
                {
&lt;/PRE&gt;
&lt;P&gt;Once I find a comment I am creating a transaction. &lt;/P&gt;&lt;PRE class=csharpcode&gt;&lt;SPAN class=rem&gt;                    //if it is a comment create a transaction&lt;/SPAN&gt;
                    TransactionTimer tt = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; TransactionTimer();

                    &lt;SPAN class=rem&gt;//set name of transaction to the comment text&lt;/SPAN&gt;
                    tt.Name = c.CommentText;&lt;BR&gt;&lt;/PRE&gt;
&lt;P&gt;Next it will start adding requests into the transaction. It will add all requests up until the next comment or the end of the test.&amp;nbsp; Once it adds it to the transaction it removes it from the outer test.&amp;nbsp; &lt;/P&gt;&lt;PRE class=csharpcode&gt;&lt;SPAN class=rem&gt;                    //now add all items up until next comment&lt;/SPAN&gt;
                    &lt;SPAN class=kwrd&gt;int&lt;/SPAN&gt; j = i+1;
                    &lt;SPAN class=kwrd&gt;while&lt;/SPAN&gt; (j &amp;lt; e.RecordedWebTest.Items.Count)
                    {
                        WebTestItem nextItem = e.RecordedWebTest.Items[j];                        

                        &lt;SPAN class=rem&gt;//if the item is not a comment move it into the transaction&lt;/SPAN&gt;
                        &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (!(nextItem &lt;SPAN class=kwrd&gt;is&lt;/SPAN&gt; Comment))
                        {
                            tt.Items.Add(nextItem);
                            e.RecordedWebTest.Items.RemoveAt(j);
                        }
                        &lt;SPAN class=kwrd&gt;else&lt;/SPAN&gt;
                        {
                            &lt;SPAN class=kwrd&gt;break&lt;/SPAN&gt;;
                        }
                    }&lt;/PRE&gt;
&lt;P&gt;Finally add the transaction to the web test and remove the comment.&amp;nbsp; Then set the event args RecordedWebTestModified to true.&amp;nbsp; &lt;/P&gt;&lt;PRE class=csharpcode&gt;&lt;SPAN class=rem&gt;                    //add the transaction to the web test&lt;/SPAN&gt;
                    e.RecordedWebTest.Items.Insert(j, tt);

                    &lt;SPAN class=rem&gt;//remove the comment from the web test&lt;/SPAN&gt;
                    e.RecordedWebTest.Items.RemoveAt(i);

                    &lt;SPAN class=rem&gt;//indicate that the web test has been modified&lt;/SPAN&gt;
                    e.RecordedWebTestModified = &lt;SPAN class=kwrd&gt;true&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE class=csharpcode&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=csharpcode&gt;I hope this shows another use of the recorder plug-ins.  Let me know if you have any questions on this feature.&lt;/PRE&gt;
&lt;STYLE type=text/css&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/STYLE&gt;

&lt;STYLE type=text/css&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/STYLE&gt;

&lt;STYLE type=text/css&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/STYLE&gt;

&lt;STYLE type=text/css&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/STYLE&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9953692" width="1" height="1"&gt;</content><author><name>slumley</name><uri>http://blogs.msdn.com/slumley/ProfileUrlRedirect.ashx</uri></author><category term="VSTS" scheme="http://blogs.msdn.com/b/slumley/archive/tags/VSTS/" /><category term="Web Test" scheme="http://blogs.msdn.com/b/slumley/archive/tags/Web+Test/" /><category term="Load Test" scheme="http://blogs.msdn.com/b/slumley/archive/tags/Load+Test/" /><category term="VSTS2010" scheme="http://blogs.msdn.com/b/slumley/archive/tags/VSTS2010/" /><category term="Visual Studio 2010" scheme="http://blogs.msdn.com/b/slumley/archive/tags/Visual+Studio+2010/" /><category term="VSTS Testing" scheme="http://blogs.msdn.com/b/slumley/archive/tags/VSTS+Testing/" /></entry><entry><title>VSTS 2010 Feature: Another Sample Web Test Recorder Plug-in</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/slumley/archive/2010/01/26/vsts-2010-feature-another-sample-web-test-recorder-plug-in.aspx" /><id>http://blogs.msdn.com/b/slumley/archive/2010/01/26/vsts-2010-feature-another-sample-web-test-recorder-plug-in.aspx</id><published>2010-01-26T18:43:00Z</published><updated>2010-01-26T18:43:00Z</updated><content type="html">&lt;P&gt;In a previous post I wrote about a new feature that was added for VS 2010 called extensible recorder plug-ins.&amp;nbsp; Here is that post: &lt;A href="http://blogs.msdn.com/slumley/archive/2009/06/04/vsts-2010-feature-extensible-recorder-plugins-for-modifying-recorded-web-tests-including-adding-custom-dynamic-parameter-correlation.aspx" target=_blank mce_href="http://blogs.msdn.com/slumley/archive/2009/06/04/vsts-2010-feature-extensible-recorder-plugins-for-modifying-recorded-web-tests-including-adding-custom-dynamic-parameter-correlation.aspx"&gt;Recorder Plug-ins&lt;/A&gt; Basically recorder plug-ins give you the opportunity to modify a recorded web test prior to the test being saved back to the web test editor.&amp;nbsp; So if you always have to manually do a set of steps prior to being able to run a web test, you could create a recorder plug-in which will do those steps for you.&amp;nbsp; In my previous post I showed you how to create a plug-in which will correlate dynamic parameters.&amp;nbsp; I added a extraction rule to one of the requests in the recorded test and then bound the extracted value to a query string parameter further down the web test.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;In this post I am going to give you another example of what you can do with recorder plug-ins.&amp;nbsp; In this post we are going to add validation rules to the web test.&amp;nbsp; We will add a validation rule that will validate the value of the Title tag matches the value at record time.&amp;nbsp; Follow these steps.&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Create a new class library project &lt;/LI&gt;
&lt;LI&gt;Right Click references node and select “Add reference…” &lt;/LI&gt;
&lt;LI&gt;Click the .NET tab and add the Microsoft.Visual Studio.QualityTools.WebTestFramework assembly &lt;/LI&gt;
&lt;LI&gt;Copy the code below and add it to your class file&amp;nbsp; &lt;PRE class=csharpcode&gt;&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; System.ComponentModel;
&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; Microsoft.VisualStudio.TestTools.WebTesting;
&lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; Microsoft.VisualStudio.TestTools.WebTesting.Rules;

&lt;SPAN class=kwrd&gt;namespace&lt;/SPAN&gt; SampleRecorderPlugin
{
    [DisplayName(&lt;SPAN class=str&gt;"WebTestRecorderPlugin that adds title validation rule"&lt;/SPAN&gt;)]
    [Description(&lt;SPAN class=str&gt;"Adds a validation rule that verifies the recorded title tag matches playback title tag value"&lt;/SPAN&gt;)]
    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; RecorderPluginThatAddsTitleValidation : WebTestRecorderPlugin
    {
        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;override&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; PostWebTestRecording(&lt;SPAN class=kwrd&gt;object&lt;/SPAN&gt; sender, PostWebTestRecordingEventArgs e)
        {
            WebTestResultIteration recordedIteration = e.RecordedWebTestResult;
            &lt;SPAN class=kwrd&gt;foreach&lt;/SPAN&gt; (WebTestResultUnit resultUnit &lt;SPAN class=kwrd&gt;in&lt;/SPAN&gt; recordedIteration.Children)
            {
                WebTestResultPage pageResult = resultUnit &lt;SPAN class=kwrd&gt;as&lt;/SPAN&gt; WebTestResultPage;
                &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (pageResult != &lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;)
                {
                    WebTestRequestResult finalRequestResult = pageResult.RequestResult;

                    &lt;SPAN class=rem&gt;//if there were redirects then need to get the last redirected requests&lt;/SPAN&gt;
                    &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (pageResult.RedirectedPages.Count &amp;gt; 0)
                    {
                        finalRequestResult = &lt;BR&gt;                          pageResult.RedirectedPages[pageResult.RedirectedPages.Count - 1].RequestResult;
                    }

                    &lt;SPAN class=rem&gt;//now get the response for the final request&lt;/SPAN&gt;
                    WebTestResponse response = finalRequestResult.Response;
                    &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (response.IsHtml)
                    {
                        HtmlTagInnerTextParser innerTextParser = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; HtmlTagInnerTextParser(response.BodyString);
                        HtmlTagInnerText titleInnerTextTag = &lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;;

                        &lt;SPAN class=rem&gt;//search for the &amp;lt;Title&amp;gt; tag&lt;/SPAN&gt;
                        &lt;SPAN class=kwrd&gt;foreach&lt;/SPAN&gt; (HtmlTagInnerText innerTextTag &lt;SPAN class=kwrd&gt;in&lt;/SPAN&gt; 
                                 innerTextParser.GetInnerTextForHtmlTags(&lt;SPAN class=str&gt;"title"&lt;/SPAN&gt;, &lt;SPAN class=kwrd&gt;true&lt;/SPAN&gt;, &lt;SPAN class=kwrd&gt;false&lt;/SPAN&gt;, &lt;SPAN class=kwrd&gt;false&lt;/SPAN&gt;))
                        {
                            &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (!&lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt;.IsNullOrEmpty(innerTextTag.Value))
                            {
                                titleInnerTextTag = innerTextTag;
                                &lt;SPAN class=kwrd&gt;break&lt;/SPAN&gt;;
                            }
                        }

                        &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (titleInnerTextTag == &lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;)
                        {
                            &lt;SPAN class=kwrd&gt;continue&lt;/SPAN&gt;;
                        }
                        
                        &lt;SPAN class=rem&gt;//if we found a title tag then add a validation rule&lt;/SPAN&gt;
                        ValidationRuleReference validateTitleRuleReference = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; ValidationRuleReference();
                        validateTitleRuleReference.Type = &lt;SPAN class=kwrd&gt;typeof&lt;/SPAN&gt;(ValidateHtmlTagInnerText);
                        validateTitleRuleReference.ValidationLevel = ValidationLevel.Medium;
                        validateTitleRuleReference.Properties.Add(&lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; PluginOrRuleProperty(&lt;SPAN class=str&gt;"TagName"&lt;/SPAN&gt;, &lt;SPAN class=str&gt;"title"&lt;/SPAN&gt;));
                        validateTitleRuleReference.Properties.Add(&lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; PluginOrRuleProperty(&lt;SPAN class=str&gt;"ExpectedInnerText"&lt;/SPAN&gt;, 
                                                                                           titleInnerTextTag.Value));
                        validateTitleRuleReference.Properties.Add(&lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; PluginOrRuleProperty(&lt;SPAN class=str&gt;"Index"&lt;/SPAN&gt;, &lt;SPAN class=str&gt;"0"&lt;/SPAN&gt;));
                        validateTitleRuleReference.Properties.Add(&lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; PluginOrRuleProperty(&lt;SPAN class=str&gt;"RemoveInnerTags"&lt;/SPAN&gt;, &lt;SPAN class=str&gt;"False"&lt;/SPAN&gt;));
                        validateTitleRuleReference.Properties.Add(&lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; PluginOrRuleProperty(&lt;SPAN class=str&gt;"HasClosingTags"&lt;/SPAN&gt;, &lt;SPAN class=str&gt;"True"&lt;/SPAN&gt;));
                        validateTitleRuleReference.Properties.Add(&lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; PluginOrRuleProperty(&lt;SPAN class=str&gt;"IgnoreCase"&lt;/SPAN&gt;, &lt;SPAN class=str&gt;"True"&lt;/SPAN&gt;));
                        validateTitleRuleReference.Properties.Add(&lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; PluginOrRuleProperty(&lt;SPAN class=str&gt;"CollapseWhiteSpace"&lt;/SPAN&gt;, &lt;BR&gt;                                                                                           &lt;SPAN class=str&gt;"False"&lt;/SPAN&gt;));

                        &lt;SPAN class=rem&gt;// Get the corresponding request in the Declarative Web test&lt;/SPAN&gt;
                        WebTestRequest requestInWebTest = 
                                e.RecordedWebTest.GetItem(pageResult.DeclarativeWebTestItemId) &lt;SPAN class=kwrd&gt;as&lt;/SPAN&gt; WebTestRequest;
                        &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (requestInWebTest != &lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;)
                        {
                            requestInWebTest.ValidationRuleReferences.Add(validateTitleRuleReference);
                            e.RecordedWebTestModified = &lt;SPAN class=kwrd&gt;true&lt;/SPAN&gt;;
                        }
                    }
                }
            }
        }
    }
}&lt;/PRE&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;P&gt;Copy the dll to \Program Files\Microsoft Visual Studio 10.0\Common7\IDE\PrivateAssemblies\WebTestPlugins&lt;/P&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;P&gt;Restart VS and go to your test project.&lt;/P&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;P&gt;Add a new Web Performance Test. You will see the following dialog:&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;A href="http://blogs.msdn.com/photos/slumley/picture9953638.aspx" target=_blank mce_href="http://blogs.msdn.com/photos/slumley/picture9953638.aspx"&gt;&lt;IMG src="http://blogs.msdn.com/photos/slumley/images/9953638/original.aspx" border=0 mce_src="http://blogs.msdn.com/photos/slumley/images/9953638/original.aspx"&gt;&lt;/A&gt;&lt;/P&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;P&gt;Select the plug-in we just created and record your web test&lt;/P&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;P&gt;When test completes, expand the requests nodes and look for the validation rules. You should see the following:&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;A href="http://blogs.msdn.com/photos/slumley/picture9953639.aspx" target=_blank mce_href="http://blogs.msdn.com/photos/slumley/picture9953639.aspx"&gt;&lt;IMG src="http://blogs.msdn.com/photos/slumley/images/9953639/original.aspx" border=0 mce_src="http://blogs.msdn.com/photos/slumley/images/9953639/original.aspx"&gt;&lt;/A&gt;&lt;/P&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;P&gt;I had a validation rule added for each of my requests.&lt;/P&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;PRE class=csharpcode&gt;&amp;nbsp;&lt;/PRE&gt;
&lt;P&gt;Let’s walk through parts of the code. Here is the first part of the method. In this code fragment we are looping through all the recorded items and looking for pages. You can also add comments during playback which is why the code is checking for page results.&lt;/P&gt;&lt;PRE class=csharpcode&gt;            WebTestResultIteration recordedIteration = e.RecordedWebTestResult;
            &lt;SPAN class=kwrd&gt;foreach&lt;/SPAN&gt; (WebTestResultUnit resultUnit &lt;SPAN class=kwrd&gt;in&lt;/SPAN&gt; recordedIteration.Children)
            {
                WebTestResultPage pageResult = resultUnit &lt;SPAN class=kwrd&gt;as&lt;/SPAN&gt; WebTestResultPage;
                &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (pageResult != &lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;)
                {&lt;/PRE&gt;&lt;PRE class=csharpcode&gt;&amp;nbsp;&lt;/PRE&gt;
&lt;P&gt;Once we have the page result, we are checking to see if the page was part of a redirect.&amp;nbsp; If so, we are grabbing the last request in the redirect chain:&amp;nbsp; &lt;/P&gt;&lt;PRE class=csharpcode&gt;                    WebTestRequestResult finalRequestResult = pageResult.RequestResult;

                    &lt;SPAN class=rem&gt;//if there were redirects then need to get the last redirected requests&lt;/SPAN&gt;
                    &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (pageResult.RedirectedPages.Count &amp;gt; 0)
                    {
                        finalRequestResult = pageResult.RedirectedPages[pageResult.RedirectedPages.Count - 1].RequestResult;
                    }&lt;/PRE&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;STYLE type=text/css&gt;



.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/STYLE&gt;

&lt;P&gt;Next we are going to grab the response and run it through the tag parser.&amp;nbsp; Once we have the tag collection it is going to iterate over that collection looking for the Title tag:&amp;nbsp; &lt;/P&gt;&lt;PRE class=csharpcode&gt;                   &lt;SPAN class=rem&gt;//now get the response for the final request&lt;/SPAN&gt;
                    WebTestResponse response = finalRequestResult.Response;
                    &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (response.IsHtml)
                    {
                        HtmlTagInnerTextParser innerTextParser = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; HtmlTagInnerTextParser(response.BodyString);
                        HtmlTagInnerText titleInnerTextTag = &lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;;

                        &lt;SPAN class=rem&gt;//search for the &amp;lt;Title&amp;gt; tag&lt;/SPAN&gt;
                        &lt;SPAN class=kwrd&gt;foreach&lt;/SPAN&gt; (HtmlTagInnerText innerTextTag &lt;SPAN class=kwrd&gt;in&lt;/SPAN&gt; 
                                 innerTextParser.GetInnerTextForHtmlTags(&lt;SPAN class=str&gt;"title"&lt;/SPAN&gt;, &lt;SPAN class=kwrd&gt;true&lt;/SPAN&gt;, &lt;SPAN class=kwrd&gt;false&lt;/SPAN&gt;, &lt;SPAN class=kwrd&gt;false&lt;/SPAN&gt;))
                        {
                            &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (!&lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt;.IsNullOrEmpty(innerTextTag.Value))
                            {
                                titleInnerTextTag = innerTextTag;
                                &lt;SPAN class=kwrd&gt;break&lt;/SPAN&gt;;
                            }
                        }&lt;/PRE&gt;
&lt;STYLE type=text/css&gt;



.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/STYLE&gt;

&lt;P&gt;If we find a title tag it will break out of the loop and add a validation rule.&amp;nbsp; First we create the reference:&amp;nbsp; &lt;/P&gt;&lt;PRE class=csharpcode&gt;&lt;SPAN class=rem&gt;                        //if we found a title tag then add a validation rule&lt;/SPAN&gt;
                        ValidationRuleReference validateTitleRuleReference = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; ValidationRuleReference();
                        validateTitleRuleReference.Type = &lt;SPAN class=kwrd&gt;typeof&lt;/SPAN&gt;(ValidateHtmlTagInnerText);
                        validateTitleRuleReference.ValidationLevel = ValidationLevel.Medium;
                        validateTitleRuleReference.Properties.Add(&lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; PluginOrRuleProperty(&lt;SPAN class=str&gt;"TagName"&lt;/SPAN&gt;, &lt;SPAN class=str&gt;"title"&lt;/SPAN&gt;));
                        validateTitleRuleReference.Properties.Add(&lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; PluginOrRuleProperty(&lt;SPAN class=str&gt;"ExpectedInnerText"&lt;/SPAN&gt;, 
                                                                                           titleInnerTextTag.Value));
                        validateTitleRuleReference.Properties.Add(&lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; PluginOrRuleProperty(&lt;SPAN class=str&gt;"Index"&lt;/SPAN&gt;, &lt;SPAN class=str&gt;"0"&lt;/SPAN&gt;));
                        validateTitleRuleReference.Properties.Add(&lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; PluginOrRuleProperty(&lt;SPAN class=str&gt;"RemoveInnerTags"&lt;/SPAN&gt;, &lt;SPAN class=str&gt;"False"&lt;/SPAN&gt;));
                        validateTitleRuleReference.Properties.Add(&lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; PluginOrRuleProperty(&lt;SPAN class=str&gt;"HasClosingTags"&lt;/SPAN&gt;, &lt;SPAN class=str&gt;"True"&lt;/SPAN&gt;));
                        validateTitleRuleReference.Properties.Add(&lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; PluginOrRuleProperty(&lt;SPAN class=str&gt;"IgnoreCase"&lt;/SPAN&gt;, &lt;SPAN class=str&gt;"True"&lt;/SPAN&gt;));
                        validateTitleRuleReference.Properties.Add(&lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; PluginOrRuleProperty(&lt;SPAN class=str&gt;"CollapseWhiteSpace"&lt;/SPAN&gt;, &lt;SPAN class=str&gt;"False"&lt;/SPAN&gt;));&lt;/PRE&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;STYLE type=text/css&gt;



.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/STYLE&gt;

&lt;P&gt;Then we find the request in the web test that corresponds to this result page and add the reference to the validation rule collection:&amp;nbsp; &lt;/P&gt;&lt;PRE class=csharpcode&gt;                       &lt;SPAN class=rem&gt;// Get the corresponding request in the Declarative Web test&lt;/SPAN&gt;
                        WebTestRequest requestInWebTest = 
                                e.RecordedWebTest.GetItem(pageResult.DeclarativeWebTestItemId) &lt;SPAN class=kwrd&gt;as&lt;/SPAN&gt; WebTestRequest;
                        &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (requestInWebTest != &lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;)
                        {
                            requestInWebTest.ValidationRuleReferences.Add(validateTitleRuleReference);
                            e.RecordedWebTestModified = &lt;SPAN class=kwrd&gt;true&lt;/SPAN&gt;;
                        }&lt;/PRE&gt;
&lt;STYLE type=text/css&gt;



.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/STYLE&gt;

&lt;P&gt;Hopefully this shows you another use for recorder plug-ins. Try it out and let us know what you think.&lt;/P&gt;
&lt;OL&gt;
&lt;STYLE type=text/css&gt;



.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/STYLE&gt;
&lt;/OL&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9953637" width="1" height="1"&gt;</content><author><name>slumley</name><uri>http://blogs.msdn.com/slumley/ProfileUrlRedirect.ashx</uri></author><category term="VSTS" scheme="http://blogs.msdn.com/b/slumley/archive/tags/VSTS/" /><category term="Web Test" scheme="http://blogs.msdn.com/b/slumley/archive/tags/Web+Test/" /><category term="Load Test" scheme="http://blogs.msdn.com/b/slumley/archive/tags/Load+Test/" /><category term="VSTS2010" scheme="http://blogs.msdn.com/b/slumley/archive/tags/VSTS2010/" /><category term="Visual Studio 2010" scheme="http://blogs.msdn.com/b/slumley/archive/tags/Visual+Studio+2010/" /><category term="VSTS Testing" scheme="http://blogs.msdn.com/b/slumley/archive/tags/VSTS+Testing/" /></entry><entry><title>VSTS 2010 Feature: ASP.NET profiler integration with Load Tests</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/slumley/archive/2010/01/12/vsts-2010-feature-asp-net-profiler-integration-with-load-tests.aspx" /><id>http://blogs.msdn.com/b/slumley/archive/2010/01/12/vsts-2010-feature-asp-net-profiler-integration-with-load-tests.aspx</id><published>2010-01-12T18:55:00Z</published><updated>2010-01-12T18:55:00Z</updated><content type="html">&lt;P&gt;One of the new features in VSTS 2010 is Data Collectors.&amp;nbsp; Data collectors can run as part of your test run and then associate the data collected with the test.&amp;nbsp; This is also an extensibility point.&amp;nbsp; You can create your own data collectors and store any kind of data with your test runs.&amp;nbsp; The following are available out of the box:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;ASP.NET Client Proxy for IntelliTrace and Test Impact&lt;/LI&gt;
&lt;LI&gt;ASP.NET Profiler&lt;/LI&gt;
&lt;LI&gt;Code Coverage&lt;/LI&gt;
&lt;LI&gt;Event Log&lt;/LI&gt;
&lt;LI&gt;IntelliTrace&lt;/LI&gt;
&lt;LI&gt;Network Emulation&lt;/LI&gt;
&lt;LI&gt;System Information&lt;/LI&gt;
&lt;LI&gt;Test Impact&lt;/LI&gt;
&lt;LI&gt;Video Recorder&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;This link can give you more high level information about data collectors: &lt;A href="http://msdn.microsoft.com/en-us/library/dd286743(VS.100).aspx" target=_blank mce_href="http://msdn.microsoft.com/en-us/library/dd286743(VS.100).aspx"&gt;Data Collectors&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;I am going to focus on the ASP.NET Profiler collector and show you how this can integrate with load tests.&amp;nbsp; First off this collector profiles the IIS process, so it will not work against the development web server.&amp;nbsp; For this demo I setup the IbuySpy website.&amp;nbsp; To profile the web site, you need to install an agent on the machine that the IIS is running on.&amp;nbsp; This agent will not be generating load, but will be a collection only agent.&amp;nbsp; The link above goes into detail about how to create and configure these types of agents.&amp;nbsp; So let’s walk through process of running a load test with the ASP.NET profiler collector running.&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Create a new test project&lt;/LI&gt;
&lt;LI&gt;Create a Web Performance Test that will test the web site you want to profile.&amp;nbsp; I recorded a test that adds an item to the shopping cart, logs into the site and then places the order.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;A href="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/VSTS.NETprofilerintegrationwithLoadTests_BD1B/image_4.png" mce_href="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/VSTS.NETprofilerintegrationwithLoadTests_BD1B/image_4.png"&gt;&lt;IMG title=image style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; DISPLAY: inline; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=296 alt=image src="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/VSTS.NETprofilerintegrationwithLoadTests_BD1B/image_thumb_1.png" width=420 border=0 mce_src="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/VSTS.NETprofilerintegrationwithLoadTests_BD1B/image_thumb_1.png"&gt;&lt;/A&gt; &lt;/LI&gt;
&lt;LI&gt;Now Create a Load Test and add the web test.&lt;/LI&gt;
&lt;LI&gt;Before we run the test, we need to modify the run settings and tell it to run the ASP.NET data collector.&amp;nbsp; So go to the top level test menu, select Edit Test Settings and then select the active test setting.&lt;/LI&gt;
&lt;LI&gt;I am running my test locally and have IIS running locally, so I do not need to configure roles.&amp;nbsp; But if you are running IIS on a different machine, follow the link above to create appropriate role.&amp;nbsp; Then Click on the “Data and Diagnostics” tab.&amp;nbsp; &lt;A href="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/VSTS.NETprofilerintegrationwithLoadTests_BD1B/image_6.png" mce_href="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/VSTS.NETprofilerintegrationwithLoadTests_BD1B/image_6.png"&gt;&lt;IMG title=image style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; DISPLAY: inline; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=469 alt=image src="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/VSTS.NETprofilerintegrationwithLoadTests_BD1B/image_thumb_2.png" width=605 border=0 mce_src="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/VSTS.NETprofilerintegrationwithLoadTests_BD1B/image_thumb_2.png"&gt;&lt;/A&gt; &lt;/LI&gt;
&lt;LI&gt;Choose the correct role for your IIS machine and then click the enabled check box for the ASP.NET profiler.&lt;/LI&gt;
&lt;LI&gt;Now the test is ready to run.&amp;nbsp; Just start your load test like you normally do.&amp;nbsp; Click the play button on the Load Test Editor toolbar.&amp;nbsp; while the test is running, you will not see any differences.&amp;nbsp; When the test completes, go to the post run view.&lt;/LI&gt;
&lt;LI&gt;In the post run view, you will see a new button on the load test execution UI toolbar.&lt;A href="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/VSTS.NETprofilerintegrationwithLoadTests_BD1B/image_10.png" mce_href="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/VSTS.NETprofilerintegrationwithLoadTests_BD1B/image_10.png"&gt;&lt;IMG title=image style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; DISPLAY: inline; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=370 alt=image src="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/VSTS.NETprofilerintegrationwithLoadTests_BD1B/image_thumb_4.png" width=585 border=0 mce_src="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/VSTS.NETprofilerintegrationwithLoadTests_BD1B/image_thumb_4.png"&gt;&lt;/A&gt; &lt;/LI&gt;
&lt;LI&gt;Click the Profiler Report button which is the second from the right.&amp;nbsp; This will generate a profiler report.&amp;nbsp; Here is the initial page:&lt;A href="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/VSTS.NETprofilerintegrationwithLoadTests_BD1B/image_12.png" mce_href="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/VSTS.NETprofilerintegrationwithLoadTests_BD1B/image_12.png"&gt;&lt;IMG title=image style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; DISPLAY: inline; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=408 alt=image src="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/VSTS.NETprofilerintegrationwithLoadTests_BD1B/image_thumb_5.png" width=595 border=0 mce_src="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/VSTS.NETprofilerintegrationwithLoadTests_BD1B/image_thumb_5.png"&gt;&lt;/A&gt; &lt;/LI&gt;
&lt;LI&gt;Check out this help link to get more information on all the data that is available in the profiler report:&amp;nbsp; &lt;A href="http://msdn.microsoft.com/en-us/library/z9z62c29(VS.100).aspx" target=_blank mce_href="http://msdn.microsoft.com/en-us/library/z9z62c29(VS.100).aspx"&gt;Profiler Report Information&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;I do want to point out one new feature of the profiler that I particularly like and that is the database interaction page.&amp;nbsp; Change the current view from Summary to “Tier Interactions”.&amp;nbsp; Then expand the node for one of your pages.&amp;nbsp; I am expanding the login page.&amp;nbsp; When I expand it I see the following:&lt;A href="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/VSTS.NETprofilerintegrationwithLoadTests_BD1B/image_14.png" mce_href="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/VSTS.NETprofilerintegrationwithLoadTests_BD1B/image_14.png"&gt;&lt;IMG title=image style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; DISPLAY: inline; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=387 alt=image src="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/VSTS.NETprofilerintegrationwithLoadTests_BD1B/image_thumb_6.png" width=726 border=0 mce_src="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/VSTS.NETprofilerintegrationwithLoadTests_BD1B/image_thumb_6.png"&gt;&lt;/A&gt; &lt;/LI&gt;
&lt;LI&gt;This is showing me my database connections and when I click on a connection, it is showing me the calls that were made.&amp;nbsp; In the command text column, you see the stored procedures that were called on the login page.&amp;nbsp; Then you see # of times each was called and elapsed time.&amp;nbsp; This is an awesome view into the interactions between your application and the sql calls being made.&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;In future posts I will show you how to create your own data collectors.&amp;nbsp; For now please try out this data collector and others and let us know what you think.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9947253" width="1" height="1"&gt;</content><author><name>slumley</name><uri>http://blogs.msdn.com/slumley/ProfileUrlRedirect.ashx</uri></author><category term="VSTS" scheme="http://blogs.msdn.com/b/slumley/archive/tags/VSTS/" /><category term="Web Test" scheme="http://blogs.msdn.com/b/slumley/archive/tags/Web+Test/" /><category term="Load Test" scheme="http://blogs.msdn.com/b/slumley/archive/tags/Load+Test/" /><category term="VSTS2010" scheme="http://blogs.msdn.com/b/slumley/archive/tags/VSTS2010/" /><category term="Visual Studio 2010" scheme="http://blogs.msdn.com/b/slumley/archive/tags/Visual+Studio+2010/" /><category term="VSTS Testing" scheme="http://blogs.msdn.com/b/slumley/archive/tags/VSTS+Testing/" /></entry><entry><title>VSTS 2010 Feature: Branching and Looping in Declarative Web Tests</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/slumley/archive/2010/01/12/vsts-2010-feature-branching-and-looping-in-declarative-web-tests.aspx" /><id>http://blogs.msdn.com/b/slumley/archive/2010/01/12/vsts-2010-feature-branching-and-looping-in-declarative-web-tests.aspx</id><published>2010-01-12T13:58:00Z</published><updated>2010-01-12T13:58:00Z</updated><content type="html">&lt;P&gt;We continue to add features to the declarative web test model that will try to allow you to stay in the web test editor and only go to code for custom rules, plugins, etc.&amp;nbsp; Prior to VSTS 2010, if you wanted to do any real branching or looping in web tests, you would have to go to code.&amp;nbsp; In VSTS 2010 we have added branching and looping into the declarative web test model.&amp;nbsp; Check out this great blog post by Chris Patterson for a complete description of the feature: &lt;A title=http://blogs.msdn.com/chrispat/archive/2010/01/10/branching-and-looping-in-a-declarative-web-test.aspx href="http://blogs.msdn.com/chrispat/archive/2010/01/10/branching-and-looping-in-a-declarative-web-test.aspx"&gt;&lt;FONT color=#0066dd&gt;http://blogs.msdn.com/chrispat/archive/2010/01/10/branching-and-looping-in-a-declarative-web-test.aspx&lt;/FONT&gt;&lt;/A&gt;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9947089" width="1" height="1"&gt;</content><author><name>slumley</name><uri>http://blogs.msdn.com/slumley/ProfileUrlRedirect.ashx</uri></author><category term="VSTS" scheme="http://blogs.msdn.com/b/slumley/archive/tags/VSTS/" /><category term="Web Test" scheme="http://blogs.msdn.com/b/slumley/archive/tags/Web+Test/" /><category term="Load Test" scheme="http://blogs.msdn.com/b/slumley/archive/tags/Load+Test/" /><category term="VSTS2010" scheme="http://blogs.msdn.com/b/slumley/archive/tags/VSTS2010/" /><category term="Visual Studio 2010" scheme="http://blogs.msdn.com/b/slumley/archive/tags/Visual+Studio+2010/" /><category term="VSTS Testing" scheme="http://blogs.msdn.com/b/slumley/archive/tags/VSTS+Testing/" /></entry><entry><title>VSTS 2010 Feature: Find/Replace in Web Test Editor</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/slumley/archive/2010/01/11/vsts-2010-feature-find-replace-in-web-test-editor.aspx" /><id>http://blogs.msdn.com/b/slumley/archive/2010/01/11/vsts-2010-feature-find-replace-in-web-test-editor.aspx</id><published>2010-01-11T13:57:00Z</published><updated>2010-01-11T13:57:00Z</updated><content type="html">&lt;P&gt;This blog post will describe the find/replace functionality added to the web test editor. This functionality was added in the Beta 2 release. A piece of feedback that we have heard a number of times is “It would be nice if I could create a context parameter and then easily replace all instances of a string in the web test with the parameter”. For example, suppose you want to parameterize part of the URL’s path. Each URL in your web test looks like &lt;A href="http://server1/site1/page123.aspx" mce_href="http://server1/site1/page123.aspx"&gt;http://server1/site1/page123.aspx&lt;/A&gt;. Now you want to parameterize this so that the server and path are broken out. You can use the Parameterize server feature to handle server1. But to parameterize site1, you would have to do the following&lt;/P&gt;
&lt;P&gt;1) Create a context parameter called Path with value site2.&lt;/P&gt;
&lt;P&gt;2) Then modify each request in the web test and replace each instance. So if you have 10 requests, you have to repeat this 10 times.&lt;/P&gt;
&lt;P&gt;3) Also you may need to modify parts of query string parameters that have site1 in them.&lt;/P&gt;
&lt;P&gt;This can be a time consuming and error prone process. Now in VS 2010, we have added typical find/replace behavior into the web test editor. In VS2010, you would do the following:&lt;/P&gt;
&lt;P&gt;1) Create a context parameter called Path with value site2&lt;/P&gt;
&lt;P&gt;2) Right click on root node in the web test and select “Find and Replace in Request…”.&amp;nbsp; This is the only way to launch the find/replace that will work with the web test editor.&amp;nbsp; If you hit ctrl-f, you will see the normal find dialog in VS, but this one will NOT work with web test editor.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/VSTS2010FeatureFindReplaceinWebTestEdito_7DE6/image_2.png" mce_href="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/VSTS2010FeatureFindReplaceinWebTestEdito_7DE6/image_2.png"&gt;&lt;IMG title=image style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; DISPLAY: inline; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=401 alt=image src="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/VSTS2010FeatureFindReplaceinWebTestEdito_7DE6/image_thumb.png" width=398 border=0 mce_src="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/VSTS2010FeatureFindReplaceinWebTestEdito_7DE6/image_thumb.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;3) Enter site1 in find text box and enter {{Path}} in replace text box. Click Replace All.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/VSTS2010FeatureFindReplaceinWebTestEdito_7DE6/image_4.png" mce_href="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/VSTS2010FeatureFindReplaceinWebTestEdito_7DE6/image_4.png"&gt;&lt;IMG title=image style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; DISPLAY: inline; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=308 alt=image src="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/VSTS2010FeatureFindReplaceinWebTestEdito_7DE6/image_thumb_1.png" width=565 border=0 mce_src="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/VSTS2010FeatureFindReplaceinWebTestEdito_7DE6/image_thumb_1.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Now your test should be all fixed up.&lt;/P&gt;
&lt;P&gt;In beta 2, this feature does not search string body nodes. We have fixed this post beta2. This will make it easier to parameterize parts of string bodies. With this change, you will not have to open each string body node, find part of body to replace and correctly type the new text. Again, this does not exist in Beta2 drop, but has been fixed post beta 2.&lt;/P&gt;
&lt;P&gt;This feature should make editing your web test easier. Please try it out and let us know what you think.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9946513" width="1" height="1"&gt;</content><author><name>slumley</name><uri>http://blogs.msdn.com/slumley/ProfileUrlRedirect.ashx</uri></author><category term="VSTS" scheme="http://blogs.msdn.com/b/slumley/archive/tags/VSTS/" /><category term="Web Test" scheme="http://blogs.msdn.com/b/slumley/archive/tags/Web+Test/" /><category term="VSTS2010" scheme="http://blogs.msdn.com/b/slumley/archive/tags/VSTS2010/" /><category term="Visual Studio 2010" scheme="http://blogs.msdn.com/b/slumley/archive/tags/Visual+Studio+2010/" /><category term="VSTS Testing" scheme="http://blogs.msdn.com/b/slumley/archive/tags/VSTS+Testing/" /></entry><entry><title>VSTS 2010 Feature: Data Source Enhancements</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/slumley/archive/2010/01/04/vsts-2010-feature-data-source-enhancements.aspx" /><id>http://blogs.msdn.com/b/slumley/archive/2010/01/04/vsts-2010-feature-data-source-enhancements.aspx</id><published>2010-01-04T14:55:00Z</published><updated>2010-01-04T14:55:00Z</updated><content type="html">&lt;P&gt;This blog post will describe the enhancements that have been made to the data source functionality in web tests.&amp;nbsp; We have heard the following feedback a number of times:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;I would like to be able to reload the data source while a load test is running&lt;/LI&gt;
&lt;LI&gt;I want to be able to use a column in my data source that is not bound to any parameter in my web test&lt;/LI&gt;
&lt;LI&gt;I want more control over how the data source is advanced.&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;We have provided enhancements to each of these areas.&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Reloading a data source – Prior to this change, all data for the data source was read once at the beginning of the test.&amp;nbsp; Now this will allow you to programmatically reload a data source while a test is running.&amp;nbsp; So if you have a set of web tests that are creating data that other tests need, you will now be able to pull that data in while the test is running.&amp;nbsp; The way to accomplish this is by using a WebTestPlugin.&amp;nbsp; The API call is the following:&amp;nbsp; void WebTest.ReloadDataTable(string dataSourceName, string dataTableName)&amp;nbsp;&amp;nbsp; Here is a very simple plug-in that would call this.&amp;nbsp; I have a csv data source called DataSource1 and the table to Products#csv.&amp;nbsp;&amp;nbsp; &lt;/LI&gt;
&lt;P&gt;using Microsoft.VisualStudio.TestTools.WebTesting; &lt;/P&gt;
&lt;P&gt;namespace TestProject4 &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class DatasourcePlugin : WebTestPlugin &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override void PreWebTest(object sender, PreWebTestEventArgs e) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.WebTest.ReloadDataTable("DataSource1", "Products#csv"); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;}&lt;/P&gt;
&lt;LI&gt;Using a column in data source not bound to a parameter – This is useful if you are binding some parameter to a column but then want to use another column in a plug-in or custom validation rule.&amp;nbsp; Prior to this change, you would have to bind all columns that you were going to use to some parameter in the web test.&amp;nbsp; Now you just do the following.&amp;nbsp; &lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Expand the data sources node in the web test&lt;/LI&gt;
&lt;LI&gt;Click on the table that you want all the data from&lt;/LI&gt;
&lt;LI&gt;Bring up the property browser&lt;/LI&gt;
&lt;LI&gt;Change the Select Columns property from “Only Select Bound Columns “ to ”Select All Columns”.&amp;nbsp;&amp;nbsp; This will then add all of the columns into the context and make them available for use in your custom plug-ins and rules.&lt;/LI&gt;&lt;/UL&gt;
&lt;LI&gt;Controlling how data source is advanced – In VSTS 2008 and VSTS 2005 we had 3 access methods for data sources: Sequential, Random and Unique.&amp;nbsp; Check out this blog post for a better description of these: &lt;A href="http://blogs.msdn.com/slumley/pages/description-of-access-methods-in-data-sources.aspx" target=_blank mce_href="http://blogs.msdn.com/slumley/pages/description-of-access-methods-in-data-sources.aspx"&gt;Access Methods&lt;/A&gt;&amp;nbsp; We have now added “Do Not Move Cursor Automatically”&amp;nbsp; Basically, you now have full control on when the cursor is advanced.&amp;nbsp; If you do nothing, the cursor stays on the first row.&amp;nbsp; To move the cursor, you will use the following API call: void WebTest.MoveDatatableCursor(string dataSourceName, string dataTableName).&amp;nbsp; We have also added another overload of this method which is void WebTest.MoveDatatableCursor(string dataSourceName, string dataTableName, int newRowIndex).&amp;nbsp; Here is a very simple plug-in which will move the cursor to row 3 in the data source.&amp;nbsp; &lt;/LI&gt;
&lt;P&gt;using Microsoft.VisualStudio.TestTools.WebTesting; &lt;/P&gt;
&lt;P&gt;namespace TestProject4 &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class DatasourcePlugin : WebTestPlugin &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override void PreWebTest(object sender, PreWebTestEventArgs e) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.WebTest.MoveDataTableCursor("DataSource1", "Products#csv", 3); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;Hopefully these enhancements will make it easier to work with data sources.&amp;nbsp; These are now available in beta 2.&amp;nbsp; Please try them out and let us know what you think.&lt;/P&gt;&lt;/OL&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9943387" width="1" height="1"&gt;</content><author><name>slumley</name><uri>http://blogs.msdn.com/slumley/ProfileUrlRedirect.ashx</uri></author><category term="VSTS" scheme="http://blogs.msdn.com/b/slumley/archive/tags/VSTS/" /><category term="Web Test" scheme="http://blogs.msdn.com/b/slumley/archive/tags/Web+Test/" /><category term="Load Test" scheme="http://blogs.msdn.com/b/slumley/archive/tags/Load+Test/" /><category term="VSTS2010" scheme="http://blogs.msdn.com/b/slumley/archive/tags/VSTS2010/" /><category term="Visual Studio 2010" scheme="http://blogs.msdn.com/b/slumley/archive/tags/Visual+Studio+2010/" /><category term="VSTS Testing" scheme="http://blogs.msdn.com/b/slumley/archive/tags/VSTS+Testing/" /></entry><entry><title>Debugging Custom Validation/Extraction rules, Web Test and Load Test Plug-ins</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/slumley/archive/2009/11/17/debugging-custom-validation-extraction-rules-web-test-and-load-test-plug-ins.aspx" /><id>http://blogs.msdn.com/b/slumley/archive/2009/11/17/debugging-custom-validation-extraction-rules-web-test-and-load-test-plug-ins.aspx</id><published>2009-11-17T02:24:00Z</published><updated>2009-11-17T02:24:00Z</updated><content type="html">&lt;P&gt;Most of my recent posts have been about new features in VS 2010.&amp;nbsp; This post is going to show you how to debug your custom rules.&amp;nbsp; This applies to VS 2005, VS 2008 and VS 2010.&amp;nbsp; &lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;First let’s create a Test Project&lt;/LI&gt;
&lt;LI&gt;Then Right click on the project node and select Add –&amp;gt;&amp;nbsp; Web Test&lt;/LI&gt;
&lt;LI&gt;Record a simple web test&lt;/LI&gt;
&lt;LI&gt;Now add a new class to the project.&amp;nbsp; We can re-use the sample extraction rule from this earlier post: &lt;A href="http://blogs.msdn.com/joshch/archive/2005/11/17/494164.aspx" mce_href="http://blogs.msdn.com/joshch/archive/2005/11/17/494164.aspx"&gt;Sample Extraction Rule&lt;/A&gt;&amp;nbsp; Copy and paste the code from this sample into the new class file.&lt;/LI&gt;
&lt;LI&gt;Compile the project&lt;/LI&gt;
&lt;LI&gt;Right click on a request that has a post parameter and select the new rule:&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/DebuggingCustomValidationExtractionrules_124D5/image_28.png" mce_href="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/DebuggingCustomValidationExtractionrules_124D5/image_28.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/DebuggingCustomValidationExtractionrules_124D5/image_thumb_13.png" width=717 height=384 mce_src="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/DebuggingCustomValidationExtractionrules_124D5/image_thumb_13.png"&gt;&lt;/A&gt; &lt;/LI&gt;
&lt;LI&gt;Enter a context parameter name, name of the form field to extract and the index of the form field to extract.&amp;nbsp; I am going to enter _EVENTVALIDATION. Then click OK.&lt;/LI&gt;
&lt;LI&gt;The test is ready to run.&amp;nbsp; If you click the play button in the web test editor the test will run and the you will see the results in the Web Test viewer.&amp;nbsp; But what if your custom rule/plugin isn’t working as expected.&amp;nbsp; When I playback my test, my rule failed to find the _EVENTVALIDATION field.&amp;nbsp;&amp;nbsp; &lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/DebuggingCustomValidationExtractionrules_124D5/image_24.png" mce_href="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/DebuggingCustomValidationExtractionrules_124D5/image_24.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/DebuggingCustomValidationExtractionrules_124D5/image_thumb_11.png" width=745 height=314 mce_src="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/DebuggingCustomValidationExtractionrules_124D5/image_thumb_11.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;H3&gt;Debugging the rule&lt;/H3&gt;
&lt;OL&gt;
&lt;LI&gt;First we need to place a break point in the custom rule.&amp;nbsp; For an extraction rule, place a break point in the extract method.&amp;nbsp; &lt;A href="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/DebuggingCustomValidationExtractionrules_124D5/image_6.png" mce_href="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/DebuggingCustomValidationExtractionrules_124D5/image_6.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/DebuggingCustomValidationExtractionrules_124D5/image_thumb_2.png" width=674 height=412 mce_src="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/DebuggingCustomValidationExtractionrules_124D5/image_thumb_2.png"&gt;&lt;/A&gt; &lt;/LI&gt;
&lt;LI&gt;Now we need to start the test.&amp;nbsp; This time we don’t want to just click play.&amp;nbsp; If you hit the drop down on the web test editor play button, you will see that there are 4 options.&amp;nbsp; This time choose Debug Test.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;A href="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/DebuggingCustomValidationExtractionrules_124D5/image_14.png" mce_href="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/DebuggingCustomValidationExtractionrules_124D5/image_14.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/DebuggingCustomValidationExtractionrules_124D5/image_thumb_6.png" width=478 height=171 mce_src="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/DebuggingCustomValidationExtractionrules_124D5/image_thumb_6.png"&gt;&lt;/A&gt; &lt;/LI&gt;
&lt;LI&gt;When the test runs, it will hit your break point.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;A href="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/DebuggingCustomValidationExtractionrules_124D5/image_16.png" mce_href="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/DebuggingCustomValidationExtractionrules_124D5/image_16.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/DebuggingCustomValidationExtractionrules_124D5/image_thumb_7.png" width=706 height=240 mce_src="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/DebuggingCustomValidationExtractionrules_124D5/image_thumb_7.png"&gt;&lt;/A&gt;&amp;nbsp; &lt;/LI&gt;
&lt;LI&gt;Now we can step through and see why the rule failed.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;A href="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/DebuggingCustomValidationExtractionrules_124D5/image_26.png" mce_href="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/DebuggingCustomValidationExtractionrules_124D5/image_26.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/DebuggingCustomValidationExtractionrules_124D5/image_thumb_12.png" width=709 height=318 mce_src="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/DebuggingCustomValidationExtractionrules_124D5/image_thumb_12.png"&gt;&lt;/A&gt; &lt;/LI&gt;
&lt;LI&gt;In my case I can see that when I typed in the form field, I missed a _.&amp;nbsp; Now if I correct my mistake and rerun, I can see the value extracted into the context.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;A href="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/DebuggingCustomValidationExtractionrules_124D5/image_30.png" mce_href="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/DebuggingCustomValidationExtractionrules_124D5/image_30.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/DebuggingCustomValidationExtractionrules_124D5/image_thumb_14.png" width=711 height=294 mce_src="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/DebuggingCustomValidationExtractionrules_124D5/image_thumb_14.png"&gt;&lt;/A&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;This shows you how to debug web tests rules/plugins.&amp;nbsp; But the same applies to load test plugins.&amp;nbsp; The load test editor play button is also a split button.&amp;nbsp; So just place your break point in the load test plug-in and choose debug test instead of play test.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;I hope this helps in debugging your custom rules.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9923336" width="1" height="1"&gt;</content><author><name>slumley</name><uri>http://blogs.msdn.com/slumley/ProfileUrlRedirect.ashx</uri></author><category term="VSTS" scheme="http://blogs.msdn.com/b/slumley/archive/tags/VSTS/" /><category term="Web Test" scheme="http://blogs.msdn.com/b/slumley/archive/tags/Web+Test/" /><category term="Load Test" scheme="http://blogs.msdn.com/b/slumley/archive/tags/Load+Test/" /><category term="VSTS2010" scheme="http://blogs.msdn.com/b/slumley/archive/tags/VSTS2010/" /><category term="Visual Studio 2010" scheme="http://blogs.msdn.com/b/slumley/archive/tags/Visual+Studio+2010/" /><category term="VSTS Testing" scheme="http://blogs.msdn.com/b/slumley/archive/tags/VSTS+Testing/" /></entry><entry><title>VSTS 2010 Feature: API for Processing Web Test Results</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/slumley/archive/2009/11/11/vs-2010-feature-api-for-processing-web-test-results.aspx" /><id>http://blogs.msdn.com/b/slumley/archive/2009/11/11/vs-2010-feature-api-for-processing-web-test-results.aspx</id><published>2009-11-11T15:49:00Z</published><updated>2009-11-11T15:49:00Z</updated><content type="html">&lt;P&gt;One request which we have received a number of times is something like, “The Web test playback UI is great for when you are in VS, but I need to share these results with others.&amp;nbsp; Can I generate a report from the web test result?” In VS 2005 and 2008, the web test result was stored in a trx file which was an XML file.&amp;nbsp; We did not have a public API for processing the web test results.&amp;nbsp; In VS 2010, we have made some changes in this area.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;First, the web test results are no longer completely stored in the trx file.&amp;nbsp; The trx file has reference to a .webtestresult file which has the actual result. Look under you TestResults directory which is located in your TestProject directory by default.&amp;nbsp; In this directory, you will see a number of trx files.&amp;nbsp; If you then search into the folder that corresponds with the trx and then navigate into the IN directory, you will find the .webtestresult file.&amp;nbsp; This file will have the name of the web test that was being executed.&amp;nbsp; So if you ran WebTest1.webtest, you will find a result file names WebTest1.webtestresult.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;We have made the API for processing .webtestresult files public.&amp;nbsp; So now you can process this file and create your own custom reports for web test results.&amp;nbsp; I am going to walk you through a demo for how to do this.&amp;nbsp; We will create a simple console app that will read in the webtestresult file and then create an XML document.&amp;nbsp; This will show you how to process the result file so you can generate your own custom reports.&lt;/P&gt;
&lt;H3&gt;WebTestResult Model&lt;/H3&gt;
&lt;P&gt;There are a few classes that you will have to become familiar with.&amp;nbsp; These are all in the Microsoft.Visual Studio.TestTools.WebTesting namespace.&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;WebTestResultDetailsSerializer – This class will be used to read the .webtestresult file. &lt;/LI&gt;
&lt;LI&gt;WebTestResultDetails – This class is what the serializer will return.&amp;nbsp; This contains the full result.&amp;nbsp; It contains a collection of iterations.&amp;nbsp; Each iteration contains a collection of WebTestResultUnit objects. &lt;/LI&gt;
&lt;LI&gt;WebTestResultUnit -&amp;nbsp; This is the base class for page, transaction, comments, loops, and conditional results. &lt;/LI&gt;
&lt;LI&gt;WebTestResultPage – This contains information about a page including the request, response, dependent Urls, redirected Urls, timing info etc. &lt;/LI&gt;
&lt;LI&gt;WebTestResultTransaction – This contains information about a transaction such as name and response time.&amp;nbsp; It also contains a collection of WebTestResultUnit objects which are contained within the transaction. &lt;/LI&gt;
&lt;LI&gt;WebTestResultCondition – This contains information about a web test condition such as condition being tested and whether or not the condition was met.&amp;nbsp; It also contains a collection of WebTestResultUnit objects which are contained within the condition. &lt;/LI&gt;
&lt;LI&gt;WebTestResultLoop – This contains information about a web test loop such as the loop condition.&amp;nbsp; It contains a collection of WebTestResultLoopIteration objects.&amp;nbsp; It has one object for each iteration of the loop. &lt;/LI&gt;
&lt;LI&gt;WebTestResultLoopIteration – This contains information about a particular loop iteration.&amp;nbsp; It also contains a collection of WebTestResultUnit objects which are contained within the loop iteration. &lt;/LI&gt;
&lt;LI&gt;WebTestResultComment – This contains information about a web test comment. &lt;/LI&gt;&lt;/OL&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;Sample Console Application&lt;/H3&gt;
&lt;P&gt;Now that we have gone over the basic classes we will be using, let’s create a sample app which will create a custom report.&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;First launch VS and create a new Console Application project. &lt;/LI&gt;
&lt;LI&gt;Right click on the project in solution explorer and select properties. &lt;/LI&gt;
&lt;LI&gt;Make sure the target framework is set to .NET Framework 4 and not .NET Framework 4 client profile &lt;/LI&gt;
&lt;LI&gt;Right reference node and select Add Reference… &lt;/LI&gt;
&lt;LI&gt;In the Add Reference dialog select the Microsoft.Visual Studio.QualityTools.WebTestFramework.dll &lt;/LI&gt;
&lt;LI&gt;Right click the project node and add a new class called ReportGenerator.&amp;nbsp; Here is the code for that class.&amp;nbsp; Let’s go over what is happening. 
&lt;UL&gt;
&lt;LI&gt;GenerateReport – This method takes the webtestresult file.&amp;nbsp; It creates and instance of the serializer which will then return the WebTestResultDetails.&amp;nbsp; My sample is going to return an xml document, so I am also creating an Xml document here which I will be building up.&amp;nbsp; Then you can see that it starts iterating over the Iterations.&amp;nbsp; For each iteration it then iterates over the children in the iteration which are all WebTestResultUnit objects.&amp;nbsp; It passes the WebTestResultUnit to ProcessResultUnit &lt;/LI&gt;
&lt;LI&gt;ProcessResultUnit – This method needs to figure out what kind of result unit it is and then do the appropriate thing.&amp;nbsp; For example, for pages, it will Create a page node with the url and response times as attributes.&amp;nbsp; Then it will iterates through the redirected requests and the dependent requests for the page.&amp;nbsp; For a transaction, it will create a transaction node with the name and response time of the transaction.&amp;nbsp; It will then iterate over the children of the transaction which are all WebTestResultUnit objects and call ProcessResultUnit for each of the children &lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;using System.Xml; &lt;BR&gt;using Microsoft.Visual Studio.TestTools.WebTesting; &lt;/P&gt;
&lt;P&gt;namespace ConsoleApplication1 &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; internal class ReportGenerator &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public ReportGenerator() &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public XmlDocument GenerateReport(string file) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //create the serialzer &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WebTestResultDetailsSerializer serializer = new WebTestResultDetailsSerializer(); &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //deserialize the webtest result &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WebTestResultDetails details = serializer.Deserialize(file); &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //create root element for the document &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XmlDocument doc = new XmlDocument(); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XmlElement elem = doc.CreateElement("WebTestResultDetails"); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; doc.AppendChild(elem); &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //now we need to loop through each iteration &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (WebTestResultIteration iteration in details.WebTestIterations) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XmlElement iterationElement = doc.CreateElement("Iteration"); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; elem.AppendChild(iterationElement); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //loop through and process each child.&amp;nbsp; A Child could be a &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //transaction, page, comment, innertest, etc. &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (WebTestResultUnit unit in iteration.Children) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ProcessResultUnit(unit, doc, iterationElement); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return doc; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void ProcessResultUnit(WebTestResultUnit unit, XmlDocument doc, XmlElement elem) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (unit is WebTestResultPage) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XmlElement pageElement = doc.CreateElement("Page"); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; elem.AppendChild(pageElement); &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WebTestResultPage page = unit as WebTestResultPage; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pageElement.SetAttribute("Url", page.RequestResult.Request.UrlWithQueryString);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pageElement.SetAttribute("ResponseTime", page.RequestResult.Response.Statistics.MillisecondsToLastByte.ToString()); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //process redirects &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (page.RedirectedPages.Count &amp;gt; 0) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //create the Redirects element &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XmlElement redirectsElement = doc.CreateElement("Redirects"); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pageElement.AppendChild(redirectsElement); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (WebTestResultPage redirect in page.RedirectedPages) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ProcessResultUnit(redirect, doc, redirectsElement); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //process each dependent &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (page.RequestResult.DependantResults.Count &amp;gt; 0) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //create the DependentRequests element &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XmlElement dependentsElement = doc.CreateElement("DependentRequests"); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pageElement.AppendChild(dependentsElement); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (WebTestRequestResult request in page.RequestResult.DependantResults) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XmlElement dependentElement = doc.CreateElement("DependentRequest"); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dependentsElement.AppendChild(dependentElement); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dependentElement.SetAttribute("Url", request.Request.UrlWithQueryString);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if (unit is WebTestResultTransaction) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WebTestResultTransaction transaction = unit as WebTestResultTransaction; &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //create the transaction element &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XmlElement transactionElement = doc.CreateElement("Transaction"); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; elem.AppendChild(transactionElement); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; transactionElement.SetAttribute("Name", transaction.Name); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; transactionElement.SetAttribute("IsIncludedTest", transaction.IsIncludedTest.ToString()); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; transactionElement.SetAttribute("ResponseTime", transaction.ResponseTime.ToString());&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //now we need to process each child of the transacction which can any resultunit type.&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //so iterate through children and call ProcessResultUnit &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (transaction.Children.Count &amp;gt; 0) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XmlElement children = doc.CreateElement("Children"); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; transactionElement.AppendChild(children); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (WebTestResultUnit child in transaction.Children) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ProcessResultUnit(child,doc,children); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if (unit is WebTestResultCondition) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WebTestResultCondition condition = unit as WebTestResultCondition; &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //create the Condition element &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XmlElement conditionElement = doc.CreateElement("Condition"); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; elem.AppendChild(conditionElement); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; conditionElement.SetAttribute("Name", condition.ConditionStringRepresentation); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //now we need to process each child of the condition which can any resultunit type.&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //so iterate through children and call ProcessResultUnit &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (condition.Children.Count &amp;gt; 0) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XmlElement children = doc.CreateElement("Children"); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; conditionElement.AppendChild(children); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (WebTestResultUnit child in condition.Children) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ProcessResultUnit(child, doc, children); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if (unit is WebTestResultLoop) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WebTestResultLoop loop = unit as WebTestResultLoop; &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //create the Loop element &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XmlElement loopElement = doc.CreateElement("Loop"); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; elem.AppendChild(loopElement); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; loopElement.SetAttribute("Name", loop.LoopStringRepresentation);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //now we need to process each child of the loop which can any resultunit type.&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //so iterate through children and call ProcessResultUnit &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (loop.Children.Count &amp;gt; 0) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XmlElement children = doc.CreateElement("LoopIterations"); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; loopElement.AppendChild(children); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (WebTestResultUnit child in loop.Children) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ProcessResultUnit(child, doc, children); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if (unit is WebTestResultLoopIteration) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WebTestResultLoopIteration loopIteration = unit as WebTestResultLoopIteration; &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //create the LoopIteration element &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XmlElement loopIterationElement = doc.CreateElement("LoopIteration"); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; elem.AppendChild(loopIterationElement); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; loopIterationElement.SetAttribute("Number", loopIteration.IterationNumber.ToString()); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; loopIterationElement.SetAttribute("IsConditionalRuleMet", loopIteration.IsConditionalRuleMet().ToString());&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //now we need to process each child of the loop which can any resultunit type.&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //so iterate through children and call ProcessResultUnit &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (loopIteration.Children.Count &amp;gt; 0) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XmlElement children = doc.CreateElement("Children"); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; loopIterationElement.AppendChild(children); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (WebTestResultUnit child in loopIteration.Children) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ProcessResultUnit(child,doc,children); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if (unit is WebTestResultComment) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WebTestResultComment comment = unit as WebTestResultComment; &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //create the Comment element &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XmlElement commentElement = doc.CreateElement("Comment"); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; elem.AppendChild(commentElement); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; commentElement.SetAttribute("Text", comment.Comment);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;}&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Now go back to Program.cs file.&amp;nbsp; This class just needs to know where the results file is and where to store the output file.&amp;nbsp; So we will check to make sure we get this information and then pass it along the report generator.&amp;nbsp; This class looks like this: &lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;using System; &lt;BR&gt;using System.Xml; &lt;BR&gt;using System.IO; &lt;/P&gt;
&lt;P&gt;namespace ConsoleApplication1 &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; class Program &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; static void Main(string[] args) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (args.Length != 2) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("Usage:&amp;nbsp; ReportGenerator &amp;lt;WebTestResultFile&amp;gt; &amp;lt;OutputFile&amp;gt;"); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!File.Exists(args[0])) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("WebTestResult file does not exist"); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (File.Exists(args[1])) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("Output file already exists.&amp;nbsp; Please specify a new name."); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ReportGenerator generator = new ReportGenerator(); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XmlDocument report = generator.GenerateReport(args[0]); &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XmlTextWriter writer = new XmlTextWriter(args[1], null); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; writer.Formatting = Formatting.Indented; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; report.Save(writer); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;}&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Now compile your code.&amp;nbsp; to run it, open a command prompt and go to directory that the exe was compiled into.&amp;nbsp; You would run it with something like:&amp;nbsp; ReportGenerator c:\Webtest1.webtestresult c:\NewReport.xml&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Here is a sample output created from one of my webtests:&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;lt;?xml version="1.0"?&amp;gt; &lt;BR&gt;&amp;lt;WebTestResultDetails&amp;gt; &lt;BR&gt;&amp;nbsp; &amp;lt;Iteration&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Transaction Name="Transaction1" IsIncludedTest="False" ResponseTime="88.384"&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Children&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Transaction Name="WebTest8.Storecsvs" IsIncludedTest="True" ResponseTime="56.825"&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Children&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Page Url="&lt;A href="http://sampleserver/Storecsvs%22" mce_href="http://sampleserver/Storecsvs%22"&gt;&lt;FONT color=#0066dd&gt;http://sampleserver/Storecsvs"&lt;/FONT&gt;&lt;/A&gt; ResponseTime="28829"&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Redirects&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Page Url="&lt;A href="http://sampleserver/Storecsvs/%22" mce_href="http://sampleserver/Storecsvs/%22"&gt;&lt;FONT color=#0066dd&gt;http://sampleserver/Storecsvs/"&lt;/FONT&gt;&lt;/A&gt; ResponseTime="27996"&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;DependentRequests&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;DependentRequest Url="&lt;A href="http://sampleserver/Storecsvs/IBuySpy.css%22" mce_href="http://sampleserver/Storecsvs/IBuySpy.css%22"&gt;&lt;FONT color=#0066dd&gt;http://sampleserver/Storecsvs/IBuySpy.css"&lt;/FONT&gt;&lt;/A&gt; /&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;DependentRequest Url="&lt;A href="http://sampleserver/Storecsvs/images/grid_background.gif%22" mce_href="http://sampleserver/Storecsvs/images/grid_background.gif%22"&gt;&lt;FONT color=#0066dd&gt;http://sampleserver/Storecsvs/images/grid_background.gif"&lt;/FONT&gt;&lt;/A&gt; /&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/DependentRequests&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Page&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Redirects&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Page&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Children&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Transaction&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Page Url="&lt;A href='http://sampleserver/Storecsvs/productslist.aspx?CategoryID=15&amp;amp;amp;selection=1"'&gt;&lt;FONT color=#0066dd&gt;http://sampleserver/Storecsvs/productslist.aspx?CategoryID=15&amp;amp;amp;selection=1"&lt;/FONT&gt;&lt;/A&gt; ResponseTime="27737"&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;DependentRequests&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;DependentRequest Url="&lt;A href="http://sampleserver/Storecsvs/images/sitebkgrdnogray.gif%22" mce_href="http://sampleserver/Storecsvs/images/sitebkgrdnogray.gif%22"&gt;&lt;FONT color=#0066dd&gt;http://sampleserver/Storecsvs/images/sitebkgrdnogray.gif"&lt;/FONT&gt;&lt;/A&gt; /&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;DependentRequest Url="&lt;A href="http://sampleserver/Storecsvs/IBuySpy.css%22" mce_href="http://sampleserver/Storecsvs/IBuySpy.css%22"&gt;&lt;FONT color=#0066dd&gt;http://sampleserver/Storecsvs/IBuySpy.css"&lt;/FONT&gt;&lt;/A&gt; /&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/DependentRequests&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Page&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Page Url="&lt;A href='http://sampleserver/Storecsvs/ProductDetails.aspx?productID=394"'&gt;&lt;FONT color=#0066dd&gt;http://sampleserver/Storecsvs/ProductDetails.aspx?productID=394"&lt;/FONT&gt;&lt;/A&gt; ResponseTime="316"&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;DependentRequests&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;DependentRequest Url="&lt;A href="http://sampleserver/Storecsvs/IBuySpy.css%22" mce_href="http://sampleserver/Storecsvs/IBuySpy.css%22"&gt;&lt;FONT color=#0066dd&gt;http://sampleserver/Storecsvs/IBuySpy.css"&lt;/FONT&gt;&lt;/A&gt; /&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;DependentRequest Url="&lt;A href="http://sampleserver/Storecsvs/images/sitebkgrd.gif%22" mce_href="http://sampleserver/Storecsvs/images/sitebkgrd.gif%22"&gt;&lt;FONT color=#0066dd&gt;http://sampleserver/Storecsvs/images/sitebkgrd.gif"&lt;/FONT&gt;&lt;/A&gt; /&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/DependentRequests&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Page&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Children&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Transaction&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Comment Text="Sample Comment" /&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Page Url="&lt;A href='http://sampleserver/Storecsvs/AddToCart.aspx?ProductID=394"'&gt;&lt;FONT color=#0066dd&gt;http://sampleserver/Storecsvs/AddToCart.aspx?ProductID=394"&lt;/FONT&gt;&lt;/A&gt; ResponseTime="251"&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Redirects&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Page Url="&lt;A href="http://sampleserver/Storecsvs/ShoppingCart.aspx%22" mce_href="http://sampleserver/Storecsvs/ShoppingCart.aspx%22"&gt;&lt;FONT color=#0066dd&gt;http://sampleserver/Storecsvs/ShoppingCart.aspx"&lt;/FONT&gt;&lt;/A&gt; ResponseTime="0"&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;DependentRequests&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;DependentRequest Url="&lt;A href="http://sampleserver/Storecsvs/images/sitebkgrd.gif%22" mce_href="http://sampleserver/Storecsvs/images/sitebkgrd.gif%22"&gt;&lt;FONT color=#0066dd&gt;http://sampleserver/Storecsvs/images/sitebkgrd.gif"&lt;/FONT&gt;&lt;/A&gt; /&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;DependentRequest Url="&lt;A href="http://sampleserver/Storecsvs/IBuySpy.css%22" mce_href="http://sampleserver/Storecsvs/IBuySpy.css%22"&gt;&lt;FONT color=#0066dd&gt;http://sampleserver/Storecsvs/IBuySpy.css"&lt;/FONT&gt;&lt;/A&gt; /&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/DependentRequests&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Page&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Redirects&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Page&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Loop Name="Loop ( Repeat 1 times )"&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;LoopIterations&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;LoopIteration Number="1" IsConditionalRuleMet="True"&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Children&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Page Url="&lt;A href="http://sampleserver/Storecsvs/ShoppingCart.aspx%22" mce_href="http://sampleserver/Storecsvs/ShoppingCart.aspx%22"&gt;&lt;FONT color=#0066dd&gt;http://sampleserver/Storecsvs/ShoppingCart.aspx"&lt;/FONT&gt;&lt;/A&gt; ResponseTime="27729"&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;DependentRequests&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;DependentRequest Url="&lt;A href="http://sampleserver/Storecsvs/IBuySpy.css%22" mce_href="http://sampleserver/Storecsvs/IBuySpy.css%22"&gt;&lt;FONT color=#0066dd&gt;http://sampleserver/Storecsvs/IBuySpy.css"&lt;/FONT&gt;&lt;/A&gt; /&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;DependentRequest Url="&lt;A href="http://sampleserver/Storecsvs/images/sitebkgrd.gif%22" mce_href="http://sampleserver/Storecsvs/images/sitebkgrd.gif%22"&gt;&lt;FONT color=#0066dd&gt;http://sampleserver/Storecsvs/images/sitebkgrd.gif"&lt;/FONT&gt;&lt;/A&gt; /&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/DependentRequests&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Page&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Children&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/LoopIteration&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;LoopIteration Number="2" IsConditionalRuleMet="False" /&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/LoopIterations&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Loop&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Page Url="&lt;A href="http://sampleserver/Storecsvs/ShoppingCart.aspx%22" mce_href="http://sampleserver/Storecsvs/ShoppingCart.aspx%22"&gt;&lt;FONT color=#0066dd&gt;http://sampleserver/Storecsvs/ShoppingCart.aspx"&lt;/FONT&gt;&lt;/A&gt; ResponseTime="542"&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;DependentRequests&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;DependentRequest Url="&lt;A href="http://sampleserver/Storecsvs/images/sitebkgrd.gif%22" mce_href="http://sampleserver/Storecsvs/images/sitebkgrd.gif%22"&gt;&lt;FONT color=#0066dd&gt;http://sampleserver/Storecsvs/images/sitebkgrd.gif"&lt;/FONT&gt;&lt;/A&gt; /&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;DependentRequest Url="&lt;A href="http://sampleserver/Storecsvs/IBuySpy.css%22" mce_href="http://sampleserver/Storecsvs/IBuySpy.css%22"&gt;&lt;FONT color=#0066dd&gt;http://sampleserver/Storecsvs/IBuySpy.css"&lt;/FONT&gt;&lt;/A&gt; /&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/DependentRequests&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Page&amp;gt; &lt;BR&gt;&amp;nbsp; &amp;lt;/Iteration&amp;gt; &lt;BR&gt;&amp;lt;/WebTestResultDetails&amp;gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I hope this helps getting you started in creating your own custom web test result reports.&amp;nbsp; There is plenty of other information available to you.&amp;nbsp; My sample just gives you an idea of how to parse through the objects.&amp;nbsp; More or less anything that you see in the web test playback UI is available in the result objects.&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9920859" width="1" height="1"&gt;</content><author><name>slumley</name><uri>http://blogs.msdn.com/slumley/ProfileUrlRedirect.ashx</uri></author><category term="VSTS" scheme="http://blogs.msdn.com/b/slumley/archive/tags/VSTS/" /><category term="Web Test" scheme="http://blogs.msdn.com/b/slumley/archive/tags/Web+Test/" /><category term="Load Test" scheme="http://blogs.msdn.com/b/slumley/archive/tags/Load+Test/" /><category term="VSTS2010" scheme="http://blogs.msdn.com/b/slumley/archive/tags/VSTS2010/" /><category term="Visual Studio 2010" scheme="http://blogs.msdn.com/b/slumley/archive/tags/Visual+Studio+2010/" /><category term="VSTS Testing" scheme="http://blogs.msdn.com/b/slumley/archive/tags/VSTS+Testing/" /></entry><entry><title>VSTS 2010 Feature: Load Testing Run Comparison Report in Excel</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/slumley/archive/2009/11/07/vsts-2010-feature-load-testing-run-comparison-report-in-excel.aspx" /><id>http://blogs.msdn.com/b/slumley/archive/2009/11/07/vsts-2010-feature-load-testing-run-comparison-report-in-excel.aspx</id><published>2009-11-07T00:43:51Z</published><updated>2009-11-07T00:43:51Z</updated><content type="html">&lt;p&gt;This blog post is going to be about one of my favorite new features added for Beta2. In Beta1 we added excel integration for reporting on Load Test Reports. In beta1, the report that was added was a trend report which would give you a feel for how certain counters changed from run to run. Check out this blog post for more info on that report: &lt;a href="http://blogs.msdn.com/slumley/archive/2009/05/22/dev10-feature-load-test-excel-report-integration.aspx"&gt;Excel Trend Report&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The new report type which has been added gives a more detailed comparison of 2 runs. Let’s walk through creating the new report and looking at the output.&lt;/p&gt;  &lt;p&gt;1) Launch Excel and click on the load test ribbon. The click the Load Test Report Button.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/09d119397746_10CD5/image_4.png"&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="173" alt="image" src="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/09d119397746_10CD5/image_thumb_1.png" width="357" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;2) In the first page of the wizard enter the database server and select the database. Then click next.&lt;/p&gt;  &lt;p&gt;3) On second page of the wizard choose “Create a Report” and click Next.&lt;/p&gt;  &lt;p&gt;4) On third page, select Run Comparison as the report type. Then click next.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/09d119397746_10CD5/ReportTypeWizardPage_2.jpg"&gt;&lt;img title="ReportTypeWizardPage" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="335" alt="ReportTypeWizardPage" src="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/09d119397746_10CD5/ReportTypeWizardPage_thumb.jpg" width="396" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;5) On fourth page, Enter a name for the report and choose a load test that you want to use for report generation. Click next.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/09d119397746_10CD5/ReportInfo_2.jpg"&gt;&lt;img title="ReportInfo" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="401" alt="ReportInfo" src="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/09d119397746_10CD5/ReportInfo_thumb.jpg" width="450" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;6) The fifth page is where you select the runs to compare. Select 2 runs and click next.&lt;/p&gt;  &lt;p&gt;7) The sixth page is where you select the counters that you want included on the report. You will notice that there are some counters which have been pre-selected. These are just some default counters. Select whichever counters you want.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/09d119397746_10CD5/ReportCounters_2.jpg"&gt;&lt;img title="ReportCounters" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="392" alt="ReportCounters" src="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/09d119397746_10CD5/ReportCounters_thumb.jpg" width="449" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;8) Then click finish and the report will be generated.&lt;/p&gt;  &lt;p&gt;Now let’s take a look at what was generated for you.&lt;/p&gt;  &lt;p&gt;1) Table of Contents – This page gives you a list and links to each page in the report.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/09d119397746_10CD5/ReportTOC_2.jpg"&gt;&lt;img title="ReportTOC" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="341" alt="ReportTOC" src="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/09d119397746_10CD5/ReportTOC_thumb.jpg" width="480" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;2) Runs – This page gives a little info about the 2 runs which were selected.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/09d119397746_10CD5/RunList_2.jpg"&gt;&lt;img title="RunList" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="247" alt="RunList" src="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/09d119397746_10CD5/RunList_thumb.jpg" width="487" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;3) The next three sheets give a comparison of each test, page and transaction in the load test.&lt;/p&gt;  &lt;p&gt;4) Test Comparison – The page and transaction sheets will be very similar to this. The 2 charts at the top will show the top 5 tests which had the largest performance improvement and top 5 tests which showed the worst regressions. The table underneath the chart will show all tests in the load test. It lists out the scenario and test name. Then gives the Baseline value and Comparison value followed by a % change from baseline. There is also a color scale added to help you quickly identify problems.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/09d119397746_10CD5/TestComparison_2.jpg"&gt;&lt;img title="TestComparison" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="377" alt="TestComparison" src="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/09d119397746_10CD5/TestComparison_thumb.jpg" width="699" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;5) Page Comparison – This is very similar to the test sheet, but gives a breakdown of each page. The other difference is that it includes the response goal value and gives you a % change from goal. So if you set page goals, they would appear here.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/09d119397746_10CD5/PageComparison_2.jpg"&gt;&lt;img title="PageComparison" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="534" alt="PageComparison" src="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/09d119397746_10CD5/PageComparison_thumb.jpg" width="708" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;6) Transaction Comparison – Again, this is similar to test and page sheets.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/09d119397746_10CD5/TransactionComparison_2.jpg"&gt;&lt;img title="TransactionComparison" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="389" alt="TransactionComparison" src="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/09d119397746_10CD5/TransactionComparison_thumb.jpg" width="651" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;7) Machine Comparison – This page will compare counters between the two runs. As you can see from the screen shot below, it lists the Machines used in the Baseline and Comparison runs as well as the roles for the machine. The role is important because in order for two machines to be compared the roles need to match. For example, if MachineA was the IIS server in Baseline and was SQL Server in Comparison run, then the report will not compare that machine between the 2 runs. You will still have the counters for that machine listed, but it will not line them up for a comparison. Now if MachineA was the IIS server in Baseline run and MachineB was IIS role for comparison run, those 2 machines will be compared. This is useful if you will be doing many runs, but are not guaranteed the same set of machines for every run you do. As you can see from my report, TeamTestWeb1 played the role of IIS and SQL Server for both of my runs which is why they were compared.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/09d119397746_10CD5/MachineComparison_2.jpg"&gt;&lt;img title="MachineComparison" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="358" alt="MachineComparison" src="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/09d119397746_10CD5/MachineComparison_thumb.jpg" width="603" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;8) Error Comparison – This page give you a breakdown of errors in each run and % change between the runs.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/09d119397746_10CD5/ErrorComparison_2.jpg"&gt;&lt;img title="ErrorComparison" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="229" alt="ErrorComparison" src="http://blogs.msdn.com/blogfiles/slumley/WindowsLiveWriter/09d119397746_10CD5/ErrorComparison_thumb.jpg" width="642" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;As mentioned in the previous blog on excel reporting, the report definition that you generate is saved in the load test database. So you can come back later and generate the report again, or use that as a template to generate other run comparison reports.&lt;/p&gt;  &lt;p&gt;I hope you find this report useful and let us know what you think.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9918920" width="1" height="1"&gt;</content><author><name>slumley</name><uri>http://blogs.msdn.com/slumley/ProfileUrlRedirect.ashx</uri></author></entry></feed>