Lync クライアント側 SDK 2013 と UCMA 4.0 を使用してアプリケーションを作成しました。今、多数のユーザーでアプリケーションをテストしています。UCMA または Lync クライアント側 SDK を使用して多数のクライアントをシミュレートするにはどうすればよいですか?
2 に答える
作成したすべてのアプリケーションのストレス テストを行うためのツールを UCMA で作成しました。
作り方は簡単で、2つのパーツで構成されています。この例は、通話のストレス テスターです。もちろん、この例を使用して別のものを簡単に作成できます。
プラットフォームを作成し、Set-CsTrustedApplication に従います。
var platformSettings = new ProvisionedApplicationPlatformSettings("InnixiTester", "urn:application:innixitester"); var collabPlatform = new CollaborationPlatform(platformSettings); collabPlatform.EndStartup(collabPlatform.BeginStartup(null, null));
わかりました、私がここで行っていることは、Begin と End を 1 行のコードにまとめるという間違った連鎖であることはわかっています。ただし、これは単なるコード例です。Tom Morganの記事を読むように勧めます。彼は、なぜ私のようにそれを行うのが良くないのかを説明しています。
ここでは、Parallel ループを使用して、すべてのユーザー エンドポイントを作成します。そうすれば、速くなります。
/* * Proprieties of the class */ private AutoResetEvent _waitForStressTestToFinish = new AutoResetEvent(false); private List<UserEndpoint> _listUserEndpoints = new List<UserEndpoint>(); private int _maxUsers = 200; private int _tickTotal; private int _tickCount; private int _nbrCallsByIntervall; /* * End */ _maxUsers = 200; // Nbr max of users const var callsTotal = 200; // Nbr of total call const var timeToTest = 30; // Total time to test const var intervalOfCalls = 5; // We want to make our calls between specific intervals Parallel.For(0, _maxUsers, i => { CreateUserEndpoint(collabPlatform, i.ToString()); });
ここで UserEndpoint を作成するだけです。シナリオは、Active Directory 内のユーザーが stressuser0 から stressuser200 であるというものです。+14250 から +1425200 までの拡張機能付き
private void CreateUserEndpoint(CollaborationPlatform cp, string iteration) { try { UserEndpointSettings settingsUser = new UserEndpointSettings($"sip:stressuser{iteration}@pferde.net", "pool2010.pferde.net", 5061); settingsUser = InitializePublishAlwaysOnlineSettings(settingsUser); var userEndpoint = new UserEndpoint(cp, settingsUser); userEndpoint.EndEstablish(userEndpoint.BeginEstablish(null, null)); PublishOnline(userEndpoint); _listUserEndpoints.Add(userEndpoint); Console.WriteLine($"The User Endpoint owned by URI: {userEndpoint.OwnerUri} was created\n"); } catch (Exception) { Console.WriteLine($"failed to create for --> sip:stressuser{iteration}@pferde.net"); throw; } } private UserEndpointSettings InitializePublishAlwaysOnlineSettings(UserEndpointSettings settings) { settings.AutomaticPresencePublicationEnabled = true; settings.Presence.PreferredServiceCapabilities.AudioSupport = CapabilitySupport.Supported; return (settings); }
今すぐ電話をかけましょう。タイマーを使った簡単なアルゴリズムをコーディングします。X 時間、Y 呼び出し、Z 間隔で行う必要がある呼び出しの数を計算します。
Console.WriteLine("Tape a key to place calls..."); Console.ReadKey(); PlaceCalls(callsTotal, timeToTest, intervalOfCalls); _waitForStressTestToFinish.WaitOne(); } catch (Exception ex) { Console.WriteLine($"Shutting down platform due to error {ex}"); ShutdownPlatform(collabPlatform); } ShutdownPlatform(collabPlatform); } private void PlaceCalls(int callsMax, int timeMax, int timeIntervall) { _tickTotal = timeMax / timeIntervall; _nbrCallsByIntervall= callsMax / _tickTotal; Console.WriteLine($"_nbrCallsByIntervall --> {_nbrCallsByIntervall}"); var timeIntervalTimespan = new TimeSpan(0, 0, 0, timeIntervall); _timer = new Timer(timeIntervalTimespan.TotalMilliseconds); _timer.Elapsed += new ElapsedEventHandler(_timer_Elapsed); _timer.Enabled = true; } void _timer_Elapsed(object sender, ElapsedEventArgs e) { if (_tickCount < _tickTotal) { Console.WriteLine($"\n Pause Timer | On {_tickCount} to {_tickTotal}\n"); _timer.Enabled = false; for (var i = 0; i <= _nbrCallsByIntervall - 1; ++i) { ConversationSettings convSettings = new ConversationSettings(); Conversation conversation = new Conversation(_listUserEndpoints[generateNumber(0, _listUserEndpoints.Count)], convSettings); var audioVideoCall = new AudioVideoCall(conversation); CallEstablishOptions options = new CallEstablishOptions(); var gNbr = generateNumber(0, _listUserEndpoints.Count); try { // Here I'm calling a single phone number. You can use GenerateNumber to call stressusers each others. But you have to extend your code to accept the calls coming. audioVideoCall.BeginEstablish($"3322", options, null, audioVideoCall); } catch (Exception) { Console.WriteLine("Fail to Call the remote user..."); throw; } Console.WriteLine($"Call--> +1425{gNbr}.Counter--> {_tickCount} Ticket--> {_tickTotal} and thread id {Thread.CurrentThread.ManagedThreadId}"); } _tickCount++; _timer.Enabled = true; Console.WriteLine("\n reStart Timer \n"); } else { Console.WriteLine("\n!!! END Stress test !!!\n"); _timer.Enabled = false; _waitForCallToEstablish.Set(); } } private int generateNumber(int min, int max) { var r = new Random(); Thread.Sleep(200); return (r.Next(min, max)); }