最も簡単な方法は、OP の元のアプローチです。1 つは、何らかの理由で TestContext.BeginTimer(string); ということです。常に存在するとは限りません。証拠についてはこれを参照してください。ただし、解決策はないようです。しかし、プロパティを誤って作成および使用するという別の問題があります。
- 保存するプロパティがなく、
TestContext
使用しようとするTestContext.BeginTimer();
と、メッセージが表示されます"Cannot Access Non-Static Method 'BeginTimer' in a static context"
。一部の人々がこれを行う理由は、ほとんどの例が TestContext プロパティを `TestContext TestContext;' として持っているためです。例でこれを使用する理由については、3 を参照してください。
TestContext
たとえば、プロパティを割り当てたり、正しくないものを取得しClassInitialize
たりAssemblyInitialize
すると、テスト コンテキストの 1 つのインスタンスが取得されます。これは、以前は単体テストとコード化された UI テストでは問題がありませんでしたが、負荷テストは問題ありませんでした。これを処理しないでください。これを行うと表示されるのはエラー"There is already an active timer with the name 'TimerName' passed to BeginTimer"
です。
したがって、最終的な解決策として、必ず TestContext を完全なプロパティとして設定してください。これを行うと、負荷テストの実行ごとにテスト実行エンジンによってプロパティが個別に設定されます。これは、自分で値を設定する必要がないことを意味します。
したがって、次のようなものが必要です。
private TestContext m_testContext;
public TestContext TestContext
{
get { return m_testContext; }
set { m_testContext = value; }
}
セッターにブレークポイントを置くと、Class Initialize の後TestInitialize
、'TestContext セッター' が呼び出されて値が から割り当てられる前に表示されUnitTestExecuter.SetTestContext()
ます。これで、テストは、実行しようとしていたとおりに正確に維持されます
public void TestMethod1()
{
TestContext.BeginTimer("Overall");
for (int i = 0; i < 5; i++)
{
TestContext.BeginTimer("Per");
doAction();
TestContext.EndTimer("Per");
Sleep(1000);
}
TestContext.EndTimer("Overall");
}
ロード テストの結果を見ると、[シナリオ] > [TestCaseName] > [Transactions] > [TimerName] の下にタイマーの出力が表示されます。
タイマー Cache、Create-、Login を使用した出力は次のようになります。
を含む
- 平均 反応時間
- 平均 取引時間
- 総取引数
- トランザクション/秒
これらはすべて、グラフで表示できます。
OPの例では、10人のユーザーがそれぞれ1回テストを実行して負荷テストを実行し、DoWorkに0秒かかった場合、次のように表示されます。
- 合計10回のテスト
- それぞれ 5 秒の「全体」の 10 個の値、
- それぞれ 0 秒の「Per」の 50 個の値。
これは意図した結果だと思います。
これらの問題を理解するのに数時間かかり、いくつかのテストの後、正確に特定して検証しましたが、最終的にはこれが最も簡単で最良の解決策のようです.
補足として、これは、各テストがコンテキストから正しいデータを取得できるため、データ駆動型テストを適切に機能させるための TestContext の正しい実装です。