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

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

作者: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的信息写入环境变量,并使其停止于断点

谁说QTP不能多线程 - 当Python遇上QTP_第1张图片

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

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

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. 分别执行两个函数,测试其脚本是否正确

谁说QTP不能多线程 - 当Python遇上QTP_第2张图片

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

尝试一完成!


尝试二

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

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()

测试成功,下面是截图:

谁说QTP不能多线程 - 当Python遇上QTP_第3张图片


测试成功,皆大欢喜!

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

你可能感兴趣的:(thread,多线程,python,Google,脚本,Yahoo)