1

コード化された UI テストで遊んでいて、calc.exe アプリケーションのテストをいくつか書いています。ClassInitialize を使用してアプリケーションを開こうとしているので、各テストが毎回アプリケーションを開いたり閉じたりするのではなく、アプリケーションを開いたまますべてのテストを実行できます。

Google 検索でこれを見つけました: http://www.codesmartnothard.com/CommentView,guid,f28e6205-1ac5-41f3-be0d-f84d7db5c79b.aspxしかし、役に立ちません。これが実際に機能するのに必要なすべてだったら、それは素晴らしいことです. ClassInitialize関数が実行され、アプリケーションが開き、最初のテストが実行される前にすぐに閉じるので、テストを実行すると、アプリケーションは開かれなくなり、しばらく何も起こらないと必然的に失敗します.

ClassInitialize を使用してアプリケーションを開き、テストを実際に実行するためにそれを開いたままにしておくにはどうすればよいですか?

次のコードがある場合、テストが実行されます。

[CodedUITest]
public class CodedUITest1
{

  [TestMethod]
  public void CodedUITestMethod1()
  {
    UIMap.OpenCalc(); //Opens calc.exe
    UIMap.Click1(); //Clicks the "1" button
    UIMap.CloseCalc(); //Closes application
  }

  public TestContext TestContext
  {
    get
    {
      return testContextInstance;
    }
    set
    {
      testContextInstance = value;
    }
  }
  private TestContext testContextInstance;

  public static UIMap UIMap
  {
    get
    {
      if ((map == null))
      {
        map = new UIMap();
      }

      return map;
    }
  }

  private static UIMap map;
}

ただし、この ClassInitialize メソッドを追加し、TestMethod で OpenCalc への呼び出しを削除すると、機能しなくなります。電卓が開き、何らかの理由ですぐに閉じます。

[ClassInitialize]
public static void ClassInit(TestContext context)
{
  Playback.Initialize();
  try
  {
    UIMap.OpenCalc();
  }
  finally
  {
    Playback.Cleanup();
  }
}
4

3 に答える 3

2

ClassInitilize はそのように非常に面倒です。基本的にコンストラクターのように使用して、テストの開始時にいくつかの変数を宣言します。あなたがやろうとしていることを行うためのより良い方法はたくさんありますが。

私があなたなら、複数の [TestMethods] を作成し、orderedTest ファイルを作成してから、次のように希望する順序を指定します (つまり、最初に openCalc() メソッドを配置します)。

[TestMethod]
  public void OpenCalc()
  {
      UIMap.OpenCalc(); //Opens calc.exe
  }


[TestMethod]
  public void CodedUITestMethod1()
  {
      UIMap.Click1(); //Clicks the "1" button
      UIMap.CloseCalc(); //Closes application
  }

プロジェクトを右クリックし、新しいアイテム、orderedTest をクリックします。次に、テスト メソッドを必要な順序で配置できます。openCalc() メソッドを実行すると、残りのテストのために開いたままにする必要があります。

次に、基本的にテスト エクスプローラーで、テスト メソッドの代わりに、順序付けられたテスト ファイルを実行するだけです。

于 2013-07-23T08:28:51.197 に答える
1

[ClassInitialize] は、テストが実行される前に 1 回呼び出されます。[ClassInitialize] メソッドが実行される (または実行される) 前に呼び出される [AssemblyInitialize] もあります。UIMap mapフィールドは通常、クラスの static ではなく、クラス インスタンスのメンバーであるため、[ClassInitialize] メソッドはそれにアクセスできません。コードUIMap mapが静的であると宣言しているため、多くのテスト ケースで問題が発生する可能性があります。

すべてのテスト ケースで使用できるように、テストを実行する前にアプリケーションを起動する必要がありました。この.testsettingsファイルにより、起動スクリプトとクリーンアップ スクリプトを指定できます。このようなスクリプトでアプリケーションを起動することがあります。ファイルを作成する.testsettingsには、ソリューション エクスプローラーでソリューションを右クリックし、[追加] => [新しい項目] を選択します。.testsettingsまた、 Menu => Test からファイルを選択する必要があります。

于 2013-07-23T09:56:39.137 に答える