QTP——从GC的角度来看,将WPF对象设置为none是否有任何关联?



我有一个长期运行的QTP测试,它在我的WPF应用程序上做了一堆UI操作。我通过显式调用WPF对象开始创建脚本。像这样:

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

我想知道我是否应该把这个改成

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

版本(1)阻止GC,因为Qtp可能持有对对象的引用?版本(2)能避免这个问题吗?

更新:相同的长时间运行脚本似乎在UFT 11.53中更好地释放内存或处理内存引用。我之前用的是Qtp11

这里有两个项目在起作用…在版本1中,您引用的是QTP用于回放的基于wpf的对象的测试对象引用。在版本2中,你仍然有那些,但是你已经添加了引用那些测试对象的局部变量。

QTP/UFT的架构是这样的:当您像在版本1中那样引用一个测试对象时,它将实际执行一个新的查找。考虑一下,例如,你有一个额外的按钮点击,但它是同一个按钮在一行中被点击两次:

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

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

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

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

现在缓存了对第一个"OK"按钮执行的查找。如果第一次单击该按钮会导致UI更改,那么第二次单击可能会导致问题,而无需刷新测试对象(这会导致它重新识别对象)。

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

最新更新