我想知道一些用于测试基于 SignalR 集线器的应用程序的不同方法。
5 回答
简而言之,如果使用 Hubs,使用 .Net 客户端就足够了。
就我而言,我有一个新闻源中心,它根据用户的个人资料 ID 提供客户特定的数据。在我的测试案例中,我加载了一堆配置文件 ID(在本例中为 6000 个),调用了一个名为 JoinNewsfeed() 的集线器方法以及特定于客户端的连接 ID 和配置文件 ID。每 100 毫秒建立一个新连接。
[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);
}
此处列出的性能指标可以在服务器上解决问题。为了确保客户端实际上已连接并且在服务器上填充客户端对象的过程已成功完成,我有一个服务器端方法,该方法调用客户端函数,其中连接客户端的数量和列表来自连接的客户端收藏。
@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);
}
我没有对 SignalR 做太多的性能测试,但该项目提供了一个有用的工具 - Crank - 用于生成客户端负载。
项目 wiki 也有一些关于有用的性能计数器和设置的指导
使用 Gatling 工具创建自己的脚本以创建虚拟用户(多线程)并使用 java signalr 客户端。如果您想知道如何将用 java 或 scala 编写的自定义脚本附加到 gatling 虚拟用户,请在评论中指定。告诉我您是否需要信号器性能测试的测试计划,因为它是进行测试的关键点。