1단계: BizTalk Server에 문서를 전송하는 단위 테스트 만들기
BizTalk Server 같은 컴퓨터 애플리케이션 서버는 사용자를 대신하여 특정 작업을 수행하도록 설계되었습니다. 이러한 작업은 애플리케이션 서버가 이해하는 프로토콜을 통해 애플리케이션 서버가 이해하는 표준을 준수하는 메시지로 애플리케이션 서버에 전송되는 클라이언트 요청으로 시작됩니다. 예를 들어 클라이언트는 SMTP 프로토콜을 통해 전자 메일 서버에 인터넷 전자 메일 메시지를 전송하여 전자 메일 처리를 시작할 수 있습니다. 마찬가지로 웹 서버는 클라이언트 HTML 또는 ASP 요청을 처리하고, 데이터베이스 서버는 클라이언트 SQL 요청을 처리하고, BizTalk Server 수많은 업계 표준 프로토콜을 사용하여 여러 업계 메시지 표준을 준수하여 형식이 지정된 클라이언트 메시지를 처리할 수 있습니다. 애플리케이션 서버의 워크로드 용량은 일반적으로 애플리케이션 서버가 지정된 기간 동안 처리할 수 있는 메시지 수로 측정됩니다. 마찬가지로 BizTalk Server 워크로드 용량은 바쁜 근무일 또는 작업 주와 같이 장기간에 걸쳐 "초당 받은 문서", "초당 처리된 문서" 및/또는 "초당 완료된 오케스트레이션"의 평균 수로 측정됩니다. Visual Studio 2010 부하 테스트 기능은 최대 수백 명의 사용자가 동시에 서버 애플리케이션에 액세스하는 부하 프로필을 시뮬레이션할 수 있습니다. 이 부하 테스트 기능은 선택한 주요 성능 지표에 대한 실시간 메트릭과 향후 분석을 위해 이러한 메트릭을 데이터베이스에 저장하는 기능을 제공합니다. 이 문서에서는 단위 테스트를 만드는 방법, 부하 테스트를 만드는 방법 및 BizTalk Server 애플리케이션의 MST(최대 지속 가능한 처리량)를 결정하는 데 필요한 성능 카운터 데이터를 캡처하도록 부하 테스트를 구성하는 방법을 포함하여 BizTalk Server 애플리케이션의 부하 테스트 목적으로 Visual Studio 테스트 프로젝트의 사용을 설명합니다.
BizTalk Server 문서를 제출하는 Visual Studio 단위 테스트 만들기
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) 클래스가 사용됩니다. 부하 테스트 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
위치: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 Computer는 부하 테스트를 수행할 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 프로젝트의 References 폴더를 마우스 오른쪽 단추로 클릭한 다음 참조 추가를 클릭합니다.
참조 추가 대화 상자에서 .NET 탭을 클릭하고 Ctrl+키보드/마우스 클릭 조합을 사용하여 다음 .NET 네임스페이스를 동시에 선택합니다.
System.Configuration
System.Runtime.Serialization
System.ServiceModel.Channels
System.ServiceModel
System.Web.Extensions
System.Xml
네임스페이스를 선택한 후 확인을 클릭하여 이러한 어셈블리를 BTSLoad 테스트 프로젝트에 대한 참조로 추가합니다.
BTSLoad 프로젝트를 마우스 오른쪽 단추로 클릭한 다음 빌드를 클릭하여 프로젝트를 BTSLoad 어셈블리로 컴파일합니다.