发布新日志

  • 使用jmeter做数据准备工作

    2014-05-09 17:44:31

     项目测试过程中,遇到这样一个需求,需要一张表里面有几百万的数据,需求很简单,本来想用jdbc直接写java往数据库里面插数据,后来想起jmeter好像可以实现这个需求,而且更简单便捷,所以用jmeter做了下数据准备工作,现在记录下做的过程。

        1 打开jmeter,创建一个线程组:

            

        2 鼠标右键单机线程组,创建一个jdbc connection configuration:

            

            对数据库的地址、用户名和密码进行填写:

            

        3 创建用户参数:

            

            可根据要插入数据中,不同字段,创建参数函数:

            

            函数的产生,由函数生成器产生:

            

            不同函数的产生:

            

            也可以用计数器当做函数使用:

            

        4 线程组里面添加一个jdbc request:

            

            在jdbc request里面添加sql语句:

            

            其中,对字段有特殊要求的(即:字段被做参数化,使用函数的字段),用特定"${你的参数}"格式,在失去了中进行体现:

            

            参数化的字段:

     

            

        5 添加聚合报告和查看结果树,根据自己需要的数量级,进行查数据操作:

            

    这样就可以进行数据的插入了。

    心得:

    1 小数据量的情况下,使用java通过接口或者直接插数据,跟使用jmeter应该时间上差不多,但是到达百万级以上的数据量,使用jmeter多线程,速度会明显快很多。

    2 jmeter的操作比较简单,如果没有现成的工程,搭建环境比较麻烦,调试代码有点烦。但是用jmeter的话,只需要一个简单的sql,几步操作步骤,就可以完成任务,优势比较明显。

     

  • 负载均衡技术应用介绍

    2014-05-06 17:47:18

    由于网络的数据流量多集中在中心服务器一端,所以现在所说的负载均衡,多指的是对访问服务器的负载进行均衡(或者说分担)措施。负载均衡,从结构上分为本地负载均衡和地域负载均衡(全局负载均衡),前一种是指对本地的服务器集群做负载均衡,后一种是指对分别放置在不同的地理位置、在不同的网络及服务器群集之间作负载均衡。

      每个主机运行一个所需服务器程序的独立拷贝,诸如Web、FTP、Telnet或e-mail服务器程序。对于某些服务(如运行在Web服务器上的那些服务)而言,程序的一个拷贝运行在群集内所有的主机上,而网络负载均衡则将工作负载在这些主机间进行分配。对于其他服务(例如e-mail),只有一台主机处理工作负载,针对这些服务,网络负载均衡允许网络通讯量流到一个主机上,并在该主机发生故障时将通讯量移至其他主机。

      ■DNS

      最早的负载均衡技术是通过DNS来实现的,在DNS中为多个地址配置同一个名字,因而查询这个名字的客户机将得到其中一个地址,从而使得不同的客户访问不同的服务器,达到负载均衡的目的。

      DNS负载均衡是一种简单而有效的方法,但是它不能区分服务器的差异,也不能反映服务器的当前运行状态。当使用DNS负载均衡的时候,必须尽量保证不同的客户计算机能均匀获得不同的地址。由于DNS数据具备刷新时间标志,一旦超过这个时间限制,其他DNS服务器就需要和这个服务器交互,以重新获得地址数据,就有可能获得不同IP地址。因此为了使地址能随机分配,就应使刷新时间尽量短,不同地方的DNS服务器能更新对应的地址,达到随机获得地址,然而将过期时间设置得过短,将使DNS流量大增,而造成额外的网络问题。DNS负载均衡的另一个问题是,一旦某个服务器出现故障,即使及时修改了DNS设置,还是要等待足够的时间(刷新时间)才能发挥作用,在此期间,保存了故障服务器地址的客户计算机将不能正常访问服务器。

      尽管存在多种问题,但它还是一种非常有效的做法,包括Yahoo在内的很多大型网站都使用DNS。

      ■代理服务器

      使用代理服务器,可以将请求转发给内部的服务器,使用这种加速模式显然可以提升静态网页的访问速度。然而,也可以考虑这样一种技术,使用代理服务器将请求均匀转发给多台服务器,从而达到负载均衡的目的。

      这种代理方式与普通的代理方式有所不同,标准代理方式是客户使用代理访问多个外部服务器,而这种代理方式是代理多个客户访问内部服务器,因此也被称为反向代理模式。虽然实现这个任务并不算是特别复杂,然而由于要求特别高的效率,实现起来并不简单。

      使用反向代理的好处是,可以将负载均衡和代理服务器的高速缓存技术结合在一起,提供有益的性能。然而它本身也存在一些问题,首先就是必须为每一种服务都专门开发一个反向代理服务器,这就不是一个轻松的任务。

      代理服务器本身虽然可以达到很高效率,但是针对每一次代理,代理服务器就必须维护两个连接,一个对外的连接,一个对内的连接,因此对于特别高的连接请求,代理服务器的负载也就非常之大。反向代理方式下能应用优化的负载均衡策略,每次访问最空闲的内部服务器来提供服务。但是随着并发连接数量的增加,代理服务器本身的负载也变得非常大,最后反向代理服务器本身会成为服务的瓶颈。

      ■地址转换网关

      支持负载均衡的地址转换网关,可以将一个外部IP地址映射为多个内部IP地址,对每次TCP连接请求动态使用其中一个内部地址,达到负载均衡的目的。很多硬件厂商将这种技术集成在他们的交换机中,作为他们第四层交换的一种功能来实现,一般采用随机选择、根据服务器的连接数量或者响应时间进行选择的负载均衡策略来分配负载。由于地址转换相对来讲比较接近网络的低层,因此就有可能将它集成在硬件设备中,通常这样的硬件设备是局域网交换机。

      当前局域网交换机所谓的第四层交换技术,就是按照IP地址和TCP端口进行虚拟连接的交换,直接将数据包发送到目的计算机的相应端口。通过交换机就能将来自外部的初始连接请求,分别与内部的多个地址相联系,此后就能对这些已经建立的虚拟连接进行交换。因此,一些具备第四层交换能力的局域网交换机,就能作为一个硬件负载均衡器,完成服务器的负载均衡。   由于第四层交换基于硬件芯片,因此其性能非常优秀,尤其是对于网络传输速度和交换速度远远超过普通的数据包转发。然而,正因为它是使用硬件实现的,因此也不够灵活,仅仅能够处理几种最标准的应用协议的负载均衡,如HTTP 。当前负载均衡主要用于解决服务器的处理能力不足的问题,因此并不能充分发挥交换机带来的高网络带宽的优点。

      ■协议内部支持

      除了这三种负载均衡方式之外,有的协议内部支持与负载均衡相关的功能,例如HTTP协议中的重定向能力等,HTTP运行于TCP连接的最高层。客户端通过端口号80的TCP服务直接连接到服务器,然后通过TCP连接向服务器端发送一个HTTP请求。在服务器分清客户端所需的网页和资源之前,至少要进行四次TCP的数据包交换请求。由于负载平衡设备要把进入的请求分配给多个服务器,因此,它只能在TCP连接时建立,且HTTP请求通过后才能确定如何进行负载的平衡。当一个网站的点击率达到每秒上百甚至上千次时,TCP连接、HTTP报头信息以及进程的时延已经变得很重要了。在HTTP请求和报头中有很多对负载平衡有用的信息。首先,也是最重要的一点是,我们可以从这些信息中获知客户端所请求的URL和网页,利用这个信息,负载平衡设备就可以将所有的图像请求引导到一个图像服务器,或者根据URL的数据库查询内容调用CGI程序,将请求引导到一个专用的高性能数据库服务器。惟一能局限这些信息获取的因素是负载平衡设备本身的灵活程度。事实上,如果网络管理员熟悉Web内容交换技术,他可以仅仅根据HTTP报头的cookie字段来使用Web内容交换技术改善对特定客户的服务,如果能从HTTP请求中找到一些规律,还可以充分利用它作出各种决策。除了TCP连接表的问题外,如何查找合适的HTTP报头信息以及作出负载平衡决策的过程,是影响Web内容交换技术性能的重要问题。

      但它依赖于特定协议,因此使用范围有限。根据现有的这些负载均衡技术,并应用优化的均衡策略,来实现后端服务器负载分担的最优状态。

  • 2-5-10原则

    2014-05-05 10:37:00

    所谓的“2-5-10原则”,简单说,就是当用户能够在2秒以内得到响应时,会感觉系统的响应很快;当用户在2-5秒之间得到响应时,会感觉系统的响应速度还可以;当用户在5-10秒以内得到响应时,会感觉系统的响应速度很慢,但是还可以接受;而当用户在超过10秒后仍然无法得到响应时,会感觉系统糟透了,或者认为系统已经失去响应,而选择离开这个Web站点,或者发起第二次请求。
  • Gatling实用技术

    2014-02-18 10:44:12

     

     

    Gatling实用技术

    ----高性能轻量级压力测试工具

    项目背景

    开发部门需要压力测试,但依赖QA的压力测试组不够便捷,因为其行动周期较长(业务讲解,计划制定,脚本匹配,文档撰写....),另外QA组使用的工具也比较专业,如果让开发部门自己用也不那么轻便。否能找到一种方法,让开发人员跑一跑压力测试呢(在专业的QA压力测试组介入以前)?

    本文档适用对象

    n  有一定编程基础的开发人员

    n  对应用性能有很高要求的开发团队

    本文不适合的对象

    n  希望所有功能均由图形界面完成的使用者

    本文阅读时间

    1~2小时,建议分部阅读,中间安排充足的时间实验。

    1 Gatling简介

    GatlingScala基础封装是基于Akka编程的,它是非阻塞异步编程模型,可以高效执行并有极高的容错率。

    n  专用web测试。

    n  LR那样录制脚本,不用从零开始。

    n  脚本使用scala语言,易懂,易修改,控制灵活。

    n  基于JVM,随拷随用。(对比LoadRunner的客户端安装以及JMeter需要XWindow组件,这个方便很多),操作接近apacheab

    n  原生支持NIO,并发性能很好,即使性能较差的电脑也能发起很大的负载压力。

    n  基于HTML的报表,简单易读。

    2 Gatling入门

    2.1 准备工作

    2.1.1 下载

             下载地址:https://github.com/excilys/gatling/wiki/Downloads

    jdk6对应1.5版本,jdk7以上对应2.0版本。

    本文档使用1.5.2版本进行演示。

    2.1.2配置环境变量

               需要配置好JAVA_HOME GATLING_HOME环境变量,后者指向Gatling的根目录。

    2.1.3 Gatling目录结构

    2.1.4 Recorder.bat gatling.bat

     Recorder.batgatling.bat一个用来录脚本,一个用来执行脚本。它们也提供了linux版本.sh

    Recorder是个桥接在浏览器和web服务器之间的代理,如果浏览器通过它访问网络时,它能记下浏览器的访问轨迹。 Reocrder提供了UI界面,让配置和执行变得简单。 同时,Recoder也是一个scala代码的生成器,它能把访问轨迹记录成scala代码。

     

    Gatling.bat是一个包含了编译,执行scala代码的脚本,它提供了一些参数供使用者指定执行的细节(比如JVM_OPTS,运行它可以选择需要执行的scala代码,创建非阻塞的线程模型执行压力测试。 

    2.2 录制一个脚本

    2.2.1 启动Recorder

             执行{Gatling目录}/bin/recorder.bat|.sh,会启动一个图形控制界面,同时在后台启动了一个代理服务器。

    配置浏览器,令浏览器通过这个代理服务器访问互联网,则一切操作都会被其记录。

    2.2.2 浏览器指向Recorder代理

    启动Recorder之后,已经在本机的80008001上启动了代理,接下来我们配置一下浏览器,让它通过Recorder的代理访问网络。

     

     

    配置好以后,当Recorder关闭时,浏览器无法访问任何网站,证明配置成功。当脚本记录工作结束之后,别忘了改回无代理的状态,否则只要recorder一关,浏览器就不能访问互联网了。

    笔者建议,如果经常录压力测试脚本,可以单独安装一个不常用的浏览器专用,比如chrom

    2.2.3 录制脚本

    录制以前,启动待测试的应用服务器,本文用grails搭了一个简单的web应用程序,跑在localhost8080/teset/,然后打开浏览器,切换到Recorder点击start,回到浏览器访问地址,切回Recorder点击stop&save,这样就完成了一次录制。

    2.2.4脚本保存位置

    录制完成的脚本放在了这里,路径根据RecorderOutput folder指定,重名情况下会覆盖旧文件。如果录制的文件多了,可以考虑将这个文件夹弄到svn上去,以防万一。

    2.3 编辑脚本

    2.3.1脚本内容分解

    我们打开刚才录好的RecordedSimulation.scala

    看到内容定义,我们只关注httpConfscn这两个对象就够了。

     

    观察相同颜色的箭头,其功能脚本内容一目了然“用httpConf当做访问协议,用scn描述访若干问地址和暂停时间,用scn.users描述并发个数,执行访问。” 

    当然,所举的例子很简单。而一个完整的操作流程至少包含“登陆验证,操作,退出”。 在实际的录制过程中,读者可能会发现录制完的脚本中有很多杂乱的请求,这是因为网页中的cssjs等资源也是通过请求获取,凡是请求都会被记录到脚本,形成了像“杂音”一样的内容。

    我们可以在编辑脚本时,适当删除它们。因为很多这类请求消耗的是缓存服务器的性能,而大说数情况我们更关注应用服务器。

    2.3.2编程思路

    ü  将用户的操作,分解成多个“get”和“post”请求。

    ü  定义每个请求对应的参数变量。

    ü  缓存请求返回的值,如需要作为下次请求的参数。

    ü  使用“scn.users”属性,模拟多用户多线程。

     

    可以阅读Gatling提供的演示脚本BasicExampleSimulation.scala,看看怎样给每个请求指定不同的header,每个请求指定不同参数,感受编程带来的灵活性。读者可能会感受到,Galting其实是个编程类库,提供了各种发送网络请求的基础类。

    2.4 运行压力测试

    2.4.1编程思路

    执行{Gatling路径}\bin\gatling.bat|.sh -sf <脚本路径>。这时屏幕开始输出日志,观察负载应用服务器的日志,会发现正在处理批量的请求。

    执行完毕之后,在此录下会产生报告文档,直接访问index.html即可阅读。

     压力测试的结果,分为GLOBALDETAILS两栏,分别对平均分数和每组请求的分数做了统计。我们重点参考Request/sec(每秒处理请求个数)和Transactions/sec(每秒处理事务个数,事务即每个模拟用户的一组请求)      

    更详细的测试报告说明,请参考官网https://github.com/excilys/gatling/wiki/Reports

    2.4.1注意事项

    l  发送端与负载端的网络环境与带宽

    Galting作为发送端发起大量的请求,是很消耗网络带宽的。如果开发机与应用服务器之间有带宽限制,则不应将发起端放在开发机,而应该放在负载端同机架的服务器,确保发起端有足够的带宽输出请求。

    考虑Galting本身会占用内存和CPU去发起请求和接收请求,所以Galting不应该与负载端同使用一台服务器,或者共享硬件资源的两个虚拟机。

    l  负载压力

    根据脚本所定制的并发数,Galting需要占用内存去生成对象。请根据情况,调整Galting的配置文件,将更多内存分配给GaltingJVM,让其有足够的内存去发起请求。

    3Gatling提高

    3.1 测试计划

    请在着手录制脚本以前,仔细制定一个计划,磨刀不误砍柴工。

    比如制定多级压力,逐级测试,找到应用的极限。

     

    3.2活用scala,实现功能型测试

              scala代码可以实现任何控制逻辑。比如http类提供了一个check() 查看(2941) 评论(0) 收藏 分享 管理

  • 测试计划和自动化测试思考

    2014-02-11 15:32:15

    这几天对XXX的测试计划和自动化测试进行思考。

    先说测试计划,测试计划需要依据迭代开发计划制定,需要有明确的测试范围和测试目标。

    看了下Q1的迭代开发计划主要有XXX功能改进、BUI改进、系统安全性改进、全页面子资源监测、api组件改进。 这些改进都是持续性的,没有明确的改进需求和改进结果要求。因此进入测试之前无法了解需求和进行用例设计或维护。可以预想最终结果可能会跟以前一样,开发完成交给测试执行测试,改进后发布。如果是这样测试人员没有办法做到主动测试,只能在开发完毕提给测试后被动接受进行测试。制定测试计划也就没有多大意义了,也不知道从何计划。

    为了改进这个过程,我建议如下:

    1.         明确和细化Q1的功能改进需求,并列点说明。

    2.         开发人员根据明确的改进需求逐步改进。 这期间测试人员针对需求进行用例设计和维护。

    3.         迭代开发完毕,满足测试准入条件,提交测试。

    4.         测试人员执行用例、验证缺陷、手工测试,完成测试。

    5.         建议项目迭代周期安排一个时间段专门进行测试和修复缺陷。

    6.         建议对XXX已提交的缺陷进行筛选并安排进行修复。

     

     

    自动化测试

    无论是qtp还是selenium脚本,当产品进行bui改进和功能改进后,脚本基本都需要进行维护和变更,而且这个维护工作量还蛮大的。 对比新旧版本的创建站点监控,变化比较大,并且新版的功能界面也还不够完善。

    我觉得这阶段开展自动化测试不是太合适,主要是1.之后可能很多页面都要重构,后续维护脚本的工作量巨大。2.功能还不够完善,用手工测试效率更高,不适合自动化回归测试。3.开发出来的自动化脚本复用性不高。

    因此规划这一阶段自动化的主要工作:

    1.       完善XXX测试用例。

    2.       挑选出适合开展自动化测试的用例。主要目标用例为系统主要流程功能、相对稳定的功能模块用例。

    3.       根据项目测试的需求进行自动化测试技术预研(QTPselenium或其它合适的自动化测试工具)

     

  • 测试用例评审流程

    2014-02-07 10:35:09

    1.       过程描述

    1.1.    入口准则

    1.         本阶段的测试用例已编写完成;

    2.         用户需求说明书、软件需求说明书已完成并入库。

    1.2.    输入

    1.       XX项目测试用例;

    2.       用户需求说明书;

    3.       软件需求说明书。

    4.       产品原型。

    1.3.    过程描述图

    1.3.1.      制定评审计划

    测试人员依据产品需求编写完成测试用例,建议对测试用例自行检查一遍后,制定测试用例评审计划。

    注意如下几点:

    u  评审人员:项目经理、产品经理、主要的开发人员、测试人员。

    u  本阶段的测试用例已完成,并且需在测试提交前评审完成。

    u  需制定一个测试用例反馈的截止时间,并在截止时间之前进行评审反馈。

    u  主持人一般为项目的测试主要负责人。

    u  建议准备重点说明一般说明评审人员的评审范围或者一些需要重点评审的功能用例。

    u  尽量避免测试人员评审自己编写的用例,可以采用交叉评审的方式。

    u  相关资料主要说明测试用例存放的位置,需要通过何种方式筛选出评审的测试用例,另外还可以说明产品需求等文档存在的位置。

    u  测试用例评审跟踪表评审计划制定后,点击初始化形成各个评审人员的工作表。

    1.3.2.      用例评审

    主持人制定评审计划后,将《测试用例评审跟踪表》发送给参与评审的各个人员,评审人员收到评审计划后进行用例评审。

    用例评审人员的主要评审内容为:

    u  是否覆盖产品需求上的所有功能点。

    u  测试用例本身的描述是否清晰,是否存在二义性。

    u  用例是否具有很好可执行性。例如用例的前提条件、执行步骤、输入数据和期待结果是否清晰、正确;期待结果是否有明显的验证方法。

    u  优先极安排是否合理。

    u  是否存在冗余的用例或验证点。

    u  是否从用户层面来设计用户使用场景和使用流程的测试用例。

    u  是否包含充分的负面测试用例。充分考虑产品的异常流程,并编写测试用例进行覆盖。

    注意如下几点:

    u  评审人员发现问题后,填写到各自的工作表中,填写字段:提出者、问题描述、严重程度、问题来源(文件、章节)、建议。

    u  评审后填写评审时长。

    u  评审完成后将评审结果发送给主持人。

    1.3.3.      修改和验证评审问题

    主持人收集各个评审人员反馈的问题,将问题指派给相应的用例编写的人员进行修改。用例编写人员接收到问题后,针对问题进行分析并修改并答复给问题提出人。问题提出人对修改的问题进行验证并反馈。

    注意如下几点:

    u  用例修改人员填写引入活动、接受、修改、解决方案、解决人、解决时间字段。

    u  用例修改人员若对提出的问题有疑问或不理解,可以与问题提出人员再进行沟通。

    u  用例修改人员对问题进行答复后,发送给问题提出人员进行验证。

    u  问题提出人对问题的解决情况进行验证,若同意修改结果在关闭人字段填上自己的名字;若不同意修改结果再与用例修改人员进行沟通直到达成最终的修改意见,在关闭人字段写上自己的名字,将结果发送给主持人。

    1.3.4.      评审结果分析和审核

    在评审的问题全部解决和验证通过了,主持人查看评审的问题、评审数据,进行评审分析,填写评审分析和评审结果。将评审的结果发送给审核人审核,审核人员审核后周知项目组。

    注意如下几点:

    u  主持人填写评审分析及评审结果的评审结论与意见。

    u  审核人填写评审结果的审核修正后的工作成果。

    u  审核人一般为项目经理或产品经理,对评审的结果进行审核。若对最终的测试用例不满意可以要求重新进行用例维护和用例评审直至最终满足要求。

    1.4.    输出

    1.         XX项目测试用例》;

    2.         XX项目测试用例评审跟踪表》。

    1.5.    出口准则

    XX项目测试用例》、《XX项目测试用例评审跟踪表》纳入配置管理。

  • 测试问题分析和测试规范

    2014-01-26 18:03:01

    问题1:用需、软需文档不够完整,需求不够明确,功能细节描述不足。

    解决:

    Ø  需求维护:Jira上的产品建议、运维反馈的产品建议。

    Ø  需求文档维护。(系统的主要功能、流程在文档中都需描述,功能实现细节可在需求评审补充或用例设计时加入)

    Ø  需求评审(召开版本迭代会讨论明确需求)

    版本迭代会:项目经理规划版本之时,召开版本迭代会,对需求进行说明,开发和测试人员有问题可共同探讨,避免需求理解歧义。(其他组的经验)

     

    问题2:完善需求OR完善用例?

    讨论:

    严格意义测试应该从需求开始抓起,参与需求的评审,对详细设计也要测试,如果可以做到这样,那么无需求测试的状况就不会出现了;但目前我们并没有做这么多,或者说做得不完全。所以测试人员都会或多或少的遇到这种无完善需求文档的测试状况,这时候我们需要谨记的则是我们必须保证我们的测试用例包含了你所要测试对象的所有功能点。Openqs目前来看完善需求文档和完善用例都是比较痛苦的。因此建议是两头同时开展,一方面,系统的主要功能流程在需求文档(用需)补充。另一方面提高测试用例覆盖需求度,补充异常的验证流程等。

     

    问题3jira上的缺陷描述不规范。

    解决:

    全员规范缺陷描述,注意事项:

    1.       对于无法重现或不好重现的问题,备注说明测试地址、账号、密码等,供开发人员排查。

    2.       针对兼容性类的缺陷,说明缺陷使用的浏览器、分辨率、操作系统等情况。

    3.       1个缺陷尽量只描述1个问题,不要描述多个问题。避免开发人员对缺陷没有修改全,或者只修改一部分,一部分后面才修改。

    4.       一些缺陷若文字描述无法准确表达的话,最好都能带上附件截图说明。比如一些提示信息啊、样式显示啊、另外一些显示代码类的错误都必须截图说明。

    5.       开发人员解决完缺陷,若可能的话最好备注说明修改的情况及可能影响的功能。

    6.       测试人员验证缺陷,若缺陷重新打开,增加备注说明验证的情况。

     

    问题4:系统环境搭建较为复杂,测试环境更新未走标准化流程,系统安装更新手册说明不足。

    解决:

    自动构建、减少人工的配置操作、简化环境搭建和更新步骤

    完善系统安装手册、系统维护手册、系统更新手册。

     

    问题5:测试过程中,采用边测边改的方式,更新测试环境频繁,导致功能重复测试较多,测试效率不高,同时遗留缺陷的风险较大。

    解决:

    引入周更新测试,规范测试。

     

    问题6:提交的缺陷,没有安排解决时间表,不断遗留和累积,感觉测试的工作成果得不到重视。

    解决:

    建议制定迭代计划时,将缺陷安排到迭代任务中解决,在迭代的系统测试进行验证。

     

    问题7:缺陷解决流程没有形成规范,存在缺陷关注不足,缺陷不解决,解决后未验证、无法验证等情况。

    解决:

    制定缺陷解决流程,按规范严格执行。

    配置人员权限

    功能测试阶段:

    项目测试类型我觉得可先大致可分为两类:周更新测试和系统测试(含性能测试、安全测试、稳定性测试等专项测试)。

    周更新测试

    周更新测试:主要是针对每周的各组件更新需求,进行测试。

    Ø  组件更新是否提交测试可由组件负责人自行判断,不一定需要提交测试。

    Ø  提交测试需保证更新的主要功能已完成并已自测,若发现因为主要功能有问题导致无法继续测试,则退回测试。

    Ø  提交测试需由组件负责人说明清楚更新的内容和可能的影响功能。

    Ø  测试人员主要针对更新的内容及可能影响的功能进行测试,并对系统的主要流程进行冒烟测试,其他功能不进行测试。(1.增加的新功能以及新修复的bug2.系统中重要的功能,如果有将测试用例分优先级的话,优先级高的测试用例应该要被执行到。3.与开发人员交流,确定哪些功能是受最新的改变而有可能发生问题的,开发人员认为最有可能出问题的功能,应该重点测试。)

    Ø  测试结束一般不出具测试报告,可大概整理下早会说明或者通过邮件、QQ向组件负责人、项目经理、产品经理说明下测试情况。

    Ø  一般在测试完毕后才允许更新环境进行第二轮的验证测试。(尽量减少测试过程中更新测试环境的频率,除非因出现大问题影响测试不得不更新环境)

    Ø  周更新测试发现的缺陷统一登记到jira上。

    系统测试

    系统测试:建议比较大版本的功能开发结束,提交一次比较完整的系统测试。(包含之前做的几次周更新测试)

    Ø  系统测试可按循环进行,第一循环测试后,在开发人员修改完第一循环缺陷后再提交第二循环测试。如此进过2-3个循环,最终使产品达到发布上线的标准。

    Ø  系统测试结束后出具系统测试报告。

    Ø  系统测试环境由测试人员搭建和更新。

    Ø  提交测试时说明测试的内容(哪些要测试、哪些不测试)

    系统测试准入条件

    1.       需求文档已纳入SVN,功能需求明确,已通过评审。

    2.       项目经理提交测试申请单(参考测试申请单模板)

    3.       本迭代的测试用例已完成并通过评审。

    由于版本周期问题,组内其他成员可能没时间看,测试人员可按优先级罗列测试点,测试计划。组内测试人员之间,也可以互评。 若有时间产品经理和主要开发人员也可参与评审。

    4.       版本开发结束,开发人员自测。

    开发不宜提交太过频繁,不应提交无法构建,编译错误的代码。且应该在有较大改动,或进行较大更新时,有一定的可测性,才提交测试。若开发提交测试的产品,主流程主功能出现问题,较大影响测试开展,则测试人员可中止测试,待改善后重新进入。

    相对独立的功能需求,可分别提交测试;但如果多个需求关联性紧密,应该开发完毕后一起提交测试,避免测试人员过多重复劳动。

    对于没有完成的功能,不能提交测试,必须在代码中注释掉。

    5.       代码已提交配置库,并提供安装说明文档。

    1:功能测试可以分测试循环进行,如第一循环测试完毕后,开发人员对缺陷进行修改,将大部分缺陷均已修改,然后提交第二循环测试。 第二循环验证缺陷和进行针对性的测试。若缺陷还较多,再提交第三循环。如此反复直至满足测试退出准则结束功能测试。

    2:功能测试由于人力资源限制,提交太过频繁,建议有比较大改动或要进行较大更新才提交测试。 其他类型采用周更新测试的方式,大体如现在我们进行的测试类型。

    3:若提交的产品,主要流程出现大问题,较大影响测试进行,向项目经理中止测试,待改善后再提交测试。

    系统测试退出标准

    1.         测试用例均已执行,用例通过率90%

    2.         功能需求都已经开发和测试完成,系统性能和功能已达到需求标准。

    3.         严重缺陷均已修改(若有遗留由项目经理和产品经理审批)、总体缺陷修复率达到80%(暂定80%,后续根据产品要求可提高)

  • 手机自动化测试的原理

    2014-01-14 16:23:47

    一、首先说说手机自动化测试的原理
      1、手机自动化测试的原理为PC上一个控制端(测试工具)与手机上的一个agent端,通过串口、USB或者无线方式将PC与手机终端相连,然后应用测试工具向手机发送请求或者命令,手机收到命令或者请求后,交给agent端解析,然后agent将这些解析的命令下发给手机的各个功能模块所能识别的命令,调用那些功能模块模拟操作。完成这些操作后,手机会返回一些信息,agent可以抓取这些信息,然后传回给PC端,这样就完成了一个完整的手机自动化测试。
      2、关键点在于agent,有的公司是向自己的手机终端的软件功能模块中植入测试程序响应代码,有的公司可以利用MMI_Command的方式来控制手机终端;原理就是给手机提供一个响应的接口。
      3、而对于PC控制端,这个测试脚本用各种编程语言都可以,看如何定义
      4、而又的自动化测试设计成录制的机制,说通俗点,就是记录手工操作的键盘信息或者LCD的操作信息(LCD需要用到智能识别机制)
      5、自动化测试框架的搭建方法是通用的,你需要有一套自己的测试框架才能保证自动化测试的顺利开展。
      二、Android自动化测试方向:
      1、CTS,CTS 测试基于Android instrumentation 测试, 其又基于JUnit 测试。说白了, CTS 就是一堆单元测试用例。这也是Java 语言的擅长部分。
      2、 Monkey工具,Monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中。它向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、手势输入等),实现对正在开发的应用程序进行压力测试。Monkey测试是一种为了测试软件的稳定性、健壮性的快速有效的方法。
      3、ASE,ASE 意思为Android 脚本环境, 即我们可以通过脚本(比如Python)调用Android 的功能,从而定制一些测试。比如打电话,发短信,浏览网页,等。我们可以扩充它的API(Java 部分), 并用python 脚本调用这些API, 从而实现丰富的测试功能。用于API 部分可以访问到Android 全部API, python 又能灵活部署测试,所以ASE 的扩展性非常好。
      4、Robotium,该工具用于黑盒的自动化测试。可以在有源码或者只有APK 的情况下对目标应用进行测试。Robotimu 提供了模仿用户操作行为的API,比如在某个控件上点击,输入Text等等。(推举你可以研究一下这个工具,开源的,我有资料)
      5、可以自己开发一个手机方面的自动化测试工具,原理上一样
  • monkey使用

    2013-12-26 17:34:35

    今天来看看具体的使用

    1 先看看安装和删除测试包的命令
    安装:C:\document and setting>adb install D:/xxx.apk  

    删除:C:\document and setting>adb uninstall apk的包名(如com.qq)


    2、在命令行输入命令:adb shell

    3、应用程序包都在data目录中的data目录下,我们输入命令:cd data/data

    进入目标data文件夹,在执行命令:ls,可找到刚才加载项目的应用程序包.

    找到对应的包名后,就可以通过monkey命令来进行测试了。

    4、看看相关参数
    -p:所在测试的包,可以是一个也可以是多个(如:monkey -p com.androd.a 

    -p com.androd.b)

    2.-c:如果用此参数指定了一个或几个类别,Monkey将只允许系统启动被这些

    类别中的某个类别列出的Activity。如果不指定任何类别,Monkey将选择下列

    类别中列出的Activity:Intent.CATEGORY_LAUNCHER或

    Intent.CATEGORY_MONKEY。要指定多个类别,需要使用多个-c选项,每个-c选

    项只能用于一个类别.

    3.-ignore-crash:当应用程序崩溃或发生任何失控异常时,Monkey将停止运

    行。如果设置此选项,Monkey将继续向系统发送事件,直到计数完成.

    4.-ignore-timeouts:通常,当应用程序发生任何超时错误(如“Application 

    Not Responding”对话框)时,Monkey将停止运行。如果设置此选项,Monkey

    将继续向系统发送事件,直到计数完成.

    5.-ignore-security-exceptions:通常,当应用程序发生许可错误(如启动一

    个需要某些许可的Activity)时,Monkey将停止运行。如果设置了此选项,

    Monkey将继续向系统发送事件,直到计数完成

    6.-monitor-native-crashes:监视并报告Android系统中本地代码的崩溃事件

    。如果设置了–kill-process-after-error,系统将停止运行

    7.-kill-process-after-error:如果程序出现错误,monkey将结束此程序进程

    8.-hprof:设置此项,将在monkey事件序列之前和之后立即生成profilling

    报告。这将会在data/misc中生成大文件(约5mb)所以要小心使用它

    9.-pct-touch:调整触摸事件的百分比(触摸事件是一个down-up事件,它发

    生在屏幕的某单一位置)

    10.-pct-motion:动作事件的百分比(动作事件由屏幕上某处的一个down事件

    、一系列的随机事件和一个up事件组成)

    11.-pct-trackball:调整轨迹事件的百分比(轨迹事件由一个或几个随机移

    动组成,有时还伴随着点击)

    12.-pct-syskeys:调整系统按键事件的百分比(这些按键通常被保留,由系

    统使用,如home,back,start call,end call及音量控制)

    13.-pct-nav调整基本导航事件的百分比(导航事件来自方向输入设备的

    up/down/left/right组成)

    14.-pct-majornav:调整“主要”导航事件的百分比(这些导航事件通常引发

    图形界面中的动作,如:5-way键盘的中间按键、回退按键、菜单按键)

    15.-pct-appswitch:调整启动Activity的百分比。在随机间隔里,Monkey将执

    行一个startActivity()调用,作为最大程度覆盖包中全部Activity的一种方


    16.-pct-anyevent:调整启动Activity的百分比。它包罗了所有其它的事件类

    型,如:按键,其它不常用的设备按钮

    17.–wait-dbg:停止执行中的Monkey,直到有调试器和它相连接

    18.–dbg-no-events:设置此选项,Monkey将执行初始启动,进入到一个测试

    Activity,然后不会再进一步生成事件。为了得到最佳结果,把它与-v、一个

    或几个包约束、以及一个保持Monkey运行30秒或更长时间的非零值联合起来,

    从而提供一个环境,可以监视应用程序所调用的包之间的转换

    19.-port:为monkey开启专用端口。此时只monkey不会帮你乱点击,而此时你

    自己就是一只monkey了,在你乱点的时候,monkey会输出你点击后回馈的信息

    。如果你打完命令之后模拟器上没有启动你所要启动的包,你需要自己启动,

    但是你只能启动你-p中指定的那几个包。ctrl+c中断

    20.--throttle:当事件起效时等待的毫秒数

    21.-s:随机数生成器的seed值。如果用相同的seed值再次运行monkey,它将生

    成相同的事件序列

    22.COUNT:要发送的事件数

    5 常用的组合有一下几种

    1、monkey -p com.yourpackage -v 500简单的输出测试的信息。
    2、monkey -p com.yourpackage -v -v -v 500以深度为三级输出测试信息。
    3、monkey -p com.yourpackage --port端口号-v为测试分配一个专用的端口

    号,不过这个命令只能输出跳转的信息及有错误时输出信息。
    4、monkey -p com.yourpackage -s数字-v 500为随机数的事件序列定一个值

    ,若出现问题下次可以重复同样的系列进行排错。
    5、monkey -p com.yourpackage -v --throttle 3000 500为每一次执行一次

    有效的事件后休眠3000毫秒。

     以上信息参考的网上的内容,自己整理了一下。如有版权问题请联系我。
  • HTTP 状态代码

    2013-09-24 13:44:57

    HTTP 状态代码< xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" />

    如果向您的服务器发出了某项请求要求显示您网站上的某个网页(例如,当用户通过浏览器访问您的网页或在 Googlebot 抓取该网页时),那么,您的服务器会返回 HTTP 状态代码以响应该请求。

    此状态代码提供了有关请求状态的信息,且为 Googlebot 提供了有关您网站和请求的网页的信息。

    一些常见的状态代码为:

    • 200 - 服务器成功返回网页
    • 404 - 请求的网页不存在
    • 503 - 服务器暂时不可用

    以下提供了 HTTP 状态代码的完整列表。点击链接可了解详细信息。

    1xx(临时响应)
    用于表示临时响应并需要请求者执行操作才能继续的状态代码。

    代码

    说明

    100(继续)

    请求者应当继续提出请求。服务器返回此代码则意味着,服务器已收到了请求的第一部分,现正在等待接收其余部分。

    101(切换协议)

    请求者已要求服务器切换协议,服务器已确认并准备进行切换。

    2xx(成功)

    用于表示服务器已成功处理了请求的状态代码。

    代码

    说明

    200(成功)

    服务器已成功处理了请求。通常,这表示服务器提供了请求的网页。如果您的 robots.txt 文件显示为此状态,那么,这表示 Googlebot 已成功检索到该文件。

    201(已创建)

    请求成功且服务器已创建了新的资源。

    202(已接受)

    服务器已接受了请求,但尚未对其进行处理。

    203(非授权信息)

    服务器已成功处理了请求,但返回了可能来自另一来源的信息。

    204(无内容)

    服务器成功处理了请求,但未返回任何内容。

    205(重置内容)

    服务器成功处理了请求,但未返回任何内容。与 204 响应不同,此响应要求请求者重置文档视图(例如清除表单内容以输入新内容)。

    206(部分内容)

    服务器成功处理了部分 GET 请求。

    3xx(已重定向) 
    要完成请求,您需要进一步进行操作。通常,这些状态代码是永远重定向的。Google 建议您在每次请求时使用的重定向要少于 5 个。您可以使用网站管理员工具来查看 Googlebot 在抓取您已重定向的网页时是否会遇到问题。诊断下的抓取错误页中列出了 Googlebot 由于重定向错误而无法抓取的网址。

    代码

    说明

    300(多种选择)

    服务器根据请求可执行多种操作。服务器可根据请求者 (User agent) 来选择一项操作,或提供操作列表供请求者选择。

    301(永久移动)

    请求的网页已被永久移动到新位置。服务器返回此响应(作为对 GET  HEAD 请求的响应)时,会自动将请求者转到新位置。您应使用此代码通知 Googlebot 某个网页或网站已被永久移动到新位置。

    302(临时移动)

    服务器目前正从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。此代码与响应 GET  HEAD 请求的 301 代码类似,会自动将请求者转到不同的位置。但由于Googlebot 会继续抓取原有位置并将其编入索引,因此您不应使用此代码来通知 Googlebot 某个页面或网站已被移动。

    303(查看其他位置)

    当请求者应对不同的位置进行单独的 GET 请求以检索响应时,服务器会返回此代码。对于除HEAD 请求之外的所有请求,服务器会自动转到其他位置。

    304(未修改)

    自从上次请求后,请求的网页未被修改过。服务器返回此响应时,不会返回网页内容。

    如果网页自请求者上次请求后再也没有更改过,您应当将服务器配置为返回此响应(称为 If-Modified-Since HTTP 标头)。由于服务器可以告诉 Googlebot 自从上次抓取后网页没有更改过,因此可节省带宽和开销

    305(使用代理)

    请求者只能使用代理访问请求的网页。如果服务器返回此响应,那么,服务器还会指明请求者应当使用的代理。

    307(临时重定向)

    服务器目前正从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。此代码与响应 GET  HEAD 请求的 301 代码类似,会自动将请求者转到不同的位置。但由于Googlebot 会继续抓取原有位置并将其编入索引,因此您不应使用此代码来通知 Googlebot 某个页面或网站已被移动。

    4xx(请求错误) 
    这些状态代码表示,请求可能出错,已妨碍了服务器对请求的处理。

    代码

    说明

    400(错误请求)

    服务器不理解请求的语法。

    401(未授权)

    请求要求进行身份验证。登录后,服务器可能会返回对页面的此响应。

    403(已禁止)

    服务器拒绝请求。如果在 Googlebot 尝试抓取您网站上的有效网页时显示此状态代码(您可在Google 网站管理员工具中诊断下的网络抓取页面上看到此状态代码),那么,这可能是您的服务器或主机拒绝 Googlebot 对其进行访问。

    404(未找到)

    服务器找不到请求的网页。例如,如果请求是针对服务器上不存在的网页进行的,那么,服务器通常会返回此代码。

    如果您的网站上没有 robots.txt 文件,而您在 Google 网站管理员工具"诊断"标签的 robots.txt 上发现此状态,那么,这是正确的状态。然而,如果您有 robots.txt 文件而又发现了此状态,那么,这说明您的 robots.txt 文件可能是命名错误或位于错误的位置。(该文件应当位于顶级域名上,且应当名为 robots.txt)。

    如果您在 Googlebot 尝试抓取的网址上发现此状态(位于"诊断"标签的 HTTP 错误页上),那么,这表示 Googlebot 所追踪的可能是另一网页中的无效链接(旧链接或输入有误的链接)。

    405(方法禁用)

    禁用请求中所指定的方法。

    406(不接受)

    无法使用请求的内容特性来响应请求的网页。

    407(需要代理授权)

    此状态代码与 401(未授权)类似,但却指定了请求者应当使用代理进行授权。如果服务器返回此响应,那么,服务器还会指明请求者应当使用的代理。

    408(请求超时)

    服务器等候请求时超时。

    409(冲突)

    服务器在完成请求时发生冲突。服务器必须包含有关响应中所发生的冲突的信息。服务器在响应与前一个请求相冲突的 PUT 请求时可能会返回此代码,同时会提供两个请求的差异列表。

    410(已删除)

    如果请求的资源已被永久删除,那么,服务器会返回此响应。该代码与 404(未找到)代码类似,但在资源以前有但现在已经不复存在的情况下,有时会替代 404 代码出现。如果资源已被永久删除,那么,您应当使用 301 代码指定该资源的新位置。

    411(需要有效长度)

    服务器不会接受包含无效内容长度标头字段的请求。

    412(未满足前提条件)

    服务器未满足请求者在请求中设置的其中一个前提条件。

    413(请求实体过大)

    服务器无法处理请求,因为请求实体过大,已超出服务器的处理能力。

    414(请求的URI 过长)

    请求的 URI(通常为网址)过长,服务器无法进行处理。

    415(不支持的媒体类型)

    请求的格式不受请求页面的支持。

    416(请求范围不符合要求)

    如果请求是针对网页的无效范围进行的,那么,服务器会返回此状态代码。

    417(未满足期望值)

    服务器未满足"期望"请求标头字段的要求。

    5xx(服务器错误)
    这些状态代码表示,服务器在尝试处理请求时发生内部错误。这些错误可能是服务器本身的错误,而不是请求出错。

    代码

    说明

    500(服务器内部错误)

    服务器遇到错误,无法完成请求。

    501(尚未实施)

    服务器不具备完成请求的功能。例如,当服务器无法识别请求方法时,服务器可能会返回此代码。

    502(错误网关)

    服务器作为网关或代理,从上游服务器收到了无效的响应。

    503(服务不可用)

    目前无法使用服务器(由于超载或进行停机维护)。通常,这只是一种暂时的状态。

    504(网关超时)

    服务器作为网关或代理,未及时从上游服务器接收请求。

    505HTTP 版本不受支持)

    服务器不支持请求中所使用的 HTTP 协议版本。

     


  • 如何让你的QTP脚本执行效率更高?

    2013-05-09 17:36:35

    Launch QTP using a .vbs file and not the QTP desktop icon. You will notice a substantial increase in speed. (使用VBS文件来启动QTP。) 
    For large tests, always define variables, function in an external .vbs file and not inside a reusable action. Attach these files with your test scripts. If you define a variable or a function in an action, on every iteration of your test run, memory(RAM) will be allocated to those variables/functions and would not be released. Now as your script. starts consuming more and more RAM, your System Under Test (SUT) will tend to become slower. (把变量和函数定义放到外部VBS文件,而不要放在Action中。) 
    While running, QTP consumes a lot of memory by itself. It is always advisable to have lots of available RAM( much more than what is recommended by HP) and good processor speed on a system where you intend to install QTP. When you have tests (and hence QTP) running for a prolonged period if time, there are chances of memory leaks. To avoid memory leakage always restart QTP at some intervals of time. Using AOM you can automate this process. (通过AOM控制QTP重启来解决QTP内存泄漏问题。) 
    Avoid using hard coded wait(x) statement. Wait statement waits for full x seconds, even if the event has already occurred. Instead use .sync or exist statement. While using exist statement always have a value inside it. (尽量不要使用wait,而使用.sync或exist语句。) 
    For ex: .Exist(10) Here QTP will wait max till 10 seconds and if it finds the object at (say) 3 secs , it will resume the execution immediately thereby saving your precious time. On the other hand if you leave the parenthesis blank, QTP would wait for object synchronization timeout you have mentioned under File > Test Settings > Run Tab.

    Make full use of what HP-QTP has provided you in the tool IDE. Use “Automatically Generate “With” statements after recording” option present under Tools > Options > General Tab. This will not only make your code look neater but also make your scripts perform. better. (使用With语句可以让代码更清晰,而且效率更好。) 
    Make your own judgement whether you want to go for Descriptive Programming or Object Repository or mixed approach. Each approach has it own pros and cons that in turn is related to QTP performance.(使用OR要比DP快点。) 
    Unless absolutely required, uncheck the options “Save still image capture to results” and “Save movie to results” present under Tools > Options > Run tab. These options definitely have some bearing on QTP run time performance.(不要保存image和movie到测试结果中。) 
    Make the Run Mode as “fast”. This setting is present under Tool > Options > Run tab. Note: If you intend to run your scripts from QC no need to worry about this option, as the scripts WILL run in fast mode whether you want or not. (把运行模式设置为fast。) 
    If you are new to automation or QTP. Read this beginner article on Automation Object Model (AOM). AOM simplifies many aspects of QTP scripting. It can help you in controlling QTP from an external file. (通过AOM控制QTP。) 
    Make use of relative paths while calling reusable actions in your script. Using relative path would make your script. portable and easy to manage. (在调用Action时使用相对路径。) 
     

    可以使用下面的代码测试一下使用与不使用With语句在代码效率上的差异 :

    Dim StartTime, EndTime, StartTime1, EndTime1

     

    SystemUtil.Run "C:/Program Files/HP/QuickTest Professional/samples/flight/app/flight4a.exe"

     

    With Dialog("Login")

    .WinEdit("Agent Name:").Set "mercury"

    .WinEdit("Agent Name:").Type micTab

    .WinEdit("Password:").SetSecure "4864ede3f3f8f30757cf694e3e100d29bf1ea9b9"

    .WinEdit("Password:").Type micReturn

    End With

     

    StartTime = Timer

    For i=1 to 100

           Window("Flight Reservation").WinEdit("Name:").Set "Ankur"

    Next

    'With Window("Flight Reservation")

    'For i=1 to 100

    '.WinEdit("Name:").Set "Ankur"

    'Next

    'End With

    EndTime = Timer

    Print  EndTime - StartTime

     

     

     


    在测试WEB应用程序时,往往看到QTP运行速度比被测试的应用程序要快很多,往往都是QTP在等待页面加载完成。


    While working on a web applications using QTP, you may have noticed most of the time QTP runs too fast in comparison to the application. Moreover QTP would not perform. any operation on a particular page unless that page has loaded completely (100%). You may wonder in bewilderment about what to do to make the application (web page) load faster.

    如何让页面加载得更快呢?关键在于图片的加载。

    Here I would like to give you a simple tip to alleviate your pain (and waiting time) a bit.

    If you will notice carefully, most of the times text on a web page renders very quickly. It is the images that creates problem and increases the web page loading time. What if we can stop the images from loading altogether?


    All browsers provides this facility whereby you can stop pictures from showing. To do this in IE6, go to Tools > Internet Options > Advanced tab. Scroll down to ‘Multimedia’ section and uncheck ‘Show pictures‘.

     

    To do this in Firefox, go to Tools > Options > Content. Uncheck ‘Load Images automatically‘


    Run your script. now and let us know if this tip helped you. [For obvious reasons, this tip won't be of any use when you have to work on image/bitmap checkpoints.]

    当然,如果考虑到图片检查点的话,这个技巧就没用了。
  • 导致IE浏览器内存泄漏的研究

    2013-04-19 10:28:04

    昨天打开一个门户网站的时候发现IE浏览器有点卡,这个时候打开了任务管理器查看了一下,发现IE浏览器进程的内存竟然达到了423,145K,记得平时浏览这个网站的时候还很正常,这个网站的JS广告代码很多,怀疑JS导致IE发生了内存泄漏,因此打算来检测一下,用的工具是IE的插件js memory leaks dector,但是从新进行了一些可能引起内存泄漏的操作后,发现测试的结果好像并没有问题,没有发现关于内存泄漏的地方。这个时候想到会不会是IFRAM没有被销毁,加重了ie浏览器的负担,损耗了大量的内存使用。

    怀着一探到底去决心,去网上查找了一些技术文档,发现用SIEVE来测试此类系统的IE内存泄漏时,通常在报表刷新的过程中,通常是会发生IE的内存泄漏的,因此,用SIEVE从新测试了一下,果然跟网上说的一样,登录后,内存泄漏显示位58,在报表每次刷新的时候,内存泄漏显示+1,在切换报表的时候,内存泄漏在原基础上又增加了7,然后再退出的时候,内存泄漏由原来的77一下增加到了1200多。通过此工具记录下的发生内存泄漏的ID和TAG名称,可查找出发生内存泄漏的代码。

        关于内存泄漏这个词的理解,其实比较通俗简单的意思就是已经不再被使用的资源,哪些资源实际上是应该被释放的资源,而现在程序里面并没有被释放除去,所以导致程序占用的内存一直在增多的现象。针对IE浏览器发生的内存泄漏,引起IE内存泄漏的主要情况为js对象实例跟dom对象的相互引用、“内部函数引用(Closures)”以及DOM插入顺序泄漏,其中最常见的就是js对象实例跟dom对象的相互引用,对基于对象的JScript,一个通常用法是通过封装JScript对象来扩充DOM对象,在构建的过程中,通常在涉及DOM对象时,建立一个对DOM对象的引用,DOM对象也建立一个指向JS对象实例的引用,这就形成了一个循环,虽然不管js调用dom还是从dom反向找到实例都非常方便,但如果在对象销毁或document unload的时候不去解除他们之间的引用,就会引起内存泄漏。JS的GC可以识别循环,当对dom节点和事件处理函数的引用消失,会自动回收,但是IE自己的内存管理器并不识别循环,因此占用的内存没有被回收,就会发生内存泄漏。例如:我在用IE浏览器访问当前的页面进行刷新时,由于在之前还访问了别的页面占用的内存一直没有释放,导致程序占用的内存不断的升高。

    Java leak memorys detector通过在访问每个URL结束时给出测试解果,如果IE在访问当前页面的过程中没有发生内存泄漏,那么URL显示为绿色,如果发生了内存泄漏,显示为红色,通过这个软件我们可以记录下发生内存泄漏的详细信息,左侧部分显示发生内存泄漏的代码位置为粗体字,在中间的两格中显示详细信息与CALL STACK,右侧显示发生内存泄漏的完整的代码。

    SIEVE通过在地址栏输入要访问的系统地址来进行操作测试,中间直接显示要访问的系统界面,下栏显示COM和DOM的使用情况,右侧显示实时数据:内存使用情况,内存泄漏等,如果发生内存泄漏可以通过右侧数据看出,然后点击show leaks的按钮可以看到发生内存泄漏的详细信息如ID等,不过不是所有发生内存泄漏的都会被记录下所有的详细信息,只有很少一部分ID被记录下来,还可通过界面上的自动刷新按钮对系统进行刷新,代替了手工刷新。但是此工具使用起来占用内存很大,进行操作比较多后会无响应,有些操作还会引起工具自动关闭,在复制出内存泄漏信息时只能选择全部的详细信息,不能滤掉一些没有必要的信息和空信息,造成使用不是很方便。

        写在最后,关于IE浏览器内存泄漏的查找确实是一件比较麻烦的,首先要求工作人员本身需要拥有一定的内存泄漏的查找经验,更重要的是需要有一定的耐心,当然,如果你有一个好用的工具查找起来会更加的方便有效,其实我个人对于IE浏览器的内存泄漏测试和查找我也是处于刚刚学习起步的状态,此次整个研究的过程希望与大家一起来分享经验,大家共同的学习进步。

  • 自动化测试实践经验和教训

    2013-04-19 09:53:49

    http://www.51testing.com/html/31/n-844231.html
  • fireevent

    2013-03-15 17:42:16

    QTP Web操作时,当鼠标移到某个对象上时,才会出现对应的操作,而这些都是通过JS来实现的,所以使用Click事件,无法成功达到我们想要的结果。 

      还好,对应JS中的FireEvent方法,QTP中也有对应的,它支持的事件 

      有:onchange, onclick,ondblclick, onblur, onfocus, onmousedown, onmouseup,

             onmouseover, onmouseout, onsubmit,onreset, onpropertychange。

      对上述情况,使用onmouseover即可实现,当onmouseover完成之后,再去执行接下来的操作,就能顺利通关了。

    灵活运用FireEvent可以实现JS多样性的操作。

  • VBScript操作Excel

    2013-01-10 15:09:07

    以下是一些VBScript操作Excel的实例,比如如何通过VbS打开Excel,新建Excel、Sheet,删除

    Sheet,另存Excel文件,在指定的Sheet Cells中写入以及读取Sheet中usedRange中的内容。

     

    '==========================================================================
    ' VBScript. Source File -- Created with SAPIEN Technologies PrimalScript. 4.1
    ' NAME:Example1
    ' AUTHOR: Weibin , cpic-ing
    ' DATE  : 2011-1-31
    ' COMMENT: 打开Excel文件
    '==========================================================================
    Dim xlsApp,xlsWorkBook,xlsSheet
    Dim iRowCount,numAdd
    Set xlsApp = CreateObject("Excel.Application") '创建Excel对象
    xlsApp.Visible = True 'true 为显示excel对象,false为不显示
    Set xlsWorkBook = xlsApp.Workbooks.Open ("d:\data.xls") '打开指定路径的Excel表格
    Set xlsSheet = xlsWorkBook.Sheets("sheet1") '选择指定Sheet1
    iRowCount = xlsSheet.usedRange.Rows.Count '获取sheet中有内容的Rowcount行数
    For iLoop = 2 To iRowCount
    numAdd = xlsSheet.Cells(iLoop,1) '取Cells中的值
    MsgBox iLoop '显示第一列从第二行开始到iLoop行为止。
    Next
    xlsWorkBook.Save
    xlsWorkBook.Close
    xlsApp.Quit
    Set xlsApp = Nothing  '释放Excel对象
    Set xlsWorkBook = Nothing '释放内存
    Set xlsApp = Nothing '释放内存


    '==========================================================================
    ' VBScript. Source File -- Created with SAPIEN Technologies PrimalScript. 4.1
    ' NAME:Example2
    ' AUTHOR: Weibin , cpic-ing
    ' DATE  : 2011-1-31
    ' COMMENT: 打开Excel文件
    '==========================================================================
    rem 打开Excel文件,Excel及sheet2需预先建立,不然找不到要打开的文件
    Dim xlsApp,xlsWorkBook,xlsSheet
    Set xlsApp = CreateObject("Excel.Application") '创建Excel对象
    Set xlsWorkBook = xlsApp.Workbooks.Open ("d:\weibin\2010.xls")'打开指定路径的Excel表格
    xlsApp.Visible = True 'true 为显示excel对象,false为不显示
    Set xlsSheet = xlsApp.Sheets.Item("Sheet2")'选择指定Sheet2
    xlsWorkBook.Save '保存工作
    'xlsApp.Quit '退出Excel对象
    Set xlsApp = Nothing  '释放Excel对象
    Set xlsWorkBook = Nothing '释放内存
    Set xlsApp = Nothing '释放内存


    rem 将上面的一段程序封装成Function函数,Exel文件路径作为参数。
    Function OPenExcelFile(FilePath)
    Dim xlsApp,xlsWorkBook,xlsSheet
    Set xlsApp = CreateObject("Excel.Application") '创建Excel对象
    Set xlsWorkBook = xlsApp.Workbooks.Open (FilePath)'打开指定路径的Excel表格
    xlsApp.Visible = True 'true 为显示excel对象,false为不显示
    Set xlsSheet = xlsApp.Sheets.Item("Sheet2")'选择指定Sheet2页
    xlsWorkBook.Save '保存工作表
    'xlsApp.Quit '退出Excel对象
    Set xlsApp = Nothing  '释放Excel对象
    Set xlsWorkBook = Nothing '释放内存
    Set xlsApp = Nothing '释放内存
    End Function


    '==========================================================================
    ' VBScript. Source File -- Created with SAPIEN Technologies PrimalScript. 4.1
    ' NAME:Example3
    ' AUTHOR: Weibin , cpic-ing
    ' DATE  : 2011-1-31
    ' COMMENT: 另存Excel文件
    '==========================================================================
    rem 新建Excel文件并保存到一个指定位置,并在Sheet2中写入值
    Dim xlsApp,xlsWorkBook,xlsSheet
    Set xlsApp = WScript.CreateObject("Excel.Application") '定义一个Excel对象
    Set xlsWorkBook = xlsapp.Workbooks.Add '新建一Excel实例
    xlsApp.Visible = True '显示Excel对象
    Set xlsSheet = xlsApp.Sheets.Item(2) '获取工作簿的第二个Sheet页
    ' xlsApp.Sheets.Item(2).Select '与上一句有相同的功能
    xlsSheet.Cells(1,1).Value = "Hello World!" '在单元格录入Hello World
    xlsApp.ActiveWorkbook.SaveAs ("d:\test.xls") '保存工作表
    xlsApp.Quit '退出
    Set xlsSheet = Nothing '释放内存
    Set xlsWorkBook = Nothing '释放内存
    Set xlsApp = Nothing '释放内存


    rem 将上面的一段程序封装成Function函数,Exel文件路径作为参数。
    Function CreateExcelFile(FilePath)
    Dim xlsApp,xlsWorkBook,xlsSheet

    Set xlsApp = WScript.CreateObject("Excel.Application") '定义一个Excel对象
    Set xlsWorkBook = xlsapp.Workbooks.Add '新建一Excel实例
    xlsApp.Visible = True '显示Excel对象
    Set xlsSheet = xlsApp.Sheets.Item(2) '获取工作簿的第二个Sheet页
    ' xlsApp.Sheets.Item(2).Select '与上一句有相同的功能
    xlsSheet.Cells(1,1).Value = "Hello World!" '在单元格录入Hello World
    xlsApp.ActiveWorkbook.SaveAs (FilePath) '保存工作表
    xlsApp.Quit '退出

    Set xlsSheet = Nothing '释放内存
    Set xlsWorkBook = Nothing '释放内存
    Set xlsApp = Nothing '释放内存
    End Function


    '==========================================================================
    ' VBScript. Source File -- Created with SAPIEN Technologies PrimalScript. 4.1
    ' NAME:Example4
    ' AUTHOR: Weibin , cpic-ing
    ' DATE  : 2011-1-31
    ' COMMENT: 添加新的Sheets并且命名另存
    '==========================================================================
    rem excel新建,sheet新建,重命名后另存
    Dim xlsApp,xlsWorkBook,xlsSheet
    Set xlsApp = WScript.CreateObject("Excel.Application") '新建一Excel实例
    xlsApp.Visible = True '显示Excel对象
    Set xlsWorkBook = xlsapp.Workbooks.Add()  '新建一Excel实例
    Set xlsSheet = xlsWorkBook.Sheets.Add() '新建一新Sheet
    xlsSheet.name "Practise" '新Sheet命名为Practise
    xlsSheet.activate '激活sheet
    xlsSheet.range("A1:B5").Value = "Hello World" '在新sheet range A1至B5中中写入Hello World
    xlsApp.ActiveWorkbook.SaveAs "D:\weibin\Hope.xls" '保存Excel至D:\weibin
    xlsApp.Quit '退出
    Set xlsSheet = Nothing '释放内存
    Set xlsWorkBook = Nothing '释放内存
    Set xlsApp = Nothing '释放内存

    rem 封装AddSheets函数
    Function AddSheets(FilePath)
    Dim xlsApp,xlsWorkBook,xlsSheet
    Set xlsApp = WScript.CreateObject("Excel.Application") '新建一Excel实例
    xlsApp.Visible = True '显示Excel对象
    Set xlsWorkBook = xlsapp.Workbooks.Add()  '新建一Excel实例
    Set xlsSheet = xlsWorkBook.Sheets.Add() '新建一新Sheet
    xlsSheet.name "Practise" '新Sheet命名为Practise
    xlsSheet.activate '激活sheet
    xlsSheet.range("A1:B5").Value = "Hello World" '在新sheet range A1至B5中中写入Hello World
    xlsApp.ActiveWorkbook.SaveAs (FilePath) '保存Excel至D:\weibin
    xlsApp.Quit '退出
    Set xlsSheet = Nothing '释放内存
    Set xlsWorkBook = Nothing '释放内存
    Set xlsApp = Nothing '释放内存
    End Function
    AddSheets "c:\weibin\hope.xls"

     

    '==========================================================================
    ' VBScript. Source File -- Created with SAPIEN Technologies PrimalScript. 4.1
    ' NAME:Example5
    ' AUTHOR: Weibin , cpic-ing
    ' DATE  : 2011-1-31
    ' COMMENT: 删除新建Excel指定的Sheet
    '==========================================================================
    Rem 删除指定的Sheet1,设定不同的n,可以删除不同的Sheet
    Function DeleteSheet(n)
    Dim xlsApp,xlsWorkBook,xlsSheet
    Set xlsApp = WScript.CreateObject("Excel.Application") '新建一Excel实例
    Set xlsWorkBook = xlsapp.Workbooks.Add()  '新建一Excel实例
    xlsApp.Visible = True '显示Excel对象
    xlsWorkBook.Worksheets("Sheet"&n).Delete
    xlsApp.Quit '退出
    Set xlsSheet = Nothing '释放内存
    Set xlsWorkBook = Nothing '释放内存
    Set xlsApp = Nothing '释放内存
    End Function
    DeleteSheet(1)

     

    '==========================================================================
    ' VBScript. Source File -- Created with SAPIEN Technologies PrimalScript. 4.1
    ' NAME:Example6
    ' AUTHOR: Weibin , cpic-ing
    ' DATE  : 2011-1-31
    ' COMMENT: 创建,写入,保存Excel文件
    '==========================================================================
    Function CreateWriteSaveAsExcelFile(n,i,j,FilePath)
    Dim xlsApp,xlsWorkBook,xlsSheet
    Set xlsApp = WScript.CreateObject("Excel.Application") '新建一Excel实例
    Set xlsWorkBook = xlsApp.Workbooks.Add()  '新建一Excel实例
    xlsapp.Visible = True '显示Excel对象
    Set xlsSheet = xlsApp.Sheets.Item(n) '获取工作簿的第二个Sheet页
    ' xlsApp.Sheets.Item(2).Select '与上一句有相同的功能
    ' xlsWorkBook.Worksheets("Sheet1").activate '与上一句有相同功能
    xlsSheet.Cells(i,j).Value = "For Testing" '在单元格录入For Testing
    ' xlsWorkBook.Worksheets("Sheet2").Cells(1,1).Value = "For Testing" '与上一句有相同功能
    xlsApp.ActiveWorkbook.SaveAs (FilePath) '保存工作表
    xlsApp.Quit '退出
    Set xlsSheet = Nothing '释放内存
    Set xlsWorkBook = Nothing '释放内存
    Set xlsApp = Nothing '释放内存
    End Function
    CreateWriteSaveAsExcelFile (1,2,2,"c:\weibin\Practice.xls")

    '==========================================================================
    ' VBScript. Source File -- Created with SAPIEN Technologies PrimalScript. 4.1
    ' NAME:Example7
    ' AUTHOR: Weibin , cpic-ing
    ' DATE  : 2011-3-10
    ' COMMENT: 比较InsuredNo,若相同写入新创建的Sheet中

    '==========================================================================
    Option Explicit
    On Error Resume Next
    '定义相关变量
    Dim xlsApp,xlsWorkBook,xlsSheet
    Dim iRowCount
    Dim a()
    Dim b()
    Dim oLoop,xLoop,jLoop
    Dim i
    Dim rowCount

    Set xlsApp = CreateObject("Excel.Application") '创建Excel对象
    xlsApp.Visible = True 'true 为显示excel对象,false为不显示
    Set xlsWorkBook = xlsApp.Workbooks.Open ("d:\tmp001.xlsx") '打开指定路径的Excel表格
    Set xlsSheet = xlsWorkBook.Sheets.add()'
    xlsWorkBook.ActiveSheet.Name = "Collection"
    xlsSheet.Cells(1,1).Value = "InsuredNo"
    xlsSheet.Cells(1,2).Value = "ContNo"
    xlsWorkBook.ActiveSheet.Rows(1).Font.Bold = True

    Set xlsSheet = xlsWorkBook.Sheets("SQL Results") '选择指定Sheet1
    iRowCount = xlsSheet.usedRange.Rows.Count '获取sheet中有内容的Rowcount行数

    '声明动态数组变量并分配或重新分配存储空间
    WScript.Echo "通知:声明动态数组变量并分配或重新分配存储空间开始,请等待!"
    ReDim a(iRowCount-2)
    ReDim b(iRowCount-2)
    WScript.Echo "通知:声明动态数组变量并分配或重新分配存储空间成功!"

    '文件中逐行读取,并记录数到组a,b中
    WScript.Echo "通知:读取InsuredNo和ContNo到数组a,b开始!,读取完后有提示,请耐心等待!"
    For Loop = 0 To iRowCount - 2
    a(oLoop)= xlsSheet.Cells(oLoop + 2,27).Value
    b(oLoop)= xlsSheet.Cells(oLoop + 2,3).Value
    Next
    WScript.Echo "通知:读取InsuredNo和ContNo到数组a,b成功!"
     
    ' 比较InsuredNO
    WScript.Echo "通知:数据筛选开始,请耐心等待!"
    Set xlsSheet = xlsWorkBook.Sheets("Collection") '选择指定Sheet1
    For xLoop = 0 To iRowCount - 2
    For jLoop = xLoop + 1 To iRowCount - 2
    If a(xLoop) = a(jLoop) Then
    xlsApp.Worksheets("Collection").Cells(xLoop + 2,1).Value = a(jLoop)
    xlsApp.Worksheets("Collection").Cells(xLoop + 2,2).Value = b(jLoop)
    End If
    Next
    Next
    WScript.Echo "通知:数据筛选完成,并写入Excel中成功!"
    xlsWorkBook.Save
    xlsWorkBook.Close
    xlsApp.Quit
    Set xlsApp = Nothing  '释放Excel对象
    Set xlsWorkBook = Nothing '释放内存
    Set xlsSheet = Nothing '释放内存
    WScript.Echo "通知:保存并关闭Excel,释放内存成功!"

  • getElementById()

    2013-01-07 16:52:58

    getElementById:
    语法: document.getElementByIdx_x(id)
    参数: id :必选项为字符串(String)
    返回值:对象; 返回相同id对象中的第一个,如果无符合条件的对象,则返回 null
    example:document.getElementByIdx_x("id1").value;
    getElementsByName:
    语法: document.getElementsByName(name)
    参数: name :必选项为字符串(String)
    返回值:数组对象; 如果无符合条件的对象,则返回空数组
    example:document.getElementsByName("name1")[0].value;
    document.getElementsByName("name1")[1].value;


    getElementsByTagName:
    语法: object.getElementsByTagName_r(tagname) object可以是document或event.srcElement.parentElement等
    参数: tagname:必选项为字符串(String)
    返回值:数组对象; 如果无符合条件的对象,则返回空数组
    example:document.getElementsByTagName_r("p")[0].childNodes[0].nodeValue;
    document.getElementsByTagName_r("p")[1].childNodes[0].nodeValue;

    --------------------------------------------------------------------------------
    getElementsByTagName_r() 不只是用在全局,更多的用法是:
    obj.getElementsByTagName_r();
    obj可以是任何对象。
    --------------------------------------------------------------------------------
    var all = document.getElementsByTagName_r('div')[0].getElementsByTagName_r('*');
    就是取document.getElementsByTagName_r('div')[0]这个节点下边的所有。
    准确的说应该是所有Element类型的节点,不包括TextNode类型的节点。
    getElementsByTagName_r('*') *就像通配符一样,表示所有的TagName。
    --------------------------------------------------------------------------------
    document.getElementsByTagName_r('ul')[0].childNodes就是li的数组
    它的长度就是li的个数
  • QTP经验总结

    2012-12-05 22:59:56

    1、拆分语句split
    例:取得当前日期后拆分
    riqi=date()
        my=split(riqi,"-")
        riqi=my(1)&"月"&my(2)&"日" 
        datatable("riqi",DtGlobalSheet)=riqi
        本地表:DataTable("a", dtLocalSheet)
    riqi= year(date)& "-" & Right("0"& month(date),2) & "-"&Right("0"&   Day(Date),2)

    2、取得表格中某行某列的值GetCellData
    例:飞机票取票价
    shuA=Browser("Welcome: Mercury Tours").Page("Book a Flight: Mercury").WebTable("New York to Zurich").GetCellData(3,3)


    3、取距某年某月某日的天数datediff
    例:计算距2008-08-08奥运天数
    datediff("d",now,"2008-8-8")


    4、描述性编程text:=
    例:取得某页面上某文字的链接
    Browser("").Page("").Link("text:=娱乐").Click
         或
         neirong="娱乐"
         Browser("").Page("").Link("text:="&neirong).Click


    5、网页中HTML编辑器的录制
    功能:验证126邮箱的发信功能正确
    操作步骤:
          a.录制脚本,动作包括整个发信的过程。
          b.修改脚本,在输入信件主题代码后加wait 10语句
           c.回放脚本,观察在邮件正文中输入的内容,回放时QTP是否写入
          d.重新修改脚本,保证回放时QTP在邮件正文中写入内容

    英文解决方案:
        Browser("网易126免费邮--你的专业电子邮局").Page("网易电子邮箱 - xueqinzhaoqing@126.co").Frame("indexFrame").WebEdit("subject").Click
        wait 1
         Setting.WebPackage( "ReplayType")=2      '配置使用浏览器事件或鼠标运行鼠标操作的'方式.1 - 使用浏览器事件运行鼠标操作,2 - 使用鼠标运行鼠标操作。
         Set ōbj=createobject("wscrīpt.shell") 
         obj.sendkeys "{TAB}"
         wait 2 
         obj.sendkeys "abc1111"
         wait 1
         Setting.WebPackage( "ReplayType")=1
    中文解决方案

    strCopy = "软件测试." 
    Set ōbjIE = CreateObject("InternetExplorer.Application") 
    objIE.Navigate("about:blank") 
    objIE.document.parentwindow.clipboardData.SetData "text", strCopy 
    objIE.Quit

    wait 1
    Setting.WebPackage( "ReplayType")=2
    Set ōbj=createobject("wscrīpt.shell") 
    obj.sendkeys "{TAB}"
    wait 2 
    obj.sendkeys "^v"
    wait 1
    Setting.WebPackage( "ReplayType")=1

    6.使用Multi Test Manager添加文件时可以直接往里拖的哦。

    7.函数:新建记事本,改名为public.vbs例:
       function ZHIRSS
    ZHIRSS="RSS行业资讯分类维护"
    end function
    使用语句executefile "d:\zhaopin\case\denglu.vbs"或设置QTP test/settings/resources/+函数目录

    8.设置动作循环:右击/actiong call properties/run on all rows

    9.设置动作允许被调用:右击/action properties/general/reusable action打勾

    10.QTP与MTM连接:Tools/option/run/allow other mercury products to run...

    11.插入已存在的动作1)insert/call to copy of action...复制可修改
                       2)insert/call to existing of action...复制不可修改

    12.QTP报告自动跳出设置:Options>Run>View results when run session ends

    13.判断表格是否存在:
    If Browser("数商3.0后台管理系统").Page("Page").Frame("main_5").WebTable("标题").Exist then
    reporter.ReportEvent 0,"pass","系统显示了所有的资讯列表!"
    else
    reporter.ReportEvent 1,"fail","系统没有显示资讯列表!"
    end if

    14.获取表格行数:Browser("数商3.0后台管理系统").Page("Page").Frame("main_5").WebTable("标题").RowCount

    15.注释脚本存在位置:qtp/dat/ActionTemplate.mst

    16取本地文件名称Function ShowFileList(folderspec)
       Dim fso, f, f1, fc, s
       Set fso = CreateObject("scrīpting.FileSystemObject")
       Set f = fso.GetFolder(folderspec)
       Set fc = f.Files
       For Each f1 in fc
          s = s & f1.name 
          s = s &   " "
       Next
       ShowFileList = s
    End Function
    wenjian=ShowFileList("D:\下载\本地下载1\")

    17.取本地文件删除:del= DeleFile("D:\下载\本地下载1\")
    Function DeleFile(folderspec)
       Dim fso, f, f1, fc, s
       Set fso = CreateObject("scrīpting.FileSystemObject")
       Set f = fso.GetFolder(folderspec)
       Set fc = f.Files
       For Each f1 in fc
             f1.delete
       Next
    End Function

    18.sousuo2=Browser("Browser").Page("Page_4").Check (CheckPoint("2007-11-08 14:21"))
    If (sousuo2)eqv(true) Then
        reporter.ReportEvent 0,"",""
    else 
       reporter.ReportEvent 1,"",""
    End If

    19.取参数化数据的行数,只在某几行进执行某些语句
    row=datatable.GetSheet(3).getcurrentrow
    If row = 3 Or row = 4 Then

    20.单选框置灰zhihui=Browser("下载中心--新增下载文件").Page("下载中心--新增下载文件_4").WebRadioGroup("downloadType").GetROProperty("disabled")
    If zhihui=1 Then
    End If

    29.取树结构
    Set Desc=descrīption.create
    Desc("miclearcase/" target="_blank" >cclass").value="WebTable"
    Set List=Browser("Browser").Page("Page").Frame("main").ChildObjects(Desc)
    yuqi=List(0).GetROProperty("innertext")
    msgbox yuqi
    yuqi=split(yuqi," ")
    msgbox yuqi(1)

    30.关闭所有IE
    SystemUtil.CloseProcessByName("iexplore.exe")

    31.创建action template.
        当希望在每一个新建action时都增加一些头部说明,比如作者、创建日期、说明等,用action template
        来实现最简单快捷。
        方法:用记事本等文本编辑器,输入如下类似的内容:
              'Company: xxxx
              'Author: xxx
              'Product: xxx
              'Date: xx
             然后将文件保存为ActionTemplate.mst,并存放到QTP安装目录下的dat目录。

    32.启动IE的语句:SystemUtil.Run "iexplore.exe", "http://www.***.com" 
       关闭IE或其他程序的语句:SystemUtil.CloseProcessByName "app.exe"
         or SystemUtil.CloseProcessByWndTitle "Some Title"

    33.获取图片的名称
    ObjectName = Browser(…).Page(…).Image("Find").GetProperty("Name")

    34.检查某个对象是否存在,如果存在弹出对话框说明对象存在。
    If Browser("Browser").Page("Page").Applet("login.html").JavaEdit("username").Exist Then
    MsgBox("The object exists.")
    End if

    35.同步点
    Browser("数商3.0制作平台").Dialog("Microsoft Internet Explorer").WaitProperty "visible", True, 120000
    设置test/test settings/object synchronizationg timeout 一致

    36.视图框显示为乱码时:调整原页面编码,在QTP/tools/change active screen

    37.添加附件:
       Browser("**").Page("**").WebFile("filePath").Click
    Browser("**").Dialog("**").WinEdit("文件名(N):").Set "D:\**.jpg"
    Browser("下载中心--新增下载文件").Dialog("选择文件").WinButton("打开(O)").Click
    添加相应的对象


    38.在图片上右击添加:tools/web event recording configuration/custom settings
    webedit/event/add/onblur,onchange,onfocus,onpropertychan,onsubmit
    webdlement/event/add/onclick,onmousedown,onmouseup/listen always

    39.数据执行保护
    方法一、右击我的电脑/高级/性能/设置/数据执行保护/为除下列选定程序之外的所有程序和服务启用DEP/添加被保护的程序。
    方法二、C:/BOOT.INT修改noexecute=alwaysoff

    40.在图片上右击添加:tools/web event recording configuration/custom settings
    webedit/event/add/onblur,onchange,onfocus,onpropertychan,onsubmit
    webdlement/event/add/onclick,onmousedown,onmouseup/listen always

    41.去掉前后空格
    If trim(mingcheng)=trim(yuqi) Then

    42.分类树问题解决
    Set Desc=descrīption.create
    Desc("micclass").value="WebTable"
    Set List=Browser("Browser").Page("Page").Frame("main").ChildObjects(Desc)
    yuqi=List(0).GetROProperty("innertext")
    msgbox yuqi
    yuqi=split(yuqi," ")
    msgbox yuqi(1)


    43.引用自定义环境变量
    Environment.LoadFromFile "D:\询价\case\环境\huiyuan.xml"

    44. 环境变量有2种,一种是QTP的内置变量,一种是用户自定义的变量。内置变量是可以直接就可以用,自定义环境变量需要在菜单中选择“文件”——> “设置”——>“环境”,在变量类型中选择“用户自定义”,然后进行添加,可以对添加的变量全部导出,导出的文件为.xml格式的文档。既然可以导 出,那么必然可以导入.xml文件,你可以在该对话框中的选中“从外部文件导入”,然后添加其文件路径即可。(当然这些操作都可以直接使用脚本来实现, 如:Environment.LoadFromFile(“FileName”))
    例如:在桌面建立一个Var.xml,如下
    -<Environment>    //以这个开始的内部都是定义环境变量,直到以</Environment>结束
    - <Variable>                           // 变量定义起始标识
                     <Name>aa</Name>               // 变量名称 
                     <Value>11</Value>               // 变量值
            </Variable>                            // 变量定义结束标识
    - <Variable>
                     <Name>bb</Name> 
                     <Value>22</Value> 
            </Variable>
    - <Variable>
                     <Name>cc</Name> 
                     <Value>33</Value>


                  </Variable>
    </Environment>
    然后导入本测试的环境变量文件中,在专家视图里编写下面的脚本代码:
    Dim aParam3
    aParam3=Environment.Value(“aa”)          // 调用环境变量
    msgbox aParam3
    运行测试,会输出”11”

    45.在HTML编辑器中写入数据
    用低水平录制写入编辑器过程,增加编辑部器前的对象,加入click事件,再用TAB
    例如:
    Browser("广告管理").Page("广告管理").WebEdit("descrīption").Click
    Window("Microsoft Internet Explorer").WinObject("Internet Explorer_Server").Type mictab
    Window("Microsoft Internet Explorer").WinObject("Internet Explorer_Server").Type "aaa"

    46.Browser("creationtime:=1").close
       两个页面title相同无法识别时使用描述必编辑
        Browser("creationtime:=1").page(title:=****).WebEdit("name:=***").Set "***"
        或Browser("creationtime:=1").page(index:=1).WebEdit("index:=0").Set "***"

    47.场景恢复:
       当某些提示框会在不定期时有提示时,如果自动点击确定或某些按钮
       1、tools/recovery scenaril manager,制作相应的提示框和要点击的按钮,并保存
       2、test/settings/recovery,添加刚保存的.qrs

    48.输入验证码,先提示一个输入框,在输入框内输入验证码,点击[确定],把输入的验证码框
       Dim a
    a = InputBox("输入名字")

    49.对象库中对象名称不分为_2,_3...设置:tool/options/web/page/fram options/
         crate a new page test object for为different test object descrīptons
         crest a new frame. test object for为different test object descrīptions

    50.验证测试输入框输入的最大允许字数功能的正确

    QTP脚本代码中编写
    Set aa=Browser("Browser").Page("Page").Frame("main").WebEdit("PayTypeName")
    if konglen(aa,20) eqv true then 
    reporter.ReportEvent 0,"添加支付方式,支付方式输入框允许输入的最大字符功能正确",""
    else
    reporter.ReportEvent 1,"添加支付方式,支付方式输入框允许输入的最大字符功能错误",""
    end if

    此函数的功能为:验证测试输入框输入的最大允许字数功能的正确,函数可写在public.vbs中
    Function konglen(duixiang,guifanshu)
    duixiang.Click
    wait 1
    Setting.WebPackage( "ReplayType")=2
    Set ōbj=createobject("wscrīpt.shell") 
    i=0
    ōld="a"
    xin="b"
    while old<>xin
    ōld=duixiang.GetROProperty("value")
    i=i+1
    wait 0,20
    obj.sendkeys "1"
    wait 0,20
    xin=duixiang.GetROProperty("value") 
    wend
    'msgbox i 
    If i-1=guifanshu Then
    konglen=true
    else 
    konglen=false
    End If
         Setting.WebPackage( "ReplayType")=1
    End Function

    51.超时设置:Setting("DefaultTimeout") =1000000

    52.共享对象库:Set App = CreateObject("QuickTest.Application")
    App.Test.Settings.Resources.ObjectRepositoryPath = "path"

    53.取颜色   browser("b").page("p").Object.currentStyle“:.color 
    54.显示行号设置:Tools- --> Editor Options...-->General-->Show line number,


    55.不同数据库检查点手动SQL写法
    QTP插入数据库检查点,手动指定SQL语句的写法。
    一、SQL Server格式(本地无需安装SQL Server)
    connectionstring(连接字符串):
    1.本地没有创建数据源的方式
    DRIVER=SQL Server;SERVER=数据库IP地址;UID=用户名;PWD=密码;APP=Microsoft Office 2003;WSID=本地主机名;DATABASE=数据库名

    实例:
    DRIVER=SQL Server;SERVER=10.160.11.10;UID=sa;PWD=sa;APP=Microsoft Office 2003;WSID=RJHLJUN;DATABASE=dcwork

    2.本地已创建数据源的方式
    DSN=数据源名称;UID=用户名;PWD=密码;APP=Microsoft Office 2003;WSID=数据库的主机名;DATABASE=数据库名

    实例:
    DSN=LocalServer;UID=sa;PWD=sa;APP=Microsoft Office 2003;WSID=RJDCWORKTEST;DATABASE=dcwork

    3.SQL语句实例(从数据库表HR_LANGUAGE_TYPE中,查询字段语言名称LANGUAGE_NAME,条件语言名称=中文,按语言名称升序排序结果)
    source(SQL语句):
    SELECT HR_LANGUAGE_TYPE.LANGUAGE_NAME FROM dcwork.dbo.HR_LANGUAGE_TYPE HR_LANGUAGE_TYPE WHERE (HR_LANGUAGE_TYPE.LANGUAGE_NAME='中文') ORDER BY HR_LANGUAGE_TYPE.LANGUAGE_NAME


    二、DB2格式:(本地至少安装DB2 Run-Time Client Lite)
    connectionstring(连接字符串):
    1.本地没有创建数据源的方式
    DRIVER={IBM DB2 ODBC DRIVER};UID=用户名;PWD=密码;MODE=SHARE;DBALIAS=数据库名;

    实例:
    DRIVER={IBM DB2 ODBC DRIVER};UID=db2admin;PWD=db2admin;MODE=SHARE;DBALIAS=DCWORK;

    2.本地已创建数据源的方式
    DSN=数据源名称;UID=用户名;PWD=密码;MODE=SHARE;DBALIAS=DCWORK;

    实例:
    DSN=DWCORKDB2;UID=db2admin;PWD=db2admin;MODE=SHARE;DBALIAS=DCWORK;

    3.SQL语句实例
    source:SQL语句
    SELECT HR_LANGUAGE_TYPE.LANGUAGE_NAME FROM DB2ADMIN.HR_LANGUAGE_TYPE HR_LANGUAGE_TYPE WHERE (HR_LANGUAGE_TYPE.LANGUAGE_NAME='中文') ORDER BY HR_LANGUAGE_TYPE.LANGUAGE_NAME


    三、Oracle格式:(本地需要安装Oracle ODBC DRIVER)
    connectionstring(连接字符串):
    1.本地没有创建数据源的方式
    DRIVER={Oracle in OraHome92};SERVER=数据库服务名;UID=用户名;PWD=密码;DBQ=数据库名;DBA=W;APA=T;EXC=F;XSM= Default;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;GDE=F;FRL=Lo;BAM=IfAllSuccessful;MTS=F;MDI=Me;CSR=F;FWC=F;PFC=10;TLO=O;

    实例:
    DRIVER={Oracle in OraHome92};SERVER=DCWORK;UID=DCWORK;PWD=DCWORK;DBQ=DCWORK;DBA=W;APA=T;EXC=F;XSM=Default;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;GDE=F;FRL=Lo;BAM=IfAllSuccessful;MTS=F;MDI=Me;CSR=F;FWC=F;PFC=10;TLO=O;

     

    2.本地已创建数据源的方式
    DSN =数据源名称;UID=用户名;PWD=密码;DBQ=数据库名;DBA=W;APA=T;EXC=F;FEN=T;QTO=T;FRC=10;FDL= 10;LOB=T;RST=T;GDE=F;FRL=F;BAM=IfAllSuccessful;MTS=F;MDI=F;CSR=F;FWC=F;PFC=10;TLO=0;

    实例:
    DSN=dcworkoracle;UID=DCWORK;DBQ=DCWORK;DBA=W;APA=T;EXC=F;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;GDE=F;FRL=F;BAM=IfAllSuccessful;MTS=F;MDI=F;CSR=F;FWC=F;PFC=10;TLO=0;

    3.SQL语句实例
    source:SQL语句
    SELECT HR_LANGUAGE_TYPE.LANGUAGE_NAME FROM DCWORK.HR_LANGUAGE_TYPE HR_LANGUAGE_TYPE WHERE (HR_LANGUAGE_TYPE.LANGUAGE_NAME='中文') ORDER BY HR_LANGUAGE_TYPE.LANGUAGE_NAME

     

    四, mysql
    Set Conn = CreateObject("ADODB.Connection" )
    str="DRIVER={MySQL ODBC 3.51 Driver};SERVER=192.168.1.100;DATABASE=wp_blog;user id=zzz ; password=123456" 
    Conn.open str
    Set Rs = CreateObject ("ADODB.Recordset" )
    sql = "select * from `wp_blog`.`blg_webcategory` limit 0, 5000;"
    Rs.open sql,conn,1,3 
    If (not Rs.eof) then
    Rs.MoveFirst
    MsgBox Rs(0)
    MsgBox Rs(1)
    MsgBox Rs(2)
    MsgBox Rs(3)
    end if

    Rs.close
    Set Rs = Nothing
    Conn.close
    Set Conn = Nothing 

    五. access

    Set Conn = CreateObject("ADODB.Connection" )
    str="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:/db1.mdb" 
    Conn.open str
    Set Rs = CreateObject ("ADODB.Recordset" )


    56.*.xml
    Environment.LoadFromFile "D:\新建文件夹\a.xml"
    Browser("百度一下,你就知道").Page("百度一下,你就知道").WebEdit("wd").Set Environment("HuiYuanB")

    57、类似时间控件,不能手到输入的文本档
       1)手工添加对象,
       2).object.value="2008-4-12"

  • 什么是ReplayType

    2012-12-05 22:59:25

    什么是ReplayType:

    ReplayType is QTP Web Add-in setting. It can be used to change how the events are replayed on the browser. There are two modes of ReplayType

    • Events (1) - Replay of events using the Browser methods (something similar to DOM).
    • Mouse (2) - Replay of events using the mouse and keyboard simulation.

     

    在QTP脚本中的使用方法:

    Setting.WebPackage("ReplayType") = 2 'Mouse
    Browser("KnowledgeInbox").Page("ReplayType").WebEdit("txtReplayType").Set "KnowledgeInbox"
    Browser("KnowledgeInbox").Page("ReplayType").WebButton("Type and enable me").Click
    Setting.WebPackage("ReplayType") = 1 'Events
  • 正则表达式

    2012-11-26 13:21:38

    ********************************************************************

    ******************************************************************
    Hi all, 如下正则表达式为编写自动化测试脚本常用的表达式。请参考

    http://www.jb51.net/tools/zhengze.htm
    ********************************************************************

    ******************************************************************

    需要转义的特殊字符
    $ ---> \$    
    ( ---> \(    
    ) ---> \)    
    * ---> \*    
    + ---> \+    
    . ---> \.    
    [ ---> \[    
    ] ---> \]    
    ? ---> \?      
    \ ---> \\   
    ^ ---> \^    
    { ---> \{    
    } ---> \} 

    解释:
    一、 
    特殊字符 注释 $ 匹配输入字符串结尾的位置。 
    若要匹配 $ 字符本身,请使用 /$。 
    二、 
    ( ) 标记子表达式的开始和结束。可以捕获子表达式以供以后使用。 
    若要匹配这两个字符,请使用 /( 和 /)。 
    三、 
    * 零次或多次匹配前面的字符或子表达式。 
    若要匹配 * 字符,请使用 /*。 
    四、 
    + 一次或多次匹配前面的字符或子表达式。 
    若要匹配 + 字符,请使用 /+。 
    五、 
    . 匹配除换行符 /n 之外的任何单个字符。 
    若要匹配 .,请使用 /。 
    六、 
    [ ] 标记中括号表达式的开始。 
    若要匹配这些字符,请使用 /[ 和 /]。 
    七、 
    ? 零次或一次匹配前面的字符或子表达式,或指示“非贪心”限定符。 
    若要匹配 ? 字符,请使用 /?。 
    八、 
    / 将下一字符标记为特殊字符、文本、反向引用或八进制转义符。 
    例如,字符 n 匹配字符 n。 
    /n 匹配换行符。序列 // 匹配 /,序列 /( 匹配 (。 
    九、 
    / 表示文本正则表达式的开始或结束。 
    若要匹配 / 字符,请使用 //。 
    十、 
    ^ 匹配输入字符串开始处的位置,但在中括号表达式中使用的情况除外,在那

    种情况下它对字符集求反。 
    若要匹配 ^ 字符本身,请使用 /^。 
    十一、 
    { } 标记限定符表达式的开始。 
    若要匹配这些字符,请使用 /{ 和 /}。 
    十二、 
    | 指出在两个项之间进行选择。 
    若要匹配 | ,请使用 /|


    1、匹配场景:匹配满足不包含“keyword”关键词
    关键词:keyword
    匹配表达式:^(?!.*?keyword).*$

    2、匹配场景:有且仅有关键词“keyword”,前后不能有空格或换行符
    关键词:keyword
    匹配表达式:^keyword$

    3、匹配场景:或关系 只要出现good或bad关键字,则为匹配
    关键词:good、bad
    匹配表达式:(good)|(bad) 或 (成功转交到)|(您有新的事务)

    4、匹配场景:并关系 出现good和bad关键字,则为匹配
    关键词:good、bad
    匹配表达式:.*good.*bad.*(注释:这是带顺序的)  使用(.*good.*bad.*)

    |(.*bad.*good.*)(注释:这是不带顺序的)
  • 浅谈自动化测试

    2012-11-26 13:18:09

    浅谈自动化测试

    [说明既然是“浅谈”,那当然是浅浅的谈了,再说了,深的我也谈不来^_^

          本文为本人个人结合自己在公司中的实践情况谈的一些感想,欢迎讨论,但不想理论。哎,实在是本人理论功底不好,而且懒于辩论。从初中开始,语文就没很好过- -

      自动化测试从广义上来说包括自动化功能测试、自动化性能测试、自动化安全测试、自动化单元测试等等。而我们日常常说的自动化测试一般是指自动化功能测试,本文主要也是从自动化功能测试角度考虑。

    [正文]

    说起自动化测试的强大,很多人起先的了解来自于测试论坛或者说来自于自动化测试工具厂商对工具的介绍。咱们先来看一段我因为需要而写的一段有关自动化测试的描述(不代表本人真实想法,这是因为有需要才为之的):

    自动化测试就是通过模拟手动测试步骤,执行用某种程序设计语言编制的测试程序,控制被测软件的执行,完成全自动或半自动测试的过程。自动化测试解决了功能测试不仅耗时且高成本的问题。采用自动化测试,企业可以将重点放在改进自动业务过程方面。开发和QA组可以增加测试过程的速度和精确度。整个IT部门可以获得更高的投资回报,而且降低了大量风险。

    这段话,个人感觉或许对于像微软这些大公司而言是对的,但就目前中国软件企业现状来说,自动化测试是不是像这段话说的这样真的很难说。单不说我们的定制项目战略与大公司的通用产品战略的差距,就我们公司的质量意识也能使这段话失效。就说以下这点,进行了程序修改后,需要对程序进行比较全面的测试这点,我们的很多公司就不做。原因很简单,上级认为这没有必要、而且是浪费时间,另一点,定制项目的利润可比通用产品少得多得多,哪有那么多钱让我们认真测试呢。而定制项目好像还是我们的主流。

    对于自动化测试,有这么一句总结的定义“利用程序测试程序”。这句话很简练吧,自动化测试归根到底也确实是这么个味道。利用工具、利用软件、利用小脚本等等都可以进行自动化测试。本人一直认为自动化测试是一种技术,是一种能力。既然是一种技术,那就不应该用太固定的框框把它限死了。应该是做到随需所用、依需而定。既然是一种能力,就应该用发散的思维去发挥它更多更大的作用。就像阅读这个能力,谁说一定要先划定中心思想,谁说一定要精读,更没人说一定要用三遍阅读法哦。阅读当然得根据读者的目的以及所读文章的特点,甚至是读者的水平来确定读此文章的方法。自动化测试也一样,不一定要用在回归测试上,也不一定要用在集成测试上。有时甚至可以写个小脚本用在解决功能人员测试难的小问题上。这不也是很好的自动化测试嘛。

    关于自动化测试工具,厂商说的可以说基本不可信。说什么“录制/回放”就可以实现,“简单得很”。要真相信这个,那你自动化测试的失败也会“快得很”。当然,微软所吹嘘的,要自己编程序来进行自动化测试,而不应该想着使用自动化测试工具来实现自动化测试。这个观点对于微软来说,应该是正确的。但是得看看微软什么现状:就微软的产品,有哪个自动化测试工具能支持得了全自动化测试的?再说了,微软的产品是全世界在卖,那质量要求高,而且利润更高,有的是钱请牛人来编写自动化测试程序。而且微软的人才也是我们这些公司不可企盼的。因此,如果有好的工具,甚至小工具或开源工具,只要能更好的解决公司中的问题,那何乐而不为呢?

    可以毫不客气的说,想要进行自动化测试,那还真得会编码。就拿易用性方面名声不错的QTP来说,要是不会编写VBScript脚本,要是不会综合应用QTP内置的对象和函数,要是不了解QTP支持的扩展,那么就是对QTP这个工具没有很深入的了解,那么如何做到能灵活应用呢。要是真碰到特殊问题,那很容易就GameOver了。我曾经拿几个自动化测试工具(如QTP9.2版、RFT7.1版、TestComplete5.0版)试了试一些基本的标准html页面的功能。有的没法完全回放成功,而如果要进行一些特殊的判断或处理,那“录制”基本就不可能了。而且,即使录制的都能成功回放,那能说明这就实现了自动化测试嘛?自动化测试重点还是在测试,要实现的是测试的目的,而不是在于几个工具的使用上。

    自动化测试是一种技术、是一种能力,它不是绑定在某种工具上的。在实际的实践中,发现一些自动化测试人员,在熟练掌握一个自动化测试工具后,非常的高兴,而且有点炫耀的味道。于是乎,本人就问他:“你以为会这个工具,你就会自动化测试了吗?你最多就算会这个工具,或精通这个工具,跟自动化测试无关。”(本人说话较直,总喜欢实话实说- -!)。这里要说的是,要注意自动化测试不是工具的必然。如果只是把自动化测试定位在一两个工具上,那这个人到头来可能会的不是自动化测试技术,而是工具。当然如果要直接从自动化测试技术入手,可能学起来会没有感观认识,而且进入那个自动化测试思维大门较难。因此,一般的学习和进阶方法可以如下:找一个或两个比较容易实现自动化测试的工具,进行深入的学习,并在项目中进行实践,等有一定实践经验后,自然会有一定的认识的。而这时就需要自己的思维脱离这些自动化测试工具,进而思考自动化测试技术的方方面面。然后当然就是可以试用其他的测试工具(强调一下,不要以为只有测试工具才能用于自动化测试,其他工具也可以的,只要那个工具提供的功能满足应用的需求,那就可以了),或自己编码实现一个小型工具(自动化测试人员是需要编程技术的),或直接用脚本语言编写执行程序等等。这时就是要根据要测试的内容能随心所欲的应用自动化测试了。

    接下来根据几个网友的讨论,谈点有关自动化测试框架的认识吧。在开展自动化测试时,没有必要去深究自动化测试框架到底是什么,要怎么定义。因为这个定义的话,估计还没人敢说他有标准的定义。而且即使有标准的框架要求,那我根据公司的自动化测试需要,加入一些东西也是可以的嘛。在应用自动化测试框架方面,个人感觉还是不要跟风的好。有人总喜欢有什么好的框架或功能齐全的框架,就要拿来用。当然并不是说这些框架不好,也不是说不能用。只是说在用时,请考虑一下,自己目前用这些框架真的好嘛?如果刚开展自动化测试,就拿封装度很高的框架来套上,这不仅会增加学习量(框架是要学习的),而且会使测试人员只对框架有概念,而对于原版的工具生疏,要真是碰到框架不好解决的问题,那到时就不好办了。个人感觉,适用自己公司自动化测试要求的框架是比较好的框架。这个框架,可以是开源的,可以是自己开发的,甚至前期可以就几个文件夹或者规范要求或者再加几个共享文件、几个通用脚本等等。

    自动化测试也是需要比较完备的规范的,不仅需要脚本规范,也需要适用公司的自动化测试流程规范。只有有了脚本规范,才能使合作开发的脚本更像一个整体,使后期的脚本维护相对容易些。自动化测试流程规范是相当重要的。流程规范需要确定如何与手工测试人员交互,如何获取需求,如何产生测试用例,如何开发自动化测试程序,如何使用自动化测试,如何分析结果等等。如果这些没有确定好,很容易使自动化测试不流畅,甚至于“破产”。

    公司中要实行自动化测试,上级领导和现有开发测试人员对质量的意识很重要。举个碰到过的小例子:系统在发布前,按理应该要进行比较完备的回归测试的。但目前的现状就是只进行简单跑跑看看。这对于手工测试来说,时间不太多。而如果用自动化测试来实现了比较完备的回归测试,时间也不见得比手工测试少,因为手工测试没有进行完备的回归测试呀。在对这点的认识上,手工测试人员和上级认为自动化测试确实没有节省时间,也没有产生效益(因为发现的问题几乎没有)。后来我只问了一句:“难道你们认为在发布前也应该找出一堆BUG吗?难道质量保证是没有效益的吗?”。在后来的自动化测试实现中,我当然是拒绝再为这种之前测试就不完备,而且还不被上级和手工测试人员所承认的功能实现自动化测试了。因为这很容易让上级和手工测试人员感觉自动化测试也就这样,还不如手工测试得了。久而久之,自动化测试基本就会被抛弃了。

    瞎扯了这么多,主要还是要说明,自动化测试不像厂商吹的那么强大、易用。具体还得自己去试试,就像小马过河不试怎么能知道呢。而且每个人的认识都会不一样的。最后说明一点,咱们国家现在更需要的是创新,而不是复制。当然创新性的应用也是创新呀。

291/212>
Open Toolbar