1

I have a long running QTP test which does a bunch of UI actions on my WPF application. I started off creating the script by explicitly invoking the WPF objects. Like so:

WpfWindow("").WpfButton.Click
WpfWindow("").WpfList.Select 1

I wanted to know if I should change this to

Set myWindow = WpfWindow("")
myWindow.WpfButton.Click
myWindow.WpfList.Select 1
Set myWindow = NOTHING

Does version (1) prevent GC because Qtp may be holding references to the objects? Does version (2) avoid that problem?

Update: The same long running script seems to release memory or handle memory references better in UFT 11.53. I was using Qtp11 before.

4

1 回答 1

0

您在这里有两个项目...在版本 1 中,您指的是 QTP 用于播放的基于 WPF 的对象的测试对象引用。在版本 2 中,您仍然拥有这些,但您添加了现在引用这些测试对象的局部变量。

QTP/UFT 的架构方式是,当您像在版本 1 中那样引用测试对象时,它实际上会执行新的查找。例如,假设您有一个额外的按钮单击,但它是同一个按钮连续单击两次:

WpfWindow("MyWindow").WpfButton("OK").Click
WpfWindow("MyWindow").WpfButton("OK").Click

这可能看起来像您连续两次按下相同的 UI 元素,但这并不确定。第一次单击“确定”后,UI 可能会显示一个不同的窗口,该窗口也具有具有相同标识属性的“确定”按钮。在这种情况下,第二次单击操作将识别并单击新的“确定”按钮。

在您的代码版本 2 中,您已更改此行为,因为您开始缓存对象引用。这可能是好是坏。如果您知道对象不会在屏幕上发生变化,那很好。如果元素更改并且您已经缓存了它,您将遇到问题。因此,如果将上述逻辑调整为:

Set btn = WpfWindow("MyWindow").WpfButton("OK")
btn.Click
btn.Click
Set btn = Nothing

您现在正在缓存为第一个“确定”按钮执行的查找。如果第一次单击该按钮会导致 UI 发生变化,那么第二次单击可能会导致问题,而无需刷新测试对象(这会导致它重新识别对象)。

所以回到你原来的问题,QTP/UFT 不应该创建对你的 UI 对象的引用,这会阻止垃圾收集。如果您像在版本 2 中那样缓存测试对象,则应始终在完成后将其设置为 Nothing。这普遍适用于 VBScript 中所有基于对象的变量赋值。当变量超出范围时,脚本引擎应该清除内存,但最好是强制它以防万一。

于 2014-06-19T13:04:05.677 回答