データ主導のファッションで多くのユーザーをシミュレートするためのVisual Studio Load Test
質問
Webサービスをテストしようとしています。
Webサービスに送信された2つのParamsを取得し、その応答を返し、このメソッドからの単体テストを作成しました。
必要なさまざまな入力をテストするために、サービスを効果的にテストするために、~1000行のCSVを単体テストのデータソースとして設定します。
この1つのユニットテストを実行することができ、それはすべての行をスピンし、順次Webサービスを異なる値で呼び出します。
しかし、これは私が必要とするものではありません。 i 必要とされる各行は、スレッドの異なるスレッド上の異なるユーザーに対応し、Think Testの設定を使用して、ステップロード、Test Mix Configなどを使用してユーザーをランプアップユーザーのランプアップ
私はこれを達成することができます。 の単位テストとハードコーディング値からデータソースを削除することで実現できますが、これは基本的に欠陥のあるテストです。 の本当に Webサービスをテストし、それぞれの user が異なる値を送信し、異なる結果を得る必要があります。
...
SO、データソースをロードテストにフックする方法、そのロードテストは各ユーザーの各ユーザーのインスタンスを異なる値で開始しますか?
解決
私はこの答えを使ってガイドとして終わった: https://stackoverflow.com/a/a/7813465/237723
コンソールアプリケーションメソッドからユニットテストを作成し、テストをロードするのではなく、入力を取ってWebサービスを呼び出した単純なASP.NET Webフォームを作成しました。
この新しいフォームを使用してWebパフォーマンステストを記録し、そのWPTESTを実行するためのロードテストを作成しました。
-
テストを記録した後、このテストにCSVをデータソースとして追加しました。
-
は2 '要求が記録されていました:最初のGet&その後の投稿。 両方をのままにしておくことを確認してください。存在しなかったため、favicon.icoリクエストを削除しました。 (これらの注意は避けられない可能性があります)
POSTリクエストを拡大することで、CSVの適切な列からの値を取得するために、2つのWebサービス入力に対応するテキストボックスパラメータのプロパティを修正しました。
データソースアクセス方式を「自動的に移動しない」(データソースをテーブルに展開し、右クリック/ F4で編集する必要があります。)
iは、userID(int)に従ってカーソルを手動で移動させるWebTestplugin(リンク回答から)を作成しました。これは、ステップ計画に従ってロードテストが起動するユーザーインスタンスに対応します。このクラスを作成したら、プロジェクトを作成してからWebパフォーマンステストに追加します。
public class webtestplugin : WebTestPlugin
{
public override void PreWebTest(object sender, PreWebTestEventArgs e)
{
base.PreWebTest(sender, e);
e.WebTest.MoveDataTableCursor("DataSource1", "addresses#csv", e.WebTest.Context.WebTestUserId);
}
}
. 他のヒント
あなたの質問に答えるために、私はこれがMSTestとNUnitの箱から出すことができないことを確信しています(このアプローチこのシナリオにはスティックしません)。
しかし、imho、ちょうどそこに行かないでください...私の経験から、〜1000人のユーザーをシミュレートすると、テストはあらゆる種類のクライアントに遭遇するため、悪い結果を生成します。限界 - スレッドプールの問題、発信および着信トラフィックの問題などはこれを克服できないと言わないが、異なるアプローチを考慮するのに十分なねじれている。
私は実際には、あなた自身の小さな道具を書いて、そして3番目の構造の問題と学習曲線をスキップするのに十分なほど単純であるので、私は実際にはそれ以上の多くのものがありません)パーティー。
私が推薦するのは、あなた自身のツールを書いていて、それを分離機械から走らせています。テストフレームワークによって実行する必要はありません(私はそれが単体テストを呼び出すことができません)、コンソールアプリはトリックを実行するでしょう。これはあなたが始めるためのいくつかのコードです:
private ConcurrentBag<string> logs = new ConcurrentBag<string>();
public void GetLoad(int numberOfUsers, List<string> myParams)
{
var users = new string[numberOfUsers];
for (int i = 0; i < numberOfUsers; i++)
{
users[i] = string.Format("LoadTest{0}", i + 1);
}
var userThreads = new List<Thread>();
for (int i = 0; i < numberOfUsers; i++)
{
int index = i;
userThreads.Add(new Thread(()=> CallWebService(users[index], myParams[index])));
}
Parallel.ForEach(userThreads, thread=>thread.Start());
foreach (var userThread in userThreads)
{
userThread.Join();
}
var outputFilename = string.Format("LoadTest.{0}Users.txt", numberOfUsers);
File.AppendAllLines(outputFilename, logs);
}
.