使用 BizUnit 和 LoadGen 自动执行性能和稳定性测试

本主题介绍如何将 Microsoft BizTalk LoadGen 2007 工具与 BizUnit 配合使用,以自动执行BizTalk Server解决方案的性能和稳定性测试。

BizTalk Server性能测试,分步执行

在研究如何自动执行BizTalk Server性能测试之前,了解性能测试中通常执行的步骤非常有用。 以下步骤代表“典型”BizTalk Server性能测试过程:

  1. 创建测试结果目录以存储结果和收集的数据,例如事件日志、跟踪日志性能监视器数据。

  2. 清除测试环境中所有服务器上的事件日志。

  3. 停止所有 BizTalk 主机实例。

  4. 停止运行独立 BizTalk 主机(例如 SOAP 和 HTTP 接收适配器处理程序)的任何 IIS 实例。

  5. 重启运行BizTalk Server的计算机使用的所有SQL Server实例。

  6. 清理 MessageBox 数据库,以确保没有以前的测试运行的剩余数据。 这一点很重要,因为任何剩余数据都可能会扭曲测试结果。

  7. 启动 BizTalk 主机实例。

  8. 在测试环境中的所有服务器上启动相关的性能监视器计数器。

  9. 通过系统发送“启动”消息以初始化系统缓存。

  10. 处理启动消息后,在SQL Server测试结果数据库中跟踪测试开始时间。

  11. 通过启动所有 LoadGen 测试代理来启动性能测试。

  12. 等待测试完成 - 通常可以通过测量性能监视器计数器的值(例如主机队列长度)来系统地完成此操作。

  13. 在 SQL 测试结果数据库中跟踪测试结束时间。

  14. 停止测试环境中所有服务器上的相关性能监视器计数器。

  15. 将测试数据保存到之前创建的测试结果目录。

  16. 为下一个测试运行执行任何必要的清理。

    可以使用 BizUnit 自动执行刚才列出的每个步骤。 利用 BizUnit 提供的现有测试步骤资产,可以快速轻松地为BizTalk Server解决方案生成自动化性能测试。 使用 BizUnit 自动执行性能测试的主要好处之一是可以灵活地在夜间运行测试,这意味着结果可以在早上进行分析。 这大大降低了项目团队的性能测试负担。

Microsoft BizTalk LoadGen 2007 工具

BizTalk LoadGen 2007 工具 (LoadGen) 是由压力和性能测试团队在 BizTalk Server 2006 产品组中开发的负载测试工具。 LoadGen 旨在快速、轻松且可靠地定义模拟生产级消息卷的负载测试。 LoadGen 是多线程的、配置驱动的,并支持多种传输。 BizTalk 产品组每天使用 LoadGen;因此,可以高度确信该工具经久耐用、适合用途,并且能够模拟各种 BizTalk 方案。

LoadGen 采用模块化设计,由三个层组成: 演示文稿框架组件。 表示层由负责驱动框架的命令行驱动程序组成。 框架层读取配置文件,然后执行其中指定的组件。 组件层由三种类型的组件组成:负载生成器消息创建者和限制控制器。 其中每个组件都是可扩展的,因此你可以创建自己的组件并将其插入 LoadGen 以满足方案的需求。 由于 LoadGen 是由BizTalk Server产品组开发的,因此应发现开箱即用的组件将满足大部分负载测试要求。 此处更详细地描述了其中每个组件。

  • 负载生成器 负责通过特定传输传输消息。 为以下传输提供了负载生成器:

    • 文件

    • HTTP

    • MQSeries

    • MSMQLarge

    • MSMQ

    • SOAP

    • Web 服务增强 (WSE)

    • Windows SharePoint Services (WSS)

    • Windows Communication Foundation (WCF)

  • 消息创建者 是一个可选组件,可在需要生成包含唯一数据的消息时使用。 消息创建者使用两种创建模式之一:同步和异步。 如果指定了同步消息创建模式,则 LoadGen 仅使用单个线程来创建消息,以确保每条消息包含唯一的有效负载。 虽然同步模式保证每个消息内的唯一数据,但此模式也会限制可伸缩性。 LoadGen 还提供使用多个执行线程的异步消息创建者;这使 LoadGen 能够满足目标消息速率 (,因为它可以简单地创建更多线程) 。 在异步模式下,可将消息创建者配置为随机修改每条消息的数据。 但是,由于它使用多个线程,因此不能保证测试期间生成的所有消息都将包含唯一的有效负载。

  • 在测试运行时,限制控制器通过控制负载生成器来确保消息以稳定的速率传输。 LoadGen 还公开了自定义限制,这使你可以根据以下条件控制消息流:

    • 文件夹中的文件数

    • 数据库表中的行数

    • MSMQ 或 MQSeries 消息队列的深度

    Microsoft BizTalk LoadGen 2007 工具 可供下载。

示例 LoadGen 配置文件

所有 LoadGen 配置信息都存储在 xml 文件中。 LoadGen 配置文件包含一个 <CommonSection> 元素,该元素为 LoadGen 方案中的所有 LoadGen 任务配置默认设置。 LoadGen 配置文件还可以包含一个或多个 <为特定 LoadGen 任务提供配置设置的 Section> 元素。 Section 元素中的<条目取代 CommonSection> 元素中指定的<任何>默认值。

下面的示例 LoadGen 配置文件是包含于 LoadGen 安装目录的 \ConfigFiles\ConsoleConfigFiles 子目录中的 FileToFileLG.xml 示例配置文件的略有修改版本。 此测试每 200 毫秒<>发送 25 条消息 <LotSizePerInterval>,每个负载生成器 <NumThreadsperSection>发送 5 个线程,并在发送 5000 条消息 <NumFiles> 后停止负载测试。

文件限制控制器在 ThrottleController> 节中<指定。 ThresholdRange> 的值<设置为 1000-2000,这意味着如果文件位置 C:\Scenarios\FileToFile\Receive (Parameters) 的文件少于 1000 或超过 2000 个,则限制控制器将限制文件生成器并根据需要增加/减少负载。 每 1000 毫秒 <SleepInterval> 检查一次文件位置中的文件数。 <FileSection> 元素定义由负载生成器发送的消息的属性。 FileToFileLG.xml 文件 <SrcFilePath> 将由 LoadGen 复制到 filerop C:\Scenarios\FileToFile\Receive <DstFilePath>。 此处使用文件传输,因为这是 CommonSection> 元素中的<<传输名称>元素中指定的默认传输。

<LoadGenFramework>
   <CommonSection>
      <LoadGenVersion>2</LoadGenVersion>
      <OptimizeLimitFileSize>204800</OptimizeLimitFileSize>
      <NumThreadsPerSection>5</NumThreadsPerSection>
      <SleepInterval>200</SleepInterval>
      <LotSizePerInterval>25</LotSizePerInterval>
      <RetryInterval>10000</RetryInterval>
      <StopMode Mode="Files">
         <NumFiles>5000</NumFiles>
      </StopMode>
      <Transport Name="FILE">
         <Assembly>FileTransport.dll/FileTransport.FileTransport</Assembly>
      </Transport>
      <ThrottleController Mode="Custom">
         <Monitor Name="File">
            <Assembly>FileMonitor.dll/DropLocationFileMonitor.DropLocationFileMonitor</Assembly>
            <ThresholdRange>1000-2000</ThresholdRange>
            <SleepInterval>1000</SleepInterval>
            <Parameters>C:\Scenarios\FileToFile\Receive</Parameters>
         </Monitor>
         <ThrottleCondition>File</ThrottleCondition>
      </ThrottleController>
   </CommonSection>
   <Section Name="FileSection">
      <SrcFilePath>C:\LoadGen\ConfigFiles\ConsoleConfigFiles\FileToFileLG.xml</SrcFilePath>
      <DstLocation>
         <Parameters>
            <DstFilePath>C:\Scenarios\FileToFile\Receive</DstFilePath>
         </Parameters>
      </DstLocation>
   </Section>
</LoadGenFramework>

使用 BizUnit 驱动 LoadGen

BizUnit 提供 LoadGenExecuteStep ,以促进自动性能和稳定性测试。 以下代码示例中显示了使用 LoadGenExecuteStep 的示例 BizUnit 配置文件的 TestExecution 阶段。 请注意,此步骤接受单个配置参数,即 LoadGen 配置文件的位置。

<TestCase testName="Test_LoadGen">
   <TestSetup>
   </TestSetup>
   <TestExecution>
      <TestStep assemblyPath="" typeName="BizUnit.LoadGenExecuteStep, BizUnit.LoadGenSteps">
         <LoadGenTestConfig>..\..\..\PerfGuideFiletoFile.xml</LoadGenTestConfig>
      </TestStep>
   </TestExecution>
   <!-- Test cleanup: test cases should always leave the system in the state they found it -->
   <TestCleanup>
   </TestCleanup>
</TestCase>

本主题的其余部分介绍使用 LoadGen 自动执行性能测试的 BizUnit 测试用例的配置文件。

注意

此配置文件可用作模板,在性能测试过程中快速集成 BizUnit 和 LoadGen。 在运行此测试用例之前,需要为环境自定义配置文件。 配置文件中必须自定义的部分会相应地指示。

首先,请为适用于 BizTalk 解决方案的 testName 参数指定一个值。

<TestCase testName="Performance-Guide-Sample-Loadgen-Test">

然后将上下文变量添加到 TestSetup 阶段。 这些上下文变量将在整个测试用例的持续时间内被引用。 若要使用此配置文件,请修改为 TestCaseResultsDir (C:\Dev Work\Perf Guide Demos\PerfResults\) 和 Machine (BIZTALKADMIN01) 指定的值,以匹配你的环境。

<TestSetup>
   <!-- Context property: name of test run -->
   <TestStep assemblyPath="" typeName="BizUnit.ContextManipulatorStep">
      <ContextItem contextKey="TestRunName">
         <ItemTest takeFromCtx="BizUnitTestCaseName"></ItemTest>
         <ItemTest>_%DateTime%</ItemTest>
      </ContextItem>
   </TestStep>
   <!-- Context property: name of test directory to store results -->
   <TestStep assemblyPath="" typeName="BizUnit.ContextManipulatorStep">
      <ContextItem contextKey="TestCaseResultsDir">
         <ItemTest>C:\Dev Work\Perf Guide Demos\PerfResults\</ItemTest>
         <ItemTest takeFromCtx="TestRunName"></ItemTest>
      </ContextItem>
   </TestStep>
   <!-- Context property: perfmon log file -->
   <TestStep assemblyPath="" typeName="BizUnit.ContextManipulatorStep">
      <ContextItem contextKey="PerfMonFilePath">
         <ItemTest takeFromCtx="TestCaseResultsDir"></ItemTest>
         <ItemTest>\PerfCounters.blg</ItemTest>
      </ContextItem>
   </TestStep>
   <!-- Context property: destintation for app event log on test computer -->
   <TestStep assemblyPath="" typeName="BizUnit.ContextManipulatorStep">
      <ContextItem contextKey="DestPath- BIZTALKADMIN01-AppEventLog">
         <ItemTest takeFromCtx="TestCaseResultsDir"></ItemTest>
         <ItemTest> BIZTALKADMIN01_ApplicationLog.evt</ItemTest>
      </ContextItem>
   </TestStep>
   <!-- Clear the application event log on test computer -->
   <TestStep assemblyPath="" typeName="BizUnit.EventLogClearStep">
      <Machine>BIZTALKADMIN01</Machine>
      <EventLog>Application</EventLog>
   </TestStep>
   <!-- Create the directory to save all the test results -->
   <TestStep assemblyPath="" typeName="BizUnit.CreateDirectory">
      <DirectoryName takeFromCtx="TestCaseResultsDir" ></DirectoryName>
   </TestStep>
</TestSetup>

完成 TestSetup 阶段后,我们进入 TestExecution 阶段。 第一步是停止 BizTalk 主机实例。 必须为每个不同的主机实例添加单独的 BizUnit.HostConductorStep 节。 如果在环境中使用此配置文件,则还需要为 HostInstanceNameServerLogonPassword 输入适当的值。

<TestExecution>
   <!-- Step 1: Stop BizTalk Hosts -->
   <TestStep assemblyPath="" typeName="BizUnit.HostConductorStep, BizUnit.BizTalkSteps">
      <Action>stop</Action>
      <HostInstanceName>BizTalkServerApplication</HostInstanceName>
      <Server>BizTalkAdmin01</Server>
      <Logon>ServerName\Administrator</Logon>
      <PassWord>Pass@word1</PassWord>
      <GrantLogOnAsService>true</GrantLogOnAsService>
   </TestStep>

停止所有主机实例后,我们使用bts_CleanupMsgBox存储过程清理 BizTalk MessageBox 数据库。 若要使用此步骤,必须修改 ConnectionString 的值以匹配环境。

<!-- Step 2: Clean Up MessageBox -->
<TestStep assemblyPath="" typeName="BizUnit.DBExecuteNonQueryStep">
   <DelayBeforeExecution>1</DelayBeforeExecution>
   <ConnectionString>Persist Security Info=False;Integrated Security=SSPI;database=BizTalkMsgBoxDb;server=BIZTALKADMIN01;Connect Timeout=30</ConnectionString>
   <SQLQuery>
      <RawSQLQuery>[dbo].[bts_CleanupMsgbox]</RawSQLQuery>
   </SQLQuery>
</TestStep>

TestExecution 阶段的步骤 3 开始性能监视器 (PerfMon) 模板文件中指定的计数器。 示例模板文件列在下面的示例 BizUnit.PerfmonCountersStep 下面。 若要使用模板文件,必须修改为 CountersListFilePath 指定的值以匹配环境。 修改示例性能监视器计数器模板文件,以包含要监视或删除与方案无关的任何 PerfMon 计数器。

<!-- Step 3: Start Perfmon counters -->
<TestStep assemblyPath="" typeName="BizUnit.PerfmonCountersStep">
   <PerfmonAction>Start</PerfmonAction>
   <CounterSetName>PerfGuidePerfmonCounters</CounterSetName>
   <CountersListFilePath>C:\Dev Work\Perf Guide Demos\Test_06_PerfCounters.txt</CountersListFilePath>
   <SampleInterval>5</SampleInterval>
   <PerfmonLogFilePath takeFromCtx="PerfMonFilePath"></PerfmonLogFilePath>
</TestStep>

BizUnit.PerfmonCountersStep) 引用的示例性能监视器计数器模板文件 (Test_06_PerfCounters.txt:

\Processor(*)\*
\Process(*)\*
\Memory\*
\PhysicalDisk(*)\*
\System\Context Switches/sec
\System\Processor Queue Length
\BizTalk:FILE Receive Adapter(*)\*
\BizTalk:File Send Adapter(*)\*
\BizTalk:FTP Receive Adapter(*)\*
\BizTalk:FTP Send Adapter(*)\*
\BizTalk:HTTP Receive Adapter(*)\*
\BizTalk:HTTP Send Adapter(*)\*
\BizTalk:Message Agent(*)\*
\BizTalk:Messaging(*)\*
\BizTalk:Message Box:General Counters(*)\*
\BizTalk:Message Box:Host Counters(*)\*
\BizTalk:Messaging Latency(*)\*
\BizTalk:SOAP Receive Adapter(*)\*
\BizTalk:SOAP Send Adapter(*)\*
\BizTalk:TDDS(*)\*
\XLANG/s Orchestrations(*)\*

现在,我们启动BizTalk Server主机实例。 必须为每个不同的主机实例添加单独的 BizUnit.HostConductorStep 部分, (不同的包括跨服务器) 主机的多个实例。 如果在环境中使用此配置文件,则还需要为 HostInstanceNameServerLogonPassword 输入适当的值。

<!-- Step 4: Start BizTalk Hosts -->
<TestStep assemblyPath="" typeName="BizUnit.BizTalkSteps.HostConductorStep, BizUnit.BizTalkSteps, Version=3.0.0.0, Culture=neutral, PublicKeyToken=7eb7d82981ae5162">
   <Action>start</Action>
   <HostInstanceName>BizTalkServerApplication</HostInstanceName>
   <Server>BizTalkAdmin01</Server>
   <Logon>ServerName\Administrator</Logon>
   <PassWord>Pass@word1</PassWord>
   <GrantLogOnAsService>true</GrantLogOnAsService>
</TestStep>

步骤 5 通过使用 BizUnit.LoadGenExecuteStep 向BizTalk Server发送一些消息来“启动”系统;更改 LoadGenTestConfig 参数的值以匹配环境。

<!-- Step 5: Send Priming messages -->
<TestStep assemblyPath="" typeName="BizUnit.LoadGenExecuteStep, BizUnit.LoadGenSteps">
   <LoadGenTestConfig>C:\Program Files\LoadGen\ConfigFiles\ConsoleConfigFiles\PerfGuideFiletoFile.xml</LoadGenTestConfig>
</TestStep>

步骤 6 将 LoadGen 配置文件写入内存,以便在测试完成后将其写入测试结果数据库。


      <!-- Step 6: Read loadgen file into context variable -->
<TestStep assemblyPath="" typeName="BizUnit.FileReadAndLoadToContext">
   <FilePath>C:\Program Files\LoadGen\ConfigFiles\ConsoleConfigFiles\PerfGuideFiletoFile.xml</FilePath>
   <ContextPropertyName>LoadGenFileContent</ContextPropertyName>
</TestStep>

现在,我们将测试开始时间写入测试结果数据库。 修改 ConnectionStringRawSQLQuery 参数以匹配环境。

<!-- Step 7: Update test results DB with test start time -->
<TestStep assemblyPath="" typeName="BizUnit.DBExecuteNonQueryStep">
   <DelayBeforeExecution>1</DelayBeforeExecution>
   <ConnectionString>Persist Security Info=False;Integrated Security=SSPI;database=TestResults;server=BizTalkAdmin01;Connect Timeout=30</ConnectionString>
   <SQLQuery>
      <RawSQLQuery>INSERT INTO tblPerformanceResults (Test_ID, StartTime,LoadGenFile) VALUES ('{0}',GetDate(),'{1}' )</RawSQLQuery>
      <SQLQueryParams>
         <SQLQueryParam takeFromCtx="TestRunName"></SQLQueryParam>
         <SQLQueryParam takeFromCtx="LoadGenFileContent"></SQLQueryParam>
      </SQLQueryParams>
   </SQLQuery>
</TestStep>

步骤 8 是使用 BizUnit.LoadGenExecuteStep 启动实际性能测试的位置。 此步骤指定步骤 5 中使用的同一 LoadGen 配置文件,但可在此处指定任何有效的 LoadGen 配置文件。 BizUnit.DelayStep 用于在步骤 9 中施加 5 秒的延迟,以便有时间让消息开始流经系统。 主机队列长度是使用 BizUnit.PerMonCounterMonitorStep 计算的。 当此参数达到步骤 10 中指定的值 1 时,将结束测试。 更改 InstanceNameServer 参数的值,使其与你要在环境中监视的主机实例和服务器的名称相匹配。

<!-- Step 8: LoadGen: Load actual perf test -->
<TestStep assemblyPath="" typeName="BizUnit.LoadGenSteps.LoadGenExecuteStep, BizUnit.LoadGenSteps , Version=3.0.0.0, Culture=neutral, PublicKeyToken=7eb7d82981ae5162">
   <LoadGenTestConfig>C:\Program Files\LoadGen\ConfigFiles\ConsoleConfigFiles\PerfGuideFiletoFile.xml</LoadGenTestConfig>
</TestStep>
<!-- Step 9: Delay for 5 secs to allow msgs to start flowing -->
<TestStep assemblyPath="" typeName="BizUnit.DelayStep">
   <Delay>5000</Delay>
</TestStep>
<!-- Step 10: Wait for Orch Host Queue depth to reach one -->
<TestStep assemblyPath="" typeName="BizUnit.PerfMonCounterMonitorStep">
   <CategoryName>BizTalk:Message Box:Host Counters</CategoryName>
   <CounterName>Host Queue - Length</CounterName>
   <InstanceName>BizTalkServerApplication:biztalkmsgboxdb:BizTalkAdmin01</InstanceName>
   <Server>BizTalkAdmin01</Server>
   <CounterTargetValue>1</CounterTargetValue>
</TestStep>

在测试结束时,我们使用 BizUnit.DBExecuteNonQueryStep 更新测试结果数据库。 此步骤的完成表示测试执行阶段的结束,如结束 </TestExecution> 标记所示。 同样,必须修改 ConnectionStringRawSQLQuery 参数以匹配环境。

   <!-- Step 11: Update test results DB with test stop time -->
   <TestStep assemblyPath="" typeName="BizUnit.DBExecuteNonQueryStep">
      <DelayBeforeExecution>1</DelayBeforeExecution>
      <ConnectionString>Persist Security Info=False;Integrated Security=SSPI;database=TestResults;server=BIZTALKADMIN01;Connect Timeout=30</ConnectionString>
      <SQLQuery>
         <RawSQLQuery>UPDATE tblPerformanceResults SET EndTime = GetDate() WHERE Test_ID = '{0}'</RawSQLQuery>
         <SQLQueryParams>
            <SQLQueryParam takeFromCtx="TestRunName"></SQLQueryParam>
         </SQLQueryParams>
      </SQLQuery>
   </TestStep>
</TestExecution>

完成执行阶段后,我们将进入测试清理阶段。 此阶段使用 BizUnit.PerfmonCountersStep 停止在步骤 3) 中之前 (启动的性能监视器计数器。

<TestCleanup>
      <!-- Return system to state prior to test -->
      <!-- Stop perfmon counters -->
      <TestStep assemblyPath="" typeName="BizUnit.PerfmonCountersStep" failOnError="false">
         <PerfmonAction>Stop</PerfmonAction>
         <CounterSetName>PerfGuidePerfmonCounters</CounterSetName>
      </TestStep>
   </TestCleanup>
</TestCase>

此示例演示了 BizUnit 如何与 LoadGen 结合使用以自动执行性能测试。 BizUnit 配置文件描述的负载测试可以从 Visual Studio 的测试工具执行,其方式与功能测试相同。 采用此方法可以集中管理、管理和收集性能测试的数据。

通过在自动化方法中使用 BizUnit 和 LoadGen,可以非常轻松地安排在非工作时间发生的多个测试运行,这将在正常工作时间内为分析提供充足的测试结果。 自动执行性能测试时,请考虑使用 LoadGen 脚本来模拟通过系统的不同负载,例如,你可能希望模拟不同程度 (75%、100% 和 125% ) 预期生产消息量。 执行负载测试时,测试重载或“糟糕的一天”方案尤其重要。 在将系统投入生产之前,你应该知道BizTalk Server环境中每个测试用例 (MST) 的最大可持续吞吐量。 有关最大可持续性能的详细信息,请参阅 BizTalk Server 2009 文档中) https://go.microsoft.com/fwlink/?LinkID=132304 (什么是可持续性能?

完整的 BizUnit LoadGen 示例配置文件

以下列表包含前面引用的 BizUnit 配置文件的全部内容。

<TestCase testName="Performance-Guide-Sample-Loadgen-Test">
   <TestSetup>
      <!-- Context property: name of test run -->
      <TestStep assemblyPath="" typeName="BizUnit.ContextManipulatorStep">
         <ContextItem contextKey="TestRunName">
            <ItemTest takeFromCtx="BizUnitTestCaseName"></ItemTest>
            <ItemTest>_%DateTime%</ItemTest>
         </ContextItem>
      </TestStep>
      <!-- Context property: name of test directory to store results -->
      <TestStep assemblyPath="" typeName="BizUnit.ContextManipulatorStep">
         <ContextItem contextKey="TestCaseResultsDir">
            <ItemTest>C:\Dev Work\Perf Guide Demos\PerfResults\</ItemTest>
            <ItemTest takeFromCtx="TestRunName"></ItemTest>
         </ContextItem>
      </TestStep>
      <!-- Context property: perfmon log file -->
      <TestStep assemblyPath="" typeName="BizUnit.ContextManipulatorStep">
         <ContextItem contextKey="PerfMonFilePath">
            <ItemTest takeFromCtx="TestCaseResultsDir"></ItemTest>
            <ItemTest>\PerfCounters.blg</ItemTest>
         </ContextItem>
      </TestStep>
      <!-- Context property: destintation for app event log on BTSSVR-001 -->
      <TestStep assemblyPath="" typeName="BizUnit.ContextManipulatorStep">
         <ContextItem contextKey="DestPath-BTSSVR-001-AppEventLog">
            <ItemTest takeFromCtx="TestCaseResultsDir"></ItemTest>
            <ItemTest>BTSSVR-001_ApplicationLog.evt</ItemTest>
         </ContextItem>
      </TestStep>
      <!-- Clear the application event log on BTSSVR-001 -->
      <TestStep assemblyPath="" typeName="BizUnit.EventLogClearStep">
         <Machine>BIZTALKADMIN01</Machine>
         <EventLog>Application</EventLog>
      </TestStep>
      <!-- Create the directory to save all the test results -->
      <TestStep assemblyPath="" typeName="BizUnit.CreateDirectory">
         <DirectoryName takeFromCtx="TestCaseResultsDir" ></DirectoryName>
      </TestStep>
   </TestSetup>

   <TestExecution>
      <!-- Step 1: Stop BizTalk Hosts -->
      <TestStep assemblyPath="" typeName="BizUnit.HostConductorStep, BizUnit.BizTalkSteps">
         <Action>stop</Action>
         <HostInstanceName>BizTalkServerApplication</HostInstanceName>
         <Server>BizTalkAdmin01</Server>
         <Logon>ServerName\Administrator</Logon>
         <PassWord>Pass@word1</PassWord>
         <GrantLogOnAsService>true</GrantLogOnAsService>
      </TestStep>
      <!-- Step 2: Clean Up MessageBox -->
      <TestStep assemblyPath="" typeName="BizUnit.DBExecuteNonQueryStep">
         <DelayBeforeExecution>1</DelayBeforeExecution>
         <ConnectionString>Persist Security Info=False;Integrated Security=SSPI;database=BizTalkMsgBoxDb;server=BIZTALKADMIN01;Connect Timeout=30</ConnectionString>
         <SQLQuery>
            <RawSQLQuery>[dbo].[bts_CleanupMsgbox]</RawSQLQuery>
         </SQLQuery>
      </TestStep>
      <!-- Step 3: Start Perfmon counters -->
      <TestStep assemblyPath="" typeName="BizUnit.PerfmonCountersStep">
         <PerfmonAction>Start</PerfmonAction>
         <CounterSetName>PerfGuidePerfmonCounters</CounterSetName>
         <CountersListFilePath>C:\Dev Work\Perf Guide Demos\Test_06_PerfCounters.txt</CountersListFilePath>
         <SampleInterval>5</SampleInterval>
         <PerfmonLogFilePath takeFromCtx="PerfMonFilePath"></PerfmonLogFilePath>
      </TestStep>
      <!-- Step 4: Start BizTalk Hosts -->
      <TestStep assemblyPath="" typeName="BizUnit.BizTalkSteps.HostConductorStep, BizUnit.BizTalkSteps, Version=3.0.0.0, Culture=neutral, PublicKeyToken=7eb7d82981ae5162">
         <Action>start</Action>
         <HostInstanceName>BizTalkServerApplication</HostInstanceName>
         <Server>BizTalkAdmin01</Server>
         <Logon>ServerName\Administrator</Logon>
         <PassWord>Pass@word1</PassWord>
         <GrantLogOnAsService>true</GrantLogOnAsService>
      </TestStep>
      <!-- Step 5: Send Priming messages -->
      <TestStep assemblyPath="" typeName="BizUnit.LoadGenExecuteStep, BizUnit.LoadGenSteps">
         <LoadGenTestConfig>C:\Program Files\LoadGen\ConfigFiles\ConsoleConfigFiles\PerfGuideFiletoFile.xml</LoadGenTestConfig>
      </TestStep>
      <!-- Step 6: Read loadgen file into context variable -->
      <TestStep assemblyPath="" typeName="BizUnit.FileReadAndLoadToContext">
         <FilePath>C:\Program Files\LoadGen\ConfigFiles\ConsoleConfigFiles\PerfGuideFiletoFile.xml</FilePath>
         <ContextPropertyName>LoadGenFileContent</ContextPropertyName>
      </TestStep>
      <!-- Step 7: Update test results DB with test start time -->
      <TestStep assemblyPath="" typeName="BizUnit.DBExecuteNonQueryStep">
         <DelayBeforeExecution>1</DelayBeforeExecution>
         <ConnectionString>Persist Security Info=False;Integrated Security=SSPI;database=TestResults;server=BizTalkAdmin01;Connect Timeout=30</ConnectionString>
         <SQLQuery>
            <RawSQLQuery>INSERT INTO tblPerformanceResults (Test_ID, StartTime,LoadGenFile) VALUES ('{0}',GetDate(),'{1}' )</RawSQLQuery>
            <SQLQueryParams>
               <SQLQueryParam takeFromCtx="TestRunName"></SQLQueryParam>
               <SQLQueryParam takeFromCtx="LoadGenFileContent"></SQLQueryParam>
            </SQLQueryParams>
         </SQLQuery>
      </TestStep>
      <!-- Step 8: LoadGen: Load actual perf test -->
      <TestStep assemblyPath="" typeName="BizUnit.LoadGenSteps.LoadGenExecuteStep, BizUnit.LoadGenSteps , Version=3.0.0.0, Culture=neutral, PublicKeyToken=7eb7d82981ae5162">
        <LoadGenTestConfig>C:\Program Files\LoadGen\ConfigFiles\ConsoleConfigFiles\PerfGuideFiletoFile.xml</LoadGenTestConfig>
      </TestStep>
      <!-- Step 9: Delay for 5 secs to allow msgs to start flowing -->
      <TestStep assemblyPath="" typeName="BizUnit.DelayStep">
         <Delay>5000</Delay>
      </TestStep>
      <!-- Step 10: Wait for Orch Host Queue depth to reach one -->
      <TestStep assemblyPath="" typeName="BizUnit.PerfMonCounterMonitorStep">
         <CategoryName>BizTalk:Message Box:Host Counters</CategoryName>
         <CounterName>Host Queue - Length</CounterName>
         <InstanceName>BizTalkServerApplication:biztalkmsgboxdb:BizTalkAdmin01</InstanceName>
         <Server>BizTalkAdmin01</Server>
         <CounterTargetValue>1</CounterTargetValue>
      </TestStep>
      <!-- Step 11: Update test results DB with test stop time -->
      <TestStep assemblyPath="" typeName="BizUnit.DBExecuteNonQueryStep">
         <DelayBeforeExecution>1</DelayBeforeExecution>
         <ConnectionString>Persist Security Info=False;Integrated Security=SSPI;database=TestResults;server=BIZTALKADMIN01;Connect Timeout=30</ConnectionString>
         <SQLQuery>
            <RawSQLQuery>UPDATE tblPerformanceResults SET EndTime = GetDate() WHERE Test_ID = '{0}'</RawSQLQuery>
            <SQLQueryParams>
               <SQLQueryParam takeFromCtx="TestRunName"></SQLQueryParam>
            </SQLQueryParams>
         </SQLQuery>
      </TestStep>
   </TestExecution>

   <TestCleanup>
      <!-- Return system to state prior to test -->
      <!-- Stop perfmon counters -->
      <TestStep assemblyPath="" typeName="BizUnit.PerfmonCountersStep" failOnError="false">
         <PerfmonAction>Stop</PerfmonAction>
         <CounterSetName>PerfGuidePerfmonCounters</CounterSetName>
      </TestStep>
   </TestCleanup>
</TestCase>

另请参阅

使用 BizUnit 优化自动测试