51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 2567|回复: 5
打印 上一主题 下一主题

[原创] 谁说QTP不能多线程 - 当Python遇上QTP

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2011-10-17 13:35:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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()  


测试成功,下面是截图:

测试成功,皆大欢喜!

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
发表于 2011-10-17 13:51:27 | 只看该作者
不错~~~我来顶你啦
回复 支持 反对

使用道具 举报

该用户从未签到

3#
 楼主| 发表于 2011-10-17 14:06:18 | 只看该作者
不错~~~我来顶你啦
zzxxbb112 发表于 2011-10-17 13:51

哈哈,多谢赵兄
回复 支持 反对

使用道具 举报

该用户从未签到

4#
发表于 2011-10-17 14:11:42 | 只看该作者
准备入手And I thought I knew QTP吗?
回复 支持 反对

使用道具 举报

该用户从未签到

5#
 楼主| 发表于 2011-10-17 14:49:08 | 只看该作者
回复 4# zzxxbb112
    Tarun已经寄给我了,呵呵,应该在路上,收到后会秀一下的
回复 支持 反对

使用道具 举报

  • TA的每日心情
    奋斗
    2015-10-6 11:29
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]测试小兵

    6#
    发表于 2012-9-18 10:56:58 | 只看该作者
    想法很不错啊,很有研究价值。坐等楼主出新内容。
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-17 00:51 , Processed in 0.068036 second(s), 30 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表