步骤 1:创建单元测试以向 BizTalk Server 提交文档
计算机应用程序服务器(如BizTalk Server)旨在代表用户执行特定任务。 这些任务作为客户端请求发送到应用程序服务器,作为符合应用程序服务器理解的标准的消息通过应用程序服务器理解的协议发送到应用程序服务器。 例如,客户端可以通过 SMTP 协议将 Internet 电子邮件发送到电子邮件服务器来启动电子邮件处理。 同样,Web 服务器处理客户端 HTML 或 ASP 请求,数据库服务器处理客户端 SQL 请求,BizTalk Server可以使用多种行业标准协议处理格式符合多个行业消息标准的客户端消息。 应用程序服务器的工作负荷容量通常由应用程序服务器在给定时间段内可以处理的消息数来度量。 BizTalk Server的工作负荷容量同样被度量为“每秒接收的文档数”、“每秒处理的文档数”和/或“每秒完成的业务流程数”在较长时间内(例如忙碌的工作日甚至工作周)。 Visual Studio 2010 负载测试功能可以模拟多达数百个同时访问服务器应用程序的用户的负载配置文件。 此负载测试功能提供所选关键绩效指标的实时指标,以及将这些指标存储在数据库中以供将来分析的能力。 本文档反对使用 Visual Studio 测试项目来对BizTalk Server应用程序进行负载测试,包括如何创建单元测试、如何创建负载测试以及如何配置负载测试以捕获确定BizTalk Server应用程序的最大可持续吞吐量 (MST) 所需的性能计数器数据。
创建 Visual Studio 单元测试以将文档提交到BizTalk Server
Visual Studio 单元测试引用 Microsoft.VisualStudio.TestTools.UnitTesting (https://go.microsoft.com/fwlink/?LinkID=132293) 命名空间,该命名空间提供多个类,这些类为单元测试提供支持。 特别重要的是, UnitTesting (https://go.microsoft.com/fwlink/?LinkID=132293) 命名空间包括 Microsoft.VisualStudio.TestTools.UnitTesting.TestContext (https://go.microsoft.com/fwlink/?LinkID=208233) 类来存储提供给单元测试的信息,并且 Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute (https://go.microsoft.com/fwlink/?LinkID=208235) 类用于定义 Test 方法。 为了BizTalk Server进行负载测试,测试方法应指定要加载的消息以及消息应发送到的终结点/URL。 然后,当创建相应的 BizTalk 接收位置时,终结点/URL 将用作BizTalk Server的消息入口点。
为了便于说明,本主题中的示例代码介绍了利用 System.ServiceModel.ChannelFactory (TChannel) (https://go.microsoft.com/fwlink/?LinkID=208238) 类将消息发送到使用 WCF net.tcp 终结点并由 BizTalk WCF-Custom 接收适配器监视的服务终结点的测试方法。 测试消息的服务终结点在测试项目的应用程序配置 (app.config) 文件中定义。
有关 Visual Studio 单元测试的详细信息 ,请参阅单元测试 (https://go.microsoft.com/fwlink/?LinkID=208232) 剖析。
按照以下部分中的步骤创建具有单元测试的测试项目,以将文档提交到一台或多台BizTalk Server计算机。 这些步骤是使用 Visual Studio 2010 Ultimate Edition 完成的。
设置 Visual Studio 2010 测试项目选项
启动 Visual Studio 2010 Ultimate Edition。 单击 “开始”,指向 “所有程序”,指向 “Microsoft Visual Studio 2010 ”,然后单击“ Microsoft Visual Studio 2010”。
在 Visual Studio 2010 中,单击“ 工具 ”,然后单击“ 选项” 以显示“ 选项 ”对话框。
单击展开测试工具然后单击“测试项目”以显示用于创建新测试项目的选项。
将 默认测试项目语言 设置为 Visual C# 测试项目。
在 “选择将添加到每个新测试项目的文件”选项下,默认情况下: 选择“ Visual C# 测试项目”,并取消选中 Visual C# 测试项目的所有测试类型( 单元测试除外)。
单击“确定”关闭“选项”对话框 。
使用测试项目创建新的 Visual Studio 2010 解决方案
在 Visual Studio 2010 Ultimate 计算机上创建文件夹 C:\Projects 。
在 Visual Studio 2010 中,单击“ 文件”,指向“ 新建”,然后单击“ 项目 ”以显示“ 新建项目 ”对话框。
在 “已安装的模板 ”下,单击展开 “Visual C#”,然后单击“ 测试”。
在“ 新建项目 ”对话框的底部,指定以下选项:
名称:BTSLoad
Location:C:\Projects\
解决方案名称:LoadTest
确保选中“ 为解决方案创建目录 ”选项,然后单击“ 确定”。
将文件夹添加到 BTSLoad 项目;此文件夹将包含要提交到BizTalk Server的测试邮件。 在解决方案资源管理器中,右键单击 BTSLoad 项目,指向“添加”,然后单击“新建文件夹”。 带有突出显示文本 NewFolder1 的文件夹图标将显示在 BTSLoad 项目下,键入 TestMessages 以更改突出显示的文本,然后按 Enter 键创建文件夹 C:\Projects\LoadTest\BTSLoad\TestMessages。
更新测试项目中的代码,并将应用程序配置文件添加到测试项目
在解决方案资源管理器单击以选择 UnitTest1.cs,并将现有代码替换为以下示例代码列表:
#region Using Directives using System; using System.IO; using System.Diagnostics; using System.Text; using System.Configuration; using System.Collections.Generic; using System.Linq; using System.Xml; using System.ServiceModel; using System.ServiceModel.Channels; using Microsoft.VisualStudio.TestTools.UnitTesting; #endregion namespace Microsoft.BizTalk.Samples { [TestClass] public class BTSLoadTest { #region Constants private const int MaxBufferSize = 2097152; private const string Source = "BTS Load Test"; private const string Star = "*"; private const string TestMessageFolderParameter = "testMessageFolder"; private const string TestMessageFolderDefault = @"C:\Projects\LoadTest\BTSLoad\TestMessages"; private const string TestMessageFolderFormat = @"Test Message Folder = {0}"; private const string TestXmlDocument = "testxmldocument.xml"; #endregion #region Private Instance Fields private TestContext testContextInstance; #endregion #region Private ThreadStatic Fields [ThreadStatic] private static ChannelFactory<IRequestChannel> channelFactory; [ThreadStatic] private static IRequestChannel channel = null; [ThreadStatic] private static byte[] buffer = null; #endregion #region Private Static Fields private static string testMessageFolder = null; #endregion #region Public Instance Constructor public BTSLoadTest() { } #endregion #region Public Static Constructor static BTSLoadTest() { try { testMessageFolder = ConfigurationManager.AppSettings[TestMessageFolderParameter]; if (string.IsNullOrEmpty(testMessageFolder)) { testMessageFolder = TestMessageFolderDefault; } } catch (Exception ex) { Trace.WriteLine(ex.Message); EventLog.WriteEntry(Source, ex.Message, EventLogEntryType.Error); } } #endregion #region Public Properties /// <summary> ///Gets or sets the test context which provides ///information about and functionality for the current test run. ///</summary> public TestContext TestContext { get { return testContextInstance; } set { testContextInstance = value; } } #endregion #region Test Methods [TestMethod] public void BTSMessaging() { InvokeBizTalkReceiveLocation("BTSMessagingEP", testMessageFolder, TestXmlDocument, MessageVersion.Default, SessionMode.Allowed); } [TestMethod] public void BTSMessaging2() { InvokeBizTalkReceiveLocation("BTSMessagingEP2", testMessageFolder, TestXmlDocument, MessageVersion.Default, SessionMode.Allowed); } [TestMethod] public void BTSOrchestration() { InvokeBizTalkReceiveLocation("BTSOrchestrationEP", testMessageFolder, TestXmlDocument, MessageVersion.Default, SessionMode.Allowed); } #endregion #region Helper Methods public void InvokeBizTalkReceiveLocation(string endpointConfigurationName, string requestMessageFolder, string requestMessageName, MessageVersion messageVersion, SessionMode sessionMode) { XmlTextReader xmlTextReader = null; Message requestMessage = null; Message responseMessage = null; try { if (channel == null || channel.State != CommunicationState.Opened) { channelFactory = new ChannelFactory<IRequestChannel>(endpointConfigurationName); channelFactory.Endpoint.Contract.SessionMode = sessionMode; channel = channelFactory.CreateChannel(); } if (buffer == null) { string path = Path.Combine(requestMessageFolder, requestMessageName); string message; using (StreamReader reader = new StreamReader(File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read))) { message = reader.ReadToEnd(); } buffer = Encoding.UTF8.GetBytes(message); } MemoryStream stream = new MemoryStream(buffer); xmlTextReader = new XmlTextReader(stream); requestMessage = Message.CreateMessage(messageVersion, Star, xmlTextReader); TestContext.BeginTimer(requestMessageName); responseMessage = channel.Request(requestMessage); } catch (FaultException ex) { HandleException(ex); throw; } catch (CommunicationException ex) { HandleException(ex); throw; } catch (TimeoutException ex) { HandleException(ex); throw; } catch (Exception ex) { HandleException(ex); throw; } finally { TestContext.EndTimer(requestMessageName); CloseObjects(xmlTextReader, requestMessage, responseMessage); } } private void HandleException(Exception ex) { try { Trace.WriteLine(ex.Message); EventLog.WriteEntry(Source, ex.Message, EventLogEntryType.Error); } catch (Exception) { } } private void CloseObjects(XmlTextReader xmlTextReader, Message requestMessage, Message responseMessage) { try { if (xmlTextReader != null) { xmlTextReader.Close(); } if (requestMessage != null) { requestMessage.Close(); } if (responseMessage != null) { responseMessage.Close(); } } catch (Exception) { } } #endregion } }
将应用程序配置文件添加到测试项目:
在 解决方案资源管理器中,右键单击 BTSLoad 项目,指向“添加”,然后单击“新建项”。
在 “添加新项 ”对话框中的“ 已安装模板”下,单击“ 常规”。
在显示的项列表中,单击以选择“ 应用程序配置文件 ”,然后单击“ 添加”。
在解决方案资源管理器选择 app.config 文件,并将 app.config 文件的内容替换为下面列出的示例代码:
重要
对于此文件中定义的每个客户端终结点,BizTalk Server计算机是BizTalk Server计算机的实际名称的占位符, (将对其执行负载测试的) 。
<configuration> <system.serviceModel> <!-- Bindings used by client endpoints --> <bindings> <netTcpBinding> <binding name="netTcpBinding" closeTimeout="01:10:00" openTimeout="01:10:00" receiveTimeout="01:10:00" sendTimeout="01:10:00" transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions" hostNameComparisonMode="StrongWildcard" listenBacklog="100" maxBufferPoolSize="1048576" maxBufferSize="10485760" maxConnections="400" maxReceivedMessageSize="10485760"> <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" /> <security mode="None"> <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" /> <message clientCredentialType="Windows" /> </security> </binding> </netTcpBinding> </bindings> <client> <!-- Client endpoints used to exchange messages with WCF Receive Locations --> <!-- BTSMessagingEP --> <endpoint address="net.tcp://BizTalk Server Computer:8123/btsloadtest" binding="netTcpBinding" bindingConfiguration="netTcpBinding" contract="System.ServiceModel.Channels.IRequestChannel" name="BTSMessagingEP" /> <endpoint address="net.tcp://BizTalk Server Computer:8123/btsloadtest" binding="netTcpBinding" bindingConfiguration="netTcpBinding" contract="System.ServiceModel.Channels.IRequestChannel" name="BTSMessagingEP" /> <!-- BTSOrchestrationEP --> <endpoint address="net.tcp://BizTalk Server Computer:8122/btsloadtest" binding="netTcpBinding" bindingConfiguration="netTcpBinding" contract="System.ServiceModel.Channels.IRequestChannel" name="BTSOrchestrationEP" /> </client> </system.serviceModel> <appSettings> <!-- Folder containing test messages --> <add key="testMessageFolder" value="C:\Projects\LoadTest\BTSLoad\TestMessages" /> <add key="ClientSettingsProvider.ServiceUri" value="" /> </appSettings> </configuration>
在 Visual Studio 2010 中单击“ 文件 ”菜单,然后单击“ 全部保存”。
向项目添加测试消息
对于此示例,BizTalk Server接收位置 () 和发送端口 () 将配置为使用直通管道,并且不会执行任何文档验证。 按照以下步骤向项目添加测试消息:
启动记事本。 单击“开始”,单击“运行”,然后在“运行”对话框中键入记事本。
将以下文本复制到记事本并另存为“C:\Projects\LoadTest\BTSLoad\TestMessages\TestXmlDocument.xml”
<BTSLoadTest xmlns="http://Microsoft.BizTalk.Samples.BTSLoadTest"> <MessageText> This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. This is sample message text. </MessageText> </BTSLoadTest>
关闭记事本。
重要
如果使用多个负载测试代理计算机进行负载测试,则需要在每个负载测试代理计算机上使用相同的文件名将此文件保存到同一路径。
添加对项目的必要引用并生成测试项目
在解决方案资源管理器中,右键单击 BTSLoad 项目的“引用”文件夹,然后单击“添加引用”。
在“添加引用”对话框中,单击“ .NET ”选项卡,并使用 Ctrl+单击键盘/鼠标组合同时选择以下 .NET 命名空间:
System.Configuration
System.Runtime.Serialization
System.ServiceModel.Channels
System.ServiceModel
System.Web.Extensions
System.Xml
选择命名空间后,单击“ 确定 ”将这些程序集添加为对 BTSLoad 测试项目的引用。
右键单击 BTSLoad 项目,然后单击“ 生成 ”,将项目编译到 BTSLoad 程序集中。