SignalRハブベースのアプリケーションをテストするために使用されてきたさまざまな方法のいくつかを知りたいです。
5 に答える
つまり、ハブを使用する場合は、.Netクライアントを使用するだけで十分です。
私の場合、ユーザーのプロファイルIDに基づいてクライアント固有のデータを提供するニュースフィードハブがあります。私のテストケースでは、一連のプロファイルID(この場合は6000)をロードし、JoinNewsfeed()というハブメソッドをクライアント固有の接続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);
}
ここにリストされているパフォーマンスメトリックは、サーバー上でうまく機能します。クライアントが実際に接続され、サーバーにクライアントオブジェクトを入力するプロセスが正常に完了したことを確認するために、接続されたクライアントから派生した接続されたクライアントの数とリストを使用してクライアント側関数を呼び出すサーバー側メソッドがあります。コレクション。
@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);
}
CrankはPersistenConnectionsのみをテストできますが、SignalR Hub自体をテストすることを検討しているため、Tresiを使用できます。ただし、これは商用アプリケーションです。さまざまなタイプの負荷に対してパフォーマンステストを実行する方法に関するリンクを次に示します。
負荷テストの実行中に、Created / Sec、Aborted / Sec 、 AverageLifetimeなどのHTTPWebRequestsのパフォーマンスカウンター設定が表示されます。また、スループット/ユーザーなどの他の計算されたメトリックも表示されます。以下に示すのは、アプリケーションのスクリーンショットです。
私はSignalRで多くのパフォーマンステストを行っていませんが、プロジェクトはクライアントの負荷を生成するための便利なツールであるクランクを提供します。
プロジェクトウィキには、便利なパフォーマンスカウンターと設定に関するガイダンスもあります。
仮想ユーザー作成(マルチスレッド)用のガトリングツールを使用して独自のスクリプトを作成し、JavaSignalrクライアントを使用します。Javaまたはscalaで記述されたカスタムスクリプトをガトリング仮想ユーザーにアタッチする方法を知りたい場合は、コメントで指定してください。テストを実施する上で重要なポイントである、Signalerパフォーマンステストのテスト計画が必要かどうかを教えてください。