加载测试SignalR集线器应用程序的最佳方法是什么?

时间:2012-05-17 01:50:00

标签: asp.net-mvc asp.net-4.0 signalr

我想了解一些用于测试基于SignalR集线器的应用程序的不同方法。

5 个答案:

答案 0 :(得分:10)

简而言之,如果使用集线器,使用.Net客户端就足够了。

在我的情况下,我有一个新闻源中心,根据用户的个人资料ID列出客户特定数据。在我的测试用例中,我加载了一堆配置文件ID(在这种情况下为6000),调用名为JoinNewsfeed()的hub方法以及特定于客户端的连接ID和配置文件ID。每100ms建立一个新连接。

    [TestMethod]
    public void TestJoinNewsfeedHub()
    {
        int successfulConnections = 0;

        // get profile ID's
        memberService = new MemberServiceClient();
        List<int> profileIDs = memberService.GetProfileIDs(6000).ToList<int>();

        HubConnection hubConnection = new HubConnection(HUB_URL);
        IHubProxy newsfeedHub = hubConnection.CreateProxy("NewsfeedHub");


        foreach (int profileID in profileIDs)
        {
            hubConnection.Start().Wait();
            //hubConnection = EstablishHubConnection();
            newsfeedHub.Invoke<string>("JoinNewsfeed", hubConnection.ConnectionId, profileID).ContinueWith(task2 =>
            {
                if (task2.IsFaulted)
                {
                    System.Diagnostics.Debug.Write(String.Format("An error occurred during the method call {0}", task2.Exception.GetBaseException()));
                }
                else
                {
                    successfulConnections++;
                    System.Diagnostics.Debug.Write(String.Format("Successfully called MethodOnServer: {0}", successfulConnections));

                }
            });

            Thread.Sleep(100);

        }

        Assert.IsNotNull(newsfeedHub);
    }

列出的效果指标here可以在服务器上执行此操作。为了确保客户端实际连接并且在服务器上填充客户端对象的过程已成功完成,我有一个服务器端方法调用客户端函数,其中包含从连接客户端派生的已连接客户端的数量和列表集合。

答案 1 :(得分:8)

@ElHaix从我在自己的测试中看到的,您的方法不是创建新连接,而是重用现有连接。当您遍历profileID集合时,您应该看到hubConnection.ConnectionID保持不变。为了创建新连接,您需要在foreach循环中创建一个HubConnection实例。

        int successfulConnections = 0;
        const int loopId = 10;

        Console.WriteLine("Starting...");
        for (int i = 1; i <= loopId; i++)
        {
            Console.WriteLine("loop " + i);

            var hubConnection = new HubConnection(HUB_URL);
            IHubProxy chatHub = hubConnection.CreateProxy(HUB_NAME);

            Console.WriteLine("Starting connection");
            hubConnection.Start().Wait();
            Console.WriteLine("Connection started: " + hubConnection.ConnectionId);

            chatHub.Invoke("Register", "testroom").ContinueWith(task2 =>
            {
                if (task2.IsFaulted)
                {
                    Console.WriteLine(String.Format("An error occurred during the method call {0}", task2.Exception.GetBaseException()));
                }
                else
                {
                    Console.WriteLine("Connected: " + hubConnection.ConnectionId);
                    successfulConnections++;
                }
            });

            Thread.Sleep(1000);
        }

答案 2 :(得分:3)

Crank只能测试PersistenConnections,但由于您希望测试SignalR Hub本身,您可以使用 Tresi 。这是一个商业应用程序。以下是有关如何针对不同类型的负载执行性能测试的一些链接

  1. Constant Load
  2. Gradually Incrementing Load
  3. Burst Load
  4. 在执行负载测试期间,会显示HTTPWebRequests的性能计数器设置,例如 Created / Sec Aborted / Sec,Average Lifetime 等。它还显示其他计算的指标,例如吞吐量/用户下面显示的是应用程序的屏幕截图

    enter image description here

答案 3 :(得分:1)

我没有对SignalR进行过多次性能测试,但该项目提供了一个有用的工具 - Crank - 用于生成客户端负载。

项目维基也有一些关于有用的performance counters and settings

的指导

答案 4 :(得分:1)

使用Gatling工具创建自己的脚本以进行虚拟用户创建(多线程)并使用java signalr client。 如果您想知道如何将用java或scala编写的自定义脚本附加到gatling虚拟用户,请在注释中注明。 告诉我你是否想要进行信号器性能测试的测试计划,因为它是进行测试的关键点。