Question

J'ai une application simple WPF qui a un bouton qui incrémente une valeur en cliquant dessus. J'ai aussi une fonction qui renvoie la dernière valeur. La valeur par défaut est 5. J'ai aussi un test d'interface utilisateur dans TestComplete qui clique sur le bouton 3 fois (donc 8). Je dois appeler la fonction .Net pour obtenir cette valeur et l'affirmer. Ci-dessous mon code de test.

Après quelques recherches je me suis dit les détails de CLRbridge et implémenté. Cependant, Comme vous pouvez le voir ci-dessous, l'instance de test de l'interface utilisateur et l'instance sur laquelle je claling la fonction sont différentes. Ainsi, la fonction retourne 5.

Ma question est, comment puis-je appeler la fonction de la même instance chargée par TestComplete. Ou suis-je complètement la mauvaise façon pour cela? J'ai essayé deux scripts et tester l'interface utilisateur avec if..then, rien ne fonctionnait. Je l'ai essayé à la fois directe et par exemple appel à la appdomain, les deux semblent ne marche pas au travail.

Remarque: Je comprends que je peux afficher la valeur dans un contrôle de l'interface utilisateur et de valider le contrôle. Cependant, je suis en train spécifiquement ce pour une fonctionnalité de test plus complexe dont nous avons besoin d'un projet.

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();
}
Était-ce utile?

La solution

Il devrait être possible de faire ce que vous avez besoin de TestComplete. Mais tout d'abord, pour éviter tout malentendu, permettez-moi de vous expliquer les problèmes avec l'approche que vous avez essayé:

  1. Lors d'une classe à travers l'objet "dotNET". Lorsque vous faites cela, TestComplete .NET Initialise dans son processus de service, l'ensemble des charges spécifié, en et travaille avec les classes de ce chargés de l'assemblage AppDomain de TestComplete (bien que vivant dans un processus séparé). Cela signifie que cette instance de votre assemblée n'a rien à voir avec votre application testée. Donc, vous ne pouvez pas accéder aux données de votre application à travers l'objet DotNet.

  2. adressant à l'assemblée incrémenteur par AppDomain de l'application testée. OK, dans ce cas, vous êtes plus proche d'une solution - vous travaillez avec l'AppDomain de l'application testée, afin que vous puissiez accéder aux données de l'application. Cependant, dans votre code, vous créez une nouvelle instance de la classe Incr1 (via l'appel zctor). Cela signifie que la nouvelle instance de classe REINITIALISERA son compteur dans le constructeur, et il sera 5. Et cela est la valeur que vous obtenez dans votre code.

Alors, la bonne approche:

À moins que le contre-champ de la classe Incr1 contenant la valeur courante du compteur est un champ statique, vous devez répondre à un objet existant de la classe Incr1 pour obtenir la valeur actuelle de la propriété, de ne pas créer une nouvelle instance de classe. La mise en œuvre effective dépendra de l'endroit où vous stockez la référence d'instance de classe Incr1 dans votre application. Supposons que, vous stockez la référence dans la propriété de l'objet contre MainWindow:

// 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();

Dans le cas décrit, vous serez en mesure d'obtenir la valeur courante du compteur dans votre script TestComplete comme suit:

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

Si votre configuration est différente, s'il vous plaît décrire -. Je vais essayer d'aider en conséquence

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top