1

Lync クライアント側 SDK 2013 と UCMA 4.0 を使用してアプリケーションを作成しました。今、多数のユーザーでアプリケーションをテストしています。UCMA または Lync クライアント側 SDK を使用して多数のクライアントをシミュレートするにはどうすればよいですか?

4

2 に答える 2

1

作成したすべてのアプリケーションのストレス テストを行うためのツールを UCMA で作成しました。

作り方は簡単で、2つのパーツで構成されています。この例は、通話のストレス テスターです。もちろん、この例を使用して別のものを簡単に作成できます。

  1. プラットフォームを作成し、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の記事を読むように勧めます。彼は、なぜ私のようにそれを行うのが良くないのかを説明しています。

  1. ここでは、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());
            });
    
  2. ここで 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);
    }
    
  3. 今すぐ電話をかけましょう。タイマーを使った簡単なアルゴリズムをコーディングします。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));
    }
    
于 2016-02-05T15:36:49.837 に答える