2

クリックすると値が増加するボタンを持つ単純な wpf アプリがあります。最新の値を返す関数もあります。デフォルト値は 5 です。testcomplete には、ボタンを 3 回 (つまり 8 回) クリックする UI テストもあります。この値を取得してアサートするには、.Net 関数を呼び出す必要があります。以下は私のテストコードです。

いくつかの検索の後、CLRbridge の詳細を把握し、実装しました。ただし、以下に示すように、UI テスト インスタンスと関数を呼び出しているインスタンスは異なります。したがって、関数は 5 を返します。

私の質問は、testcomplete によってロードされた同じインスタンスから関数を呼び出すにはどうすればよいかということです。それとも、私はこれに対して完全に間違った方向に進んでいますか? if..then を使用してスクリプトと UI テストの両方を試しましたが、何も機能しませんでした。直接インスタンスとアプリドメインでの呼び出しの両方を試しましたが、どちらも機能していないようです。

注: UI コントロールに値を表示し、コントロールを検証できることは理解しています。ただし、プロジェクトで必要なより複雑なテスト機能のために、これを具体的に試しています。

function Test2()
{
  var Increment;
  Increment = 0;
  //Runs the "TCompTest" tested application.
  TestedApps.TCompTest.Run();
  //Clicks the 'button1' button.
  Aliases.TCompTest.HwndSource_MainWindow.MainWindow.Grid.button1.ClickButton();
  //Clicks the 'button1' button.
  Aliases.TCompTest.HwndSource_MainWindow.MainWindow.Grid.button1.ClickButton();
  //Clicks the 'button1' button.
  Aliases.TCompTest.HwndSource_MainWindow.MainWindow.Grid.button1.ClickButton();
  //Increment = dotNET.Incrementer.Incr1.zctor().IntValue(true);

Increment = dotNET.Incrementer.Incr1.zctor().IntValue(true);

**OR**

 Increment = Sys.Process("TCompTest").AppDomain("TCompTest.exe").dotNET.Incrementer.Incr1.zctor().IntValue(true)

 // if(Increment == 8)
 // {//Posts an information message to the test log.
  Log.Message(Increment);
//  }
  //Closes the 'HwndSource_MainWindow' window.
  Aliases.TCompTest.HwndSource_MainWindow.Close();
}
4

1 に答える 1

3

TestCompleteから必要なことを実行できるはずです。しかし、まず、誤解を避けるために、あなたが試したアプローチの問題について説明しましょう。

  1. 「dotNET」オブジェクトを介したクラスのアドレス指定。これを行うと、TestCompleteはサービスプロセスで.NETを初期化し、指定されたアセンブリをロードし、TestCompleteのAppDomainにロードされたこのアセンブリのクラスを操作します(ただし、別のプロセスに存在します)。これは、アセンブリのこのインスタンスが、テストされたアプリケーションとは何の関係もないことを意味します。そのため、dotNETオブジェクトを介してアプリケーションのデータにアクセスすることはできません。

  2. テストされたアプリケーションのAppDomainを介してインクリメントアセンブリをアドレス指定します。OK、この場合、あなたは解決策に近づいています-あなたはテストされたアプリケーションのAppDomainで作業するので、アプリケーションのデータにアクセスすることができます。ただし、コードでは、(zctorの呼び出しを介して)Incr1クラスの新しいインスタンスを作成します。これは、新しいクラスインスタンスがコンストラクターでそのカウンターを初期化し、5になることを意味します。これは、コードで取得する値です。

したがって、正しいアプローチ:

現在のカウンター値を含むIncr1クラスのカウンターフィールドが静的フィールドでない限り、新しいクラスインスタンスを作成するのではなく、プロパティの現在の値を取得するためにIncr1クラスの既存のオブジェクトをアドレス指定する必要があります。実際の実装は、アプリケーションのIncr1クラスインスタンス参照をどこに保存しているかによって異なります。MainWindowオブジェクトのCounterプロパティに参照を格納するとします。

// Creating an instance of the class somewhere in your code
MainWindow.Counter = new Incr1();

// ...    

// And this line of code is in the button click handler
MainWindow.Counter.Increment();

説明されているケースでは、次のようにTestCompleteスクリプトで現在のカウンター値を取得できます。

  var MainWnd = Aliases.TCompTest.HwndSource_MainWindow.MainWindow;
  Log.Message(MainWnd.Counter.IntValue(true));

設定が異なる場合は、それを説明してください-それに応じて支援しようとします。

于 2012-02-19T06:49:17.323 に答える