Вызов функции .Net на тестовом экземпляре пользовательского интерфейса в TestComplete - PullRequest
2 голосов
/ 17 февраля 2012

У меня есть простое приложение wpf, которое имеет кнопку, которая увеличивает значение при нажатии.У меня также есть функция, которая возвращает последнее значение.Значение по умолчанию - 5. У меня также есть тест пользовательского интерфейса в testcomplete, который нажимает кнопку 3 раза (т. Е. 8).Мне нужно вызвать функцию .Net, чтобы получить это значение и утвердить его.Ниже приведен мой тестовый код.

После некоторого поиска я выяснил детали CLRbridge и реализовал его.Однако, как вы можете видеть ниже, экземпляр теста пользовательского интерфейса и экземпляр, на котором я выполняю функцию, различаются.Итак, функция возвращает 5.

Мой вопрос: как вызвать функцию из того же экземпляра, который загружен testcomplete?Или я иду совсем не по этому пути?Я пробовал и скрипт и тестирование интерфейса с if..then, ничего не получалосьЯ пробовал как прямой экземпляр, так и вызов на домене приложения, оба, похоже, не работают.

ПРИМЕЧАНИЕ: Я понимаю, что могу отобразить значение в элементе управления 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();
}

1 Ответ

3 голосов
/ 19 февраля 2012

Должно быть возможно сделать то, что вам нужно, из TestComplete.Но прежде всего, чтобы избежать недоразумений, позвольте мне объяснить проблемы с использованными вами подходами:

  1. Обращение к классу через объект "dotNET".Когда вы делаете это, TestComplete инициализирует .NET в своем сервисном процессе, загружает в него указанную сборку и работает с классами этой сборки, загруженными в AppDomain TestComplete (хотя и находится в отдельном процессе).Это означает, что данный экземпляр вашей сборки не имеет ничего общего с вашим протестированным приложением.Таким образом, вы не можете получить доступ к данным вашего приложения через объект dotNET.

  2. Обращение к сборке Incrementer через AppDomain протестированного приложения.Хорошо, в этом случае вы ближе к решению - вы работаете с AppDomain тестируемого приложения, поэтому вы можете получить доступ к данным приложения.Однако в своем коде вы создаете новый экземпляр класса Incr1 (с помощью вызова zctor).Это означает, что новый экземпляр класса будет инициализировать свой счетчик в конструкторе, и он будет равен 5. И это значение, которое вы получаете в своем коде.

Итак,правильный подход:

Если поле счетчика класса Incr1, содержащее текущее значение счетчика, не является статическим полем, вам необходимо обратиться к существующему объекту класса Incr1, чтобы получить текущее значение свойства, а не создавать новый экземпляр класса.Реальная реализация будет зависеть от того, где вы храните ссылку на экземпляр класса Incr1 в вашем приложении.Предположим, вы сохранили ссылку в свойстве Counter объекта 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();

В описанном случае вы сможете получить текущее значение счетчика в вашем скрипте TestComplete следующим образом:

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

Если ваша установка отличается, пожалуйста, опишите ее - я постараюсь помочь соответственно.

...