51Testing软件测试论坛

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

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 2656|回复: 3
打印 上一主题 下一主题

[讨论] QTP的核心工作原理以及代码的重用性

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2013-3-18 11:00:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
问题:
1、QTP的核心工作原理是什么?
2、ExtJs架构的软件是否可以实现代码的重用性?怎么才能增强代码的重用性?
3、QTP对象库里的对象有没有固定不变的值来区分?
十分需要这方面高手解答啊。大家都来讨论讨论吧。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
 楼主| 发表于 2013-3-18 14:00:10 | 只看该作者
本帖最后由 chenwubia0 于 2013-3-18 14:04 编辑

QTP工作原理
QTP的脚本运行其实就是一组对象有组织的执行自己的方法,最终完成一个流程的过程。当打开一个web时,想要脚本能够模拟人来操作整个流程,那多就要求这个脚本能够识别人的每一个操作,而人的操作实际上是对web页面上控件的操作,所以只要QTP的脚本能够识别人操作过的控件就可以模拟人的操作流程,而web页面上的控件都是QTP脚本中的对象,也就是说只有QTP脚本中的对象能够被唯一的识别出来,就可以模拟人的整个操作流程。而QTP又是如何识别对象的呢?

  对象识别原理就是获取hwnd,然后判断ui属性,逐个判断,然后逐层递归,最后获取每个对象的所有层面的属性,跟对象库里的属性进行比较,匹配则应用。也就是说在你添加一个对象到对象仓库中的时候,该对象的主要属性都被保存到对象库中了,回放QTP脚本的时候实际上就是在被测试软件中寻找指定的对象,然后按照这些对象指定的方法去完成一个动作,而这些方法就是把windows win32中、web上的一些activex控件中的方法和微软控件对外的接口中的一些方法进行封装,成为qtp自己的方法。对于任何一个add-in都是先找到人家的对外接口,然后拿过来封装,需要的时候去调用接口事件,也就成为了QTP的动作。

  所以QTP脚本回放实际上就是要做两个步骤:1)识别出要操作的对象控件。2)识别出对象控件后来完成该对象控件指定的方法。

  在QTP识别对象的时候是按照对象的唯一属性来区分的,有时候QTP对象仓库保存的对象属性是不完全的,导致两个很相似的对象不能够识别出来,这样脚本就会报错,或者说对象仓库中对象的属性每次都是变化的,那么每次回放脚本也会和对象仓库中保存的不一致导致脚本报错。这里介绍一个很好用的web对象的属性——object属性。

  QTP支持直接访问DOM,可以通过DOM来访问HTML标签。在QTP中,访问DOM是通过使用page测试对象的object属性来进一步访问的,这样就可以访问到很底层的对象属性,可以用底层的对象属性来唯一区分web页面上的对象控件,这样就能够解决一些关于对象识别的错误
==================================================================================================================================================
QTP的运行原理、对象识别机制

  作为一个QTP的使用者,首先要搞明白它的运行原理,识别对象的机制。这是以后掌握其他技术的根本,不管是录制方式还是手写代码这

个都是非常重要的。

  QTP是一款基于语言的工具,而LR是基于协议的。具体说,就是QTP针对不同的语言提供不同插件去识别对象,默认提供ActiveX、Visual

Basic、Web插件,其他.net、java插件单独安装。每一种插件提供了针对不同对象的识别机制,也就是提供了对象默认的识别属性。所以在运

行QTP前,首先确定加载哪个addin,否则对象就不能正确识别,出现很多奇怪的问题。不加载正确的addin,最直接就是表现在代码上。以下

是点击google主页上的搜索按钮的区别:

  加载web插件的正确代码:Browser("Google").Page("Google").WebButton("Google 搜索").Click

  不加载web插件:Window("Windows Internet Explorer").WinObject("Internet Explorer_Server").Click 547,217

  这是典型的对象没有正确识别的问题。包括对象类型、识别属性、事件方法都会出现问题,这样会导致脚本的开发,维护,运行,阅读等

等一系列问题。

  再说QTP的对象识别,加载正确addin后QTP会定义一套针对具体类型对象的默认识别属性。通过Tools--Object Identification可以查看

,修改,增加默认的识别属性。更改后即时生效,但对之前的对象不起作用。如下图,这里就是决定QTP如何识别对象的地方。包括识别对象

的强制属性、辅助属性、智能识别、顺序表示符的配置。特别指出,Browser对象有一个CreationTime顺序表示符,这是一个非常有用的属性

,它可以根据IE打开的顺序去识别web页,而不必指定其他属性,合理加以利用会给web脚本带来很大好处。
在录制的过程中,QTP会抓取对应属性的属性值,并映射到对象库(Object Repository)。脚本一旦开发完毕,这些对象及对应的属性均保持

不变,作为识别对象的基线。
回放过程中,运行时系统的对象称作RO(Run-time Object)。QTP以对象库中保存对象的属性及属性值为标准,去匹配运行时系统的对象,如

果匹配成功则正确识别对象并执行相应操作,否则会有提示信息。在对象库中也可以增加(加号)、删除(叉号)、修改属性及属性值。这是

对象库强大的一处体现。Value可以修改正则表达式,可以参数化。支持随机值,DataTable取值,环境变量取值,这就让对象识别变的很灵活

,甚至可以动态的去识别对象。
    关于另一个常用的就是描述性编程,这个概念是QTP独有的。通过这个机制,使对象识别更加灵活。在开发脚本过程中,可以不依赖默认

识别属性,通过指定对象的属性及相应的属性值去识别对象。这样可以使脚本脱离对象库,也就是不依赖于TO对象,省去维护对象库的步骤,

但原理还是一样的。灵活运用描述性编程可以使脚本的重用性、稳定性、维护以及脚本的开发变的简单,而且直观易于阅读,简化团队成员之

间的协作。但如果单纯的把录制的脚本改成描述性的,这样做不仅没有好处,还会给你的开发的工作量、脚本的维护带来很大的麻烦。如何灵

活使用描述性编程,这里不作详述,原则是使脚本开发过程简单,维护工作量最小
回复 支持 反对

使用道具 举报

该用户从未签到

3#
 楼主| 发表于 2013-3-18 14:03:21 | 只看该作者
QTP的运行原理、对象识别机制

  作为一个QTP的使用者,首先要搞明白它的运行原理,识别对象的机制。这是以后掌握其他技术的根本,不管是录制方式还是手写代码这

个都是非常重要的。

  QTP是一款基于语言的工具,而LR是基于协议的。具体说,就是QTP针对不同的语言提供不同插件去识别对象,默认提供ActiveX、Visual

Basic、Web插件,其他.net、java插件单独安装。每一种插件提供了针对不同对象的识别机制,也就是提供了对象默认的识别属性。所以在运

行QTP前,首先确定加载哪个addin,否则对象就不能正确识别,出现很多奇怪的问题。不加载正确的addin,最直接就是表现在代码上。以下

是点击google主页上的搜索按钮的区别:

  加载web插件的正确代码:Browser("Google").Page("Google").WebButton("Google 搜索").Click

  不加载web插件:Window("Windows Internet Explorer").WinObject("Internet Explorer_Server").Click 547,217

  这是典型的对象没有正确识别的问题。包括对象类型、识别属性、事件方法都会出现问题,这样会导致脚本的开发,维护,运行,阅读等

等一系列问题。

  再说QTP的对象识别,加载正确addin后QTP会定义一套针对具体类型对象的默认识别属性。通过Tools--Object Identification可以查看

,修改,增加默认的识别属性。更改后即时生效,但对之前的对象不起作用。如下图,这里就是决定QTP如何识别对象的地方。包括识别对象

的强制属性、辅助属性、智能识别、顺序表示符的配置。特别指出,Browser对象有一个CreationTime顺序表示符,这是一个非常有用的属性

,它可以根据IE打开的顺序去识别web页,而不必指定其他属性,合理加以利用会给web脚本带来很大好处。
在录制的过程中,QTP会抓取对应属性的属性值,并映射到对象库(Object Repository)。脚本一旦开发完毕,这些对象及对应的属性均保持

不变,作为识别对象的基线。
回放过程中,运行时系统的对象称作RO(Run-time Object)。QTP以对象库中保存对象的属性及属性值为标准,去匹配运行时系统的对象,如

果匹配成功则正确识别对象并执行相应操作,否则会有提示信息。在对象库中也可以增加(加号)、删除(叉号)、修改属性及属性值。这是

对象库强大的一处体现。Value可以修改正则表达式,可以参数化。支持随机值,DataTable取值,环境变量取值,这就让对象识别变的很灵活

,甚至可以动态的去识别对象。
    关于另一个常用的就是描述性编程,这个概念是QTP独有的。通过这个机制,使对象识别更加灵活。在开发脚本过程中,可以不依赖默认

识别属性,通过指定对象的属性及相应的属性值去识别对象。这样可以使脚本脱离对象库,也就是不依赖于TO对象,省去维护对象库的步骤,

但原理还是一样的。灵活运用描述性编程可以使脚本的重用性、稳定性、维护以及脚本的开发变的简单,而且直观易于阅读,简化团队成员之

间的协作。但如果单纯的把录制的脚本改成描述性的,这样做不仅没有好处,还会给你的开发的工作量、脚本的维护带来很大的麻烦。如何灵

活使用描述性编程,这里不作详述,原则是使脚本开发过程简单,维护工作量最小
回复 支持 反对

使用道具 举报

  • TA的每日心情
    无聊
    2018-9-27 10:05
  • 签到天数: 36 天

    连续签到: 1 天

    [LV.5]测试团长

    4#
    发表于 2013-3-19 10:59:40 | 只看该作者
    厄~这贴的够详细啊~
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

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

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

    GMT+8, 2024-5-2 14:33 , Processed in 0.070724 second(s), 27 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

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