使用集线器对广播消息进行信号规模测试

本文关键字:信号 测试 消息 集线器 广播 | 更新日期: 2023-09-27 18:16:19

我有一个非常简单的基于signalr Hub的应用程序,基本上每次周期性地向大约1000个客户端发送一种单一类型的消息。

我希望能够测试1000个web浏览器可以在可重复的负载测试环境中连接并接收来自集线器的消息。

我已经看到signalr文档展示了如何使用Crank工具进行负载测试。但这有一个限制,即不能测试集线器类型的部署,这是没有帮助的。

有没有人知道如何创建集线器和客户端实例,并测试X个客户端都在特定时间范围内收到消息?

使用集线器对广播消息进行信号规模测试

根据zaitsman的评论,我编写了以下代码,希望得到您的反馈?

[TestClass]
public class SignalRConnectionTest
{
    static AutoResetEvent _autoEvent = new AutoResetEvent(false);
    private const string HUB_URL = "http://mysite/signalr";
    private const string HUB_NAME = "chatHub";
    private static Dictionary<int, bool> _clientResponsesRecieved = new Dictionary<int, bool>();
    private static object lockObject = new object();
    [TestMethod]
    public void TestJoinHub()
    {
        const int numberOfClients = 10;
        var manualEvents = new ManualResetEvent[numberOfClients];
        for (int i = 0; i < numberOfClients; i++)
        {
            manualEvents[i] = new ManualResetEvent(false);
            var stateInfo = new State(manualEvents[i], i);
            ThreadPool.QueueUserWorkItem(ConnectToSignalRAndWaitForMessage, stateInfo);
        }
        foreach (var manualResetEvent in manualEvents)
            manualResetEvent.WaitOne();
        Assert.AreEqual(_clientResponsesRecieved.Count, numberOfClients);
        foreach (var key in _clientResponsesRecieved.Keys)
        {
            Assert.IsTrue(_clientResponsesRecieved[key]);
        }
    }
    class State
    {
        public int threadId = 0;
        public ManualResetEvent manualEvent;
        public State(ManualResetEvent manualEvent, int threadId)
        {
            this.manualEvent = manualEvent;
            this.threadId = threadId;
        }
    }
    private void ConnectToSignalRAndWaitForMessage(object state)
    {
        var stateInfo = (State) state;
        var hubConnection = new HubConnection(HUB_URL);
        var chatHub = hubConnection.CreateHubProxy(HUB_NAME);
        Console.WriteLine("Starting connection");
        hubConnection.Start().Wait();
        chatHub.On<string, string>("broadcastMessage", (username, message) =>
        {
            Console.WriteLine("Message Recieved: {0}", message);
            lock (lockObject)
            {
                _clientResponsesRecieved.Add(stateInfo.threadId, true);
            }
            stateInfo.manualEvent.Set();
        });
    }
}