【QTP多线程篇】
【QTP多线程篇】作者:卢晨之 转载请注明本文主要研究QTP与Python结合,轻松实现GUI测试多线程,并创建一些简单但有效的模式,解决QTP多线程与并发的问题。
前言:
由于QTP 不能同时开多个前台程序,并且VBS脚本语言的局限性,导致了QTP在多线程与并发方面显得力不从心。而我们让QTP与Python结合的同时,我们也使用Python的Threading 模块,这样就让我们能很好的把多个不同的测试用例在同一台机器上跑动起来。本文未使用线程与堆栈结合的模式,而是使用简单的发送测试用例号的方法去触发进程,并且逐步优化我们的脚本。
了解QTP Automation object model
在上篇文章【互动QTP】 中提到的,我们能够使用QTP提供给我们的Automation Object Model的接口,我们使用Python去调用这个接口,并且让它与QTP实现“通讯”。让我们先了解下我们如何使用简单的代码片去调用这个接口。
GetTheQTPAutoModel.Py:
代码片中,我们先使用了win32com.client这个模块,接着使用DispathchEx获取到QTP这个进程,同时我们把这2个环境变量对象,分别是“baidu”和“sina”存储在一个数组中,最后打印出2环境变量的标题,而我们使用的是GetRoproperty的方法。
在运行这个代码片之前,我们需要让QTP把这2个对象存储进环境变量中,并且是处在运行的状态中。
QTP code
Python的输出结果:
___________________________________________________________________________________________________________________
在Python代码中使用QTP的描述性编程
由于我们通过win32com.client这个模块获取到了QTP的Automation接口,同样我们得到它的对象,并运行它的方法是要经过QTP做解析操作,所以,除了我们能通过使用环境变量传递过来的对象外,我们还能在python中使用QTP的描述编程,也因为这样,我们传递对象只需要传递一个父类对象即可,减少了在QTP“抛售”对象的操作。
PyDescription.py:
运行结果是:
___________________________________________________________________________________________________________________
使用Python的线程类结合QTP的自动化
正如我们前文讲到的,我们希望做的事情是不愿意只让一台电脑跑一套QTP的脚本,而这个时候,我们也因为有了Python的这个利器让我们梦想成真。它有多强大的?(小编个人被Python的代码书写深深吸引住,多么优美)首先我们先简单了解学习下Python的线程模块threading。
PythonThread.py:
运行结果:
在上面的例子中,我们新建了2个线程类,并初始化这个ThreadClass类,同时我们也传递了TestCase Number进去。所以在这个代码片的基础上,我们加进了上面的获取QTP的代码片,就可以简单的实现我们的多线程操作。
___________________________________________________________________________________________________________________
PythonTwoThread.py:(运行脚本前打开www.baidu.com www.sian.com.cn 2个网站)
上面代码片,主要是在当前百度和新浪2个页面上,对输入框输入+1操作。而在每个case里面,我们也都加进了对异常的捕获与判断。
但上面的脚本,我们需要注意的有几点:
1, Com对象必须在每条线程中重新定义一次,不然会出现对象已经被加载情况。
2, 在线程中,我们调用的Com对象时候,需要使用pythoncom模块中的pythoncom.CoInitialize()与pythoncom.CoUninitialize()方法,初始化你需要使用的Com套件,所以这样你才能在线程中操作Com对象。
如果这2点没加进入,在Python运行时候均会抛出异常。
___________________________________________________________________________________________________________________
让这线程跑得更快:
使用了上面代码跑脚本的时候,你会发现,怎么感觉Python在线程中对对象的操作有点“一瘸一拐”的样子,彼此很谦让,你加一,我加一?而且速度也非常慢。这个是什么原因呢?如果我们了解到里面的一个原理,你不难发现,我们的代码片是用了描述编程,也就是它的识别,是需要透过QTP去做操作的,而QTP的对象识别只能是一个一个的去识别,识别完再返回Com对象给Python做操作。了解到这点后,我们可以很轻松的解决这个问题。
CopyCom.py:
我们使用了Python的Copy模块来把这个Com对象复杂出来,这样就免去了经过QTP对象识别的一个过程,而直接对Com对象做操作。这时候你会发现,脚本跑起来2个页面的速度都非常快,不会出现“一瘸一拐”的情况。
___________________________________________________________________________________________________________________
总结:
本文主要研究了对QTP与python的线程结合,实现多线程操作的效果,并在文中提到了部分异常的处理办法。在文章最末的代码片演示了一个比较理想状态下的多线程操作,但您也可以研究得更为深入,添加更多的功能进去,让它更加完善。
最后,线程之间需要共享资源的时候,并且为了避免线程之间的混乱,我们可以使用队列来解决这个问题,它是在Python的queue模块,通过要往queue中获取或提交我们需要的信息来达到线程件的通讯和秩序。
希望这篇文章能给读者在工作中带来小小的帮助。(作者:卢晨之)
下载:
描述名字大小下载Get the QTP Automaitonal Model ObjectGetTheQTPAutoModel.Py1K Use the Description in the PythonPyDescription.py1KKonw something about the Python threadPythonThread.py1KThe QTP and Python 's ThreadPythonTwoThread.py2K
[ 本帖最后由 假装不在 于 2009-12-14 21:37 编辑 ] 得好好研究一下,不错
回复 1# 的帖子
你这研究方向错误了!UI Auto在同一台机器上多线程运行没有任何意义。
给你一个建议,用虚拟机。
[ 本帖最后由 shanxi 于 2009-12-15 10:17 编辑 ]
回复 3# 的帖子
在特定的场景下还是有点意义的 但好像不是经常能碰到这样的场景你说的虚拟机具体指啥?分布式执行引擎? 这多线程也太。。。了吧
呵呵,如LS所言,LZ可以看看Pyvix,这个是Python操作VIM的模块,不过没有持续更新,如果要想好用要自己封装一个模块了;
还要看下Pyro,对象的注册与远程调用 技术积累还有意义
界面自动化需要尽可能真实模拟用户操作 同一时刻 用户不会进行两种不同位置的界面操作
如果你的想法是进行 脚本的部署调度的话 楼上的说法好像可以借鉴一下但不同的场合 采取的方案不会通用。 我个人觉得qtp得异常处理不好用
我想是否可以用多线程来实现异常监控的功能
脚本运行过程中其中能有一个线程可以一直监控是否有异常的窗口出现,如果出现了就进行相应的处理
这样做的好处就是正常系和异常系可以分开了,异常系的判断都交给异常监控线程处理。
正常系的只管正常的业务逻辑处理 原帖由 shanxi 于 2009-12-15 09:43 发表 http://bbs.51testing.com/images/common/back.gif
你这研究方向错误了!
UI Auto在同一台机器上多线程运行没有任何意义。
给你一个建议,用虚拟机。
同意,楼主的技术确实很牛,但是QTP本身是不支持多线程的,而不是VBS语言的局限
一方面可以用虚拟机,一方面可以做自动化测试执行机集群或采取分布式策略 谁能解释下你们说的虚拟机大概的原理或流程 很好奇 原帖由 shanxi 于 2009-12-15 09:43 发表 http://bbs.51testing.com/images/common/back.gif
你这研究方向错误了!
UI Auto在同一台机器上多线程运行没有任何意义。
给你一个建议,用虚拟机。
谢谢指定。使用虚拟机要考虑到机器的性能还有一些技术性的东西。是个比较好的方向。
回复 5# 的帖子
非常不错的提议。哈哈。谢谢逍遥。 原帖由 shanxi 于 2009-12-15 11:41 发表 http://bbs.51testing.com/images/common/back.gif技术积累还有意义
界面自动化需要尽可能真实模拟用户操作 同一时刻 用户不会进行两种不同位置的界面操作
如果你的想法是进行 脚本的部署调度的话 楼上的说法好像可以借鉴一下但不同的场合 采取的方案不会通用 ...
::yiwusuoyou::: 有时候喜欢弄点技术的时候可能不会想哪么多实际应用。哈哈,这种场景确实是不会常遇见。 原帖由 lijinshui 于 2009-12-15 14:17 发表 http://bbs.51testing.com/images/common/back.gif
我个人觉得qtp得异常处理不好用
我想是否可以用多线程来实现异常监控的功能
脚本运行过程中其中能有一个线程可以一直监控是否有异常的窗口出现,如果出现了就进行相应的处理
这样做的好处就是正常系和异常系可以分 ...
恩。你说的使用线程来捕获异常也是不错的选择。除了QTP内置的场景恢复,我试过能否实现多线程,后来发现它的出发是有先后顺序的。
如果放在捕获异常或者其他处理方面,或者会有好的出路。
回复 8# 的帖子
VBS本身出了使用COM调用多线程外,或者更多意义上讲起来是模拟吧,排除硬件上的差异外。 ::yiwusuoyou:::白天上班公司51打不开,所以等到晚上才和大家讨论这些问题和建议。哈哈,多谢楼上们的建议和讨论。::yxiao:::
回复 10# 的帖子
搞了半天 原来是一台电脑上开多台虚拟机 :Q回复 16# 的帖子
你等shanxi回复你。我不敢确定。但虚拟机是个趋势,好好学习。以前弄过半个多月虚拟机,速度可能感觉有点跟不上,除非极其性能好。 QTP好像会把虚拟机和虚拟机里面运行的程序识别成一个整体(object),无法控制。我在XP上装了一个虚拟机来对一个机器进行控制(嵌入式),结果 不行:L
回复 18# 的帖子
虚拟机本身开放了二次开发借口,可以去查查,里面也有COM模式的接口VIX 控制虚拟机内的对象?这样貌似没有多大的意义。
页:
[1]
2