录制,是一件吃力不讨好的活。很多人以为录制就是我的主要甚至全部的功能,这是大错特错的。不过,录制功能却是不熟悉我的人了解我的有效途径,是大家学习的有力武器。今天就先从录制功能说起吧。

说到录制,就不得不提到我的小伙伴Automation,他是制片人,关于录制回放的规则都是在这里制定的。话不多说,下面进入正题。

相关配置

点击【Automation】->【Record and Run Settings】

这里我们选择Record and run test on any open browser,录制时需要手动打开浏览器。这次给大家展示的主要是B/S方面的录制功能,关于Windows Applications若有兴趣可以自己研究下,感觉上差不多。

在开始录制之前,先准备需要录制的网页。这里,我们自己写个简单的登录页面就好了,古诗有云嘛

淌自己的汗,吃自己的饭,自己的事自己干,靠天,靠地,靠祖宗,不算是好汉。

由于我是在Windows环境下工作的,加上和php关系比较好,就用wamp在本地搭个环境好了。wamp安装很简单,我就不多说了。安装完成以后在wamp安装目录下www文件夹中新建qtp文件夹,并在qtp文件夹下新建demo-login.php文件,写入以下内容

<html>
<head>
<title>
简单的录制演示
</title>
<meta http-equiv="Content-type" content="text/html" charset="utf-8">
<style>
body{
text-align: center;
} form{
width:320px;
}
.content{
width:260px;
height:30px;
}
.user_input{
width:170px;
}
.sub{
margin-left: 70px;
float:left;
}
span{
width:50px;
} </style>
</head>
<body>
<form action="" method="GET">
<div class="content">
<span>用户名</span><input type="text" name="username" class="user_input">
</div>
<div class="content">
<span>邮 箱</span><input type="text" name="mail" class="user_input">
</div>
<div class="content">
<span>密 码</span><input type="password" name="password" class="user_input">
</div>
<div class="content">
<input type="submit" name="sub" value="登录" class="sub">
</div> </form> </body>
</html>
<?php
if($_GET["sub"])
echo "欢迎光临!".$_GET["username"];
?>

在浏览器中输入http://localhost/qtp/demo-login.php打开,请忽视简陋的UI。

出现NOTICE警告不用惊慌,是因为引用了未定义的变量$_GET["sub"],打开php配置文件:wamp安装目录\bin\apache\Apache2.4.4\bin\php.ini,将error_reporting = E_ALL改为error_reporting = E_ALL & ~E_NOTICE,即不输出NOTICE级别的错误报告,重启wamp服务即可。准备工作已完成,下面就可以上主菜了。

开始录制

点击工具栏上的【Record】或者【Automation】->【Record】或者直接按快捷键F3,进入录制模式。

录制时,每一个操作完成后都会自动生成相应的代码,输入完成点击登录,可以在页面上能看到“欢迎光临!username”。最终效果,可以看到密码是自动加密过的。

录制完成后,我们需要保存脚本。按下ctrl+s,选择合适的存放地点,这里我们保存在E:\qtpself下,命名为record.保存完成后,打开record文件夹,可以看到自动生成了很多文件,简单介绍下吧。

default.cfg和default.usp:默认的参数文件,主要是Loadrunner调用时做默认场景参数使用。

lock.lck:QC远程调用需要的测试数据及用户等信息。

Parameters.mtr:Action的参数文件。

record.usr:Loadrunner调用时的虚拟用户文件。

Default.xls:存放Action中的Datatable表的数据,是常用的测试数据录入方式。

可以看到很多都是为Loadrunner准备的(谁叫我们是好基友呢),Action0是我自动生成的文件夹,记录当前脚本的资源以及脚本调用关系,打开后如下图

SnapShots:录制,回放时的截图文件。

ObjectRepository.bdb:对象库文件。

Resource.mtr:资源文件。

Script.mts:相关脚本的调用情况,用记事本打开,可以看到只有RunAction "Action1", oneIteration这一句话,意思是运行Action1,迭代一次,这方面的内容以后会逐渐涉及到。

Action1就是这次录制的脚本代码了,和Action0结构一样,打开Script.mts可以看到刚才录制的脚本代码。

如何回放

点击【Record】旁边的【Run】,或者使用快捷键F5,即可享受飞一般观影的感觉。回放完成后,会自动打开测试报告。若不想自动打开,可以点击【Tools】->【Options】,将View results when run session ends前面的勾取消。此时,查看测试报告要手动打开,需点击【Automation】->【Results】.

测试报告也是保存在脚本文件夹中,即E:\qtpself\record\res1文件夹下。其中,Report文件夹中可以看到XML格式的测试结果,Log文件夹中可以查看到HTML格式的测试结果。

参数化

运行多次脚本以后,肯定有朋友会问,这整来整去都是一个用户,一个邮箱,多没意思啊,可不可以实现不同用户的登录操作呢?答案当然是可以的,方法就是参数化。我提供了两种参数化的方式,一种是在专家视图中,一种是在关键字视图中,今天先介绍关键字视图参数化的方法。

我们现在处于专家视图模式中,切换到关键字视图只需要点击下方的【Keyword view】。

Item是对象列,Opreation是对象对应的操作,value是操作是输入的值,Documentation是相关描述。参数化就在value列进行。先对用户名进行参数化。

选中username对象的value列,点击那个<#>图标,会弹出参数配置选项,直接上图。

将邮箱,密码全都参数化后,效果如下,注意红色框体部分。Value列的输入数据已经变为了Data Table("username",dtGlobalSheet)这种形式了,代表从Data Table的Global sheet中取username列的值。图片下方类似Excel的表格就是Data Table了,我们在这里输入想要的用户、密码。

这时,如果切回专家视图会发现代码已经自动变为参数形式。

好了,现在我们在Data Table中输入想登录的用户,比如这样,然后F5运行脚本即可。

如果,没有打开3次浏览器,登录3个用户的话,可以点击【File】->【setting】,找到Run选项下的Data Table iterations配置,一般选择Run on all rows。

Run one iteration only:只运行一次,顾名思义,不论我们在Data Table中写了多少用户都只会执行一次脚本,输入第一行的用户。

Run on all rows:运行所有行,有多少行,运行多少次。

Run from row 1 to row 3:可以自定义要运行的行数。

模拟录制和低级录制

细心的朋友可能发现在工具栏上,有两个按钮在平时是灰色的,而录制的时候却可以使用。

这两个按钮就是我提供的模拟录制和低级录制功能。

模拟录制:在正常录制不能录制的时候使用,可以录制鼠标和键盘的精确操作,如光标的移动,键盘的输入等等。

低级录制:在我不能识别的环境中使用,对所录对象的位置要求严格。所录制的对象都是以Windows和WinObject的形式存在。

对于模拟录制,可以用个小例子来试验下。在www文件夹下新建analog.php文件,内容如下

 <html>
<head>
<meta http-equiv="Content-type" content="text/html" charset="utf-8">
<script type="text/javascript" language="javascript"> function window_open(){
window.showModalDialog("demo-open.php","","dialogHeight=200px;dialogWidth=300px;scrollbars=yes;")
} </script>
</head>
<body>
<input type="button" name="but" value="弹出窗体" class="but" onclick="window_open()"> </body>
</html>

再新建demo-open.php文件,内容如下

 <html>
<head>
<meta http-equiv="Content-type" content="text/html" charset="utf-8">
<script type="text/javascript" language="javascript"> function window_open(){
window.showModalDialog("demo-open.php","","dialogHeight=200px;dialogWidth=300px;scrollbars=yes;")
} </script>
</head>
<body>
<input type="button" name="but" value="弹出窗体" class="but" onclick="window_open()"> </body>
</html>

浏览器中输入http://localhost/qtp/analog.php打开,点击【弹出框体】后,弹出windows对话框。

现在,我们需要录制鼠标拖拉滚动条的操作,正常录制模式肯定是不能录制的(大家可以自己尝试下),但采用模拟录制模式就可以实现。首先,还是按F3进入录制后,点击模拟录制图标,出现下图对话框,点击“小手”图标选择我们要录制的网页对话框,点击【Start Analog Record】,然后拖动滚动条即可。

录制完成脚本如下。

Window("-- 网页对话框").RunAnalog "Track2"

这句就是我们通过模拟录制生成的脚本。

好了,今天的介绍就到这里了。我还有很多功能和细节等待大家发现,这需要多动手,多练习。录制不是目的,只是一种学习的手段,不过学会了录制还是有好处的,我可以很自豪的跟别人说

其实,我是一个演员,手中的录像机

QTP自传之录制的更多相关文章

  1. QTP脚本不能录制怎么办?

    QTP是基于VBS脚本语言的,大部分VBS脚本都能在QTP上运行,只是在一些细节上略有不同,比如说VBS上停止用sleep,QTP上用wait.QTP的强大之处在于对程序窗口的操作,有很多针对窗体的属 ...

  2. QTP自传之初识

    我叫QTP,全名是HP Quicktest Professional,大家都叫我小Q. 小Q生于1998年,那是一个春天(哈哈咱也是跨世纪的人才).家里人丁兴旺,兄弟众多,L(Loadrunner), ...

  3. QTP自传之web常用对象

    随着科技的进步,“下载-安装-运行”这经典的三步曲已离我们远去.web应用的高速发展,改变了我们的思维和生活习惯,同时也使web方面的自动化测试越来越重要.今天,介绍一下我对web对象的识别,为以后的 ...

  4. QTP自传之对象

    对象在手,测试我有 大家别误会,这里说的对象可不是值指男女朋友,而是对被测控件的识别.经过昨天的录制,大家一定很奇怪为什么我可以做到精确的回放操作,这都要归功于对象,下面就隆重的介绍我在对象识别方面的 ...

  5. QTP自传之测试报告

    前言 测试报告是测试阶段的最后产出,也是最重要的产出,自动化测试报告也是如此.前期所做的工作,添加对象.编写脚本等都是为了可以生成一份正确.严谨的测试报告.我作为一款功能全面的自动化测试工具,毫无疑问 ...

  6. QTP自传之描述性编程

    描述性编程,即采用描述性的语言定位对象,不需要事先将对象添加到对象库中.下面,就说说如何使用描述性编程,我们将继续使用对象库编程中的网页. 使用描述性编程的两种方法 直接描述 对象("属性名 ...

  7. QTP自传之对象库编程

    对象库编程是我们平时工作中使用最多的编程方式,在自动化脚本开发中起到举足轻重的作用,与描述性性编程相比,更直接和易于维护,今天就和大家简单的聊聊如何进行对象库编程. 既然是对象库编程,肯定要对已存在于 ...

  8. qtp的三种录制模式(转)

    QTP提供三种不同的录制方式:正常录制(Normal Recording).模拟录制(Analog Recording)和低级录制(Low Level Recording). 1.正常录制(Norma ...

  9. QTP对象识别tips

    1.已添加的对象无法再次识别成功,编辑对象存储库中测试对象详细信息.子对象无法识别成功时,先检查父对象是否可成功识别. 2.使用.NET Windows Forms 侦测器检测后再使用object s ...

随机推荐

  1. 9.30 noip模拟试题

    时限均为1s,内存 256MB 1.某种密码(password.*) 关于某种密码有如下描述:某种密码的原文A是由N个数字组成,而密文B是一个长度为N的01数串,原文和密文的关联在于一个钥匙码KEY. ...

  2. 查询可用的Nuget服务地址

    解决访问Nuget源失败问题 查询IP址址 nslookup nuget.org 如失败,通过google 的dns服务器查询 nslookup nuget.org 8.8.8.8 将得到的Ip地址加 ...

  3. java异常类的使用

    1.异常的概念 什么是异常?程序出错分为两部分,编译时出粗和运行时出错.编译时出错是编译器在编译源码时发生的错误: 运行时出错是在编译通过,在运行时出现的错误.这种情况叫异常. 例如:数组越界,除数为 ...

  4. Opencart 之 Registry 类详解

    Registry 中文意思是记录,登记,记录本的意思, 在opencart中他的用途就是 登记公共类.类的原型放在 system\engine文件夹下 代码很简单: <?php final cl ...

  5. Composite 模式的实现

    实现要点: 1.组合模式采用树形结构来实现普遍存在的对象容器,从而将“一对多”的关系转化“一对一”的关系,使得客户代码可以一致地处理对象和对象容器,无需关心处理的是单个的对象,还是组合的对象容器. 2 ...

  6. Adapter 模式

    在实际软件系统设计和开发中,会经常遇到这种问题:我们为了完成某项工作购买了一个第三方的库来加快开发. 这就带来了一个问题: 我们在应用程序中已经设计好了接口,与这个第三方提供的接口不一致,为了使得这些 ...

  7. hdu 4502吉哥系列故事——临时工计划 (简单DP)

    Problem Description 俗话说一分钱难倒英雄汉,高中几年下来,吉哥已经深深明白了这个道理,因此,新年开始存储一年的个人资金已经成了习惯,不过自从大学之后他不好意思再向大人要压岁钱了,只 ...

  8. Linux 系统命令及其使用详解(大全)

    (来源: 中国系统分析员) cat cd chmod chown cp cut 1.名称:cat 使用权限:所有使用者 使用方式:cat [-AbeEnstTuv] [--help] [--versi ...

  9. socket 编程基础

    一.Socket简介 Socket是进程通讯的一种方式,即调用这个网络库的一些API函数实现分布在不同主机的相关进程之间的数据交换. 几个定义: (1)IP地址:即依照TCP/IP协议分配给本地主机的 ...

  10. ibatis集成Sqlite:小数据库也有大作用

    作者:Vinkn 来自http://www.cnblogs.com/Vinkn/ 一.简介 Ibatis简介: Ibatis是一个类似于Hibernate的数据库ORM(对象关系映射,通俗点就是将数据 ...