yuandjing 发表于 2011-10-17 13:35:12

谁说QTP不能多线程 - 当Python遇上QTP

本帖最后由 yuandjing 于 2011-10-17 13:36 编辑

原文地址:http://blog.csdn.net/quicktest/article/details/6880881

作者:Wally Yu (微博:http://weibo.com/quicktest)

经常有人问我一个问题:QTP可以同时做多个项目的自动化吗?我每次都回答说“不行,QTP不支持多线程,VBS本身就不是一门多线程的语言!”

最近在反思...QTP真的不能多线程吗?

好吧...如果一定要QTP可以多线程,咋办?我硬是想出了两个办法:

1. 需要在Windows可以多个QTP进程 - 可以吗?不行!有木有办法?没办法...

2. 需要QTP弃用VBS作为其脚本语言,改用多线程语言作为脚本语言(如Java、Python...) - 可以吗?不行!有木有办法?没办法...

且慢,假设QTP采用支持多线程的脚本语言,如何实现多线程?对,可以这样实现:

Function testScenario_1()

...

End Function


Function testScrnario_2()

...

End Function

...


Threading (testScenario_1).start()

Threading (testScenario_1).start()

...

如上结构可以实现QTP的多线程测试,这样岂不是大大提高了QTP的执行效率了么

可是回到现实中来,QTP的脚本语言是VBS,如何才能实现以上的愿望呢?呵呵,何不用AOM + DP!!!

(注:AOM - Automation Object Model; DP - Descriptive Programming)

以下代码采用Python,借鉴了“假装不在”的思路,用了Google和Yahoo搜索作为测试实例:

尝试一:

1. 打开两个IE,分别打开Google和Yahoo的首页

2. 将其Browser和Page的信息写入环境变量,并使其停止于断点

3. 打开Python编辑器,首先先把测试代码写入分别的Python函数:

注:函数首先调用QTP的AOM,而后取出环境变量的值,接着加上DP完成一条完整的测试语句

view plain

    import thread, win32com.client
    from time import ctime
      
    def TestGoogle():
      shellWnd1 = win32com.client.DispatchEx('QuickTest.Application')
      P = shellWnd1.Test.Environment("google")
      print P.GetROProperty('title')
      P.WebEdit("name:=q").Set("Mercer")
      P.WebButton("name:=Google Search").Click()
      
    def TestYahoo():
      shellWnd2 = win32com.client.DispatchEx('QuickTest.Application')
      Q = shellWnd2.Test.Environment("yahoo")
      print Q.GetROProperty("title")
      Q.WebEdit("html id:=p_13838465-p").Set("Mercer")
      Q.WebButton("html id:=search-submit").Click()
      
    def main():
      print 'Start at:', ctime()
      TestGoogle()
      TestYahoo()
         
      print 'End at:', ctime()
      
    if __name__ == '__main__':
      main()


4. 分别执行两个函数,测试其脚本是否正确


如上图,脚本被分别执行了,Python脚本正确无误,QTP也执行了相应的搜索操作

尝试一完成!


尝试二:

这次就要把脚本放入多线程里面去执行了,同样的操作,以下是Python代码:

view plain

    import threading
    import win32com.client
    import pythoncom
    from time import ctime
      
    class SearchTest(threading.Thread):
      def __init__(self, testObj):
            threading.Thread.__init__(self)
            self.testObj = testObj
            self.thread_stop = False
      
      def run(self):
            if not self.thread_stop:
                if self.testObj == "Google":
                  print 'Google test start at '+ ctime()+"\n"
                  pythoncom.CoInitialize()
                  shellWnd1 = win32com.client.DispatchEx('QuickTest.Application')
                  P = shellWnd1.Test.Environment("google")
                  P.WebEdit("name:=q").Set("Mercer")
                  P.WebButton("name:=Google Search").Click()
                  pythoncom.CoUninitialize()
                  print 'Google test finish at ' + ctime() + "\n"
                elif self.testObj == "Yahoo":
                  print 'Yahoo test start at '+ctime()+"\n"
                  pythoncom.CoInitialize()
                  shellWnd2 = win32com.client.DispatchEx('QuickTest.Application')
                  Q = shellWnd2.Test.Environment("yahoo")
                  Q.WebEdit("html id:=p_13838465-p").Set("Mercer")
                  Q.WebButton("html id:=search-submit").Click()
                  pythoncom.CoUninitialize()
                  print 'Yahoo test finish at ' + ctime() + "\n"
                else:
                  print "input para error"
      def stop(self):
            self.thread_stop = True
      
    def test():
      thread1 = SearchTest("Google")
      thread2 = SearchTest("Yahoo")
      thread1.start()
      thread2.start()
      #time.sleep(10)
      thread1.stop()
      thread2.stop()
      return
      
    if __name__ == '__main__':
      test()


测试成功,下面是截图:

测试成功,皆大欢喜!

注:目前本人还没有发现这样操作有什么特别的优势。说节省测试时间,但是这样会造成调试上的极大不便。本博权当开拓一下眼界,抛砖引玉,愿大家集思广益 :)

zzxxbb112 发表于 2011-10-17 13:51:27

不错~~~我来顶你啦

yuandjing 发表于 2011-10-17 14:06:18

不错~~~我来顶你啦
zzxxbb112 发表于 2011-10-17 13:51 http://bbs.51testing.com/images/common/back.gif
哈哈,多谢赵兄

zzxxbb112 发表于 2011-10-17 14:11:42

准备入手And I thought I knew QTP吗?

yuandjing 发表于 2011-10-17 14:49:08

回复 4# zzxxbb112
    Tarun已经寄给我了,呵呵,应该在路上,收到后会秀一下的 :)

zhangzhe 发表于 2012-9-18 10:56:58

想法很不错啊,很有研究价值。坐等楼主出新内容。
页: [1]
查看完整版本: 谁说QTP不能多线程 - 当Python遇上QTP