10

私の UnitTests のいくつかには、ループで定義された Sleep があります。非線形スケーリングを示すために、テストの各反復だけでなく、すべての反復の全体的な時間をプロファイリングしたいと考えています。たとえば、「全体」をプロファイリングすると、睡眠の時間が含まれます。StopwatchdoAction() のみが含まれるように Start/Stopを使用できます。ただし、Stopwatch の結果を TestContext の結果に書き込めません。

[TestMethod]
    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");
    }

TestContext を継承して再定義できるようです。ただし、これをトランザクション ストアに書き戻す方法の例はありません。

私が参照できるこれの実装、または別のアイデアはありますか。Visual Studio が LoadTest に対して提示するのと同じレポートで確認したいと思います。それ以外の場合は、私自身のレポートを作成する必要があります。

また、これらを LoadTest データベースに書き込む SQL をスニッフィングしようとしましたが、その方法を理解することに成功しませんでした。呼び出す SPROC があるはずですが、それはテスト終了時のすべてのデータであると考えています。

4

3 に答える 3

0

最も簡単な方法は、OP の元のアプローチです。1 つは、何らかの理由で TestContext.BeginTimer(string); ということです。常に存在するとは限りません。証拠についてはこれを参照してください。ただし、解決策はないようです。しかし、プロパティを誤って作成および使用するという別の問題があります。

  1. 保存するプロパティがなく、TestContext使用しようとするTestContext.BeginTimer();と、メッセージが表示されます"Cannot Access Non-Static Method 'BeginTimer' in a static context"。一部の人々がこれを行う理由は、ほとんどの例が TestContext プロパティを `TestContext TestContext;' として持っているためです。例でこれを使用する理由については、3 を参照してください。
  2. TestContextたとえば、プロパティを割り当てたり、正しくないものを取得しClassInitializeたりAssemblyInitializeすると、テスト コンテキストの 1 つのインスタンスが取得されます。これは、以前は単体テストとコード化された UI テストでは問題がありませんでしたが、負荷テストは問題ありませんでした。これを処理しないでください。これを行うと表示されるのはエラー"There is already an active timer with the name 'TimerName' passed to BeginTimer"です。

  3. したがって、最終的な解決策として、必ず 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 の正しい実装です。

于 2016-11-03T21:03:35.687 に答える