发布新日志

  • QTP 自定义COM组件的实现 activex dll篇

    2013-02-20 12:50:50

    自定义COM组件的实现 activex dll篇

    在上一章我们讲到了使用WSC向导生成WSC文件来创建自定义COM组件,并且实现在QTP中的调用

    今天来讲一下第二种方式,第二种方式其实说穿了就是在VB6里写好函数封装成DLL之后生成自定义COM组件。

    准备工作:下载VB6 ?网上有很多,也可以去这里下http://bbs.51testing.com/viewthread.php?tid=105570&highlight=%BE%AB%BC%F2%B0%E6

    1.装完之后,我们就可以开始打开VB6应用程序了,打开之后,选择ActiveX DLL,点击打开

    qtp-com-activex-dll

    qtp-com-activex-dll

    2.进入之后我们在脚本编辑的地方写两个简单的FUNCTION函数、

    qtp-com-activex-dll

    qtp-com-activex-dll

    3.修改右边的工程名和类名分别为: ? zzxxbb 和 operator

    qtp-com-activex-dll

    qtp-com-activex-dll

    4.点击左上角菜单栏的文件–》生成DLL

    qtp-com-activex-dll

    qtp-com-activex-dll

    5.生成完之后,如果你的QTP是 10.0以下的话,可以使用vbsedit直接在里边写好代码,然后黏贴进QTP

    因为VBSEDIT有代码提示,可以看到自己写的方法。

     

    6.上图的两个方法 就是我们之前写的 两个方法,然后我们写入方法,并运行

    qtp-com-activex-dll

    qtp-com-activex-dll

    运行结果为3,成功之后就可以把我们的脚本放入QTP之中运行了~

    如果你是QTP 10.0的话,可以不用VBSEDIT直接在QTP里写就会出现提示

    qtp-com-activex-dll

    qtp-com-activex-dll

    运行之后的结果也是一样

    qtp-com-activex-dll

    qtp-com-activex-dll

    qtp-com-activex-dll

    qtp-com-activex-dll

    注意事项:
    因为是本机生成的DLL,因此本机是自动注册DLL的,如果是要在别人的机器上调用这个DLL的话首先要注册一下这个DLL,然后就可以用了,注册方法:regsvr32 (DLL的路径) 比如:regsvr32 d:zzxxbb.dll


  • QTP自定义COM组件的实现 WSC篇

    2013-02-20 12:06:25

    by zzxxbb112 on 四月 22, 2011 with 0 Comments in QTP技巧展示

    在我们自动化测试中很常用的一个东西

    比如平时我们使用的scripting.filesystemobject,wscript.shell,excel.application等这些都是COM组件

    但其实我们不止可以调用这些COM组件,其实我们还可以自己开发COM组件来进行调用

    准备工作:

    首先我们需要下载一个WSC向导程序:windows script. component wizard(这个网上很多大家搜索一下就有了)

    =============== 实例 ===============

    1.下载完成后,打开程序,输入NAME为zzxxbb,并选择我们要生成WSC文件的路径,点NEXT

    qtp-com-wsc

    qtp-com-wsc

    2.这一步选择语言,我们这里就默认,点击NEXT

    qtp-com-wsc

    qtp-com-wsc

    3.这一步添加属性名和属性值的,也是默认,点击NEXT

    qtp-com-wsc

    qtp-com-wsc

    4.这一步是填写函数名和函数参数的,我们这里填入函数名:msg? 参数名:content,点击NEXT

    qtp-com-wsc

    qtp-com-wsc

    5.一直NEXT,最后点击FINISH,完成WSC的向导,成功在对应的路径生成了WSC文件

    qtp-com-wsc

    qtp-com-wsc

    6.点击确定后,找到生成的WSC文件双击打开后

    qtp-com-wsc

    qtp-com-wsc

    7.对此文件中的MSG方法进行修改,把原来的语句注释掉,添加”msgbox content”

    qtp-com-wsc

    qtp-com-wsc

    8.添加完保存文件并关闭,我们右键点击我们之前生成的WSC文件选择注册

    qtp-com-wsc

    qtp-com-wsc

    9.注册完之后我们自己开发的COM组件就成功完成了并导入注册表了,接下来就可以通过QTP来调用它了。

    qtp-com-wsc

    qtp-com-wsc

    10.输入以上代码之后,我们就可以成功执行刚才我们写的那个函数了,回放之后弹出消息框

    qtp-com-wsc

    qtp-com-wsc

    这样一个COM组件就已经生成并已经能够成功调用了~

    其实我们平时可以把经常需要使用的方法都注册进COM里,以后就可以直接使用这些方法来调用了

    总结:

    1. COM组件有很多种我们可以下载一个VBSEDIT进行查阅

    查阅方法,打开VBSEDIT之后,点击菜单栏的TOOLS–REFERENCE–ADD,打开下拉框就全部出来了

    2.自定义COM组件的方法不止这一种,还有一种方法通过VB6生成ACTIVEX DLL来生成COM组件

    这个会在下一章讲解,个人比较推荐后一种


  • Selenium 介绍

    2011-04-11 14:51:31

    Selenium 

    严格说来,Selenium是一套完整的Web应用程序测试系统,它包含了测试的录制(Selenium IDE)、编写及运行(Selenium Remote Control)和测试的并行处理(Selenium Grid)。Selenium的核心Selenium Core基于JsUnit,完全由JavaScript编写,因此可运行于任何支持JavaScript的浏览器上。Selenium Core由一种指定格式的HTML文件驱动,在一定程度上增强了测试套件(Test Suite)的可读性。Selenium Remote Control允许测试人员使用常见的语言(自然包括C#等.NET语言)编写测试代码,并支持不同操作系统下的各种主流浏览器。Selenium Grid的作用是将测试分发至多台机器,这样便可大大加快测试速度。与WatiN相同,Selenium也是一款同样使用Apache License 2.0协议发布的开源框架。  

     

    Selenium IDE 
           Selenium IDE是基于FIREFOX浏览器的一个插件,提供GUI界面来运行Selenium测试。Selenium IDE提供脚本录制功能,可以将用户在浏览器中执行的操作记录下来,生成各种形式的脚本,可以将这些脚本保存供以后使用。 
           安装Selenium IDE的步骤如下: 
        * 从www.openqa.org/selenium-ide/download.action下载Selenimu IDE(一个XPI后缀的文件)。 
        * 启动FIREFOX浏览器,打开刚才下载的文件。 
        * 重启FIREFOX浏览器,在工具菜条下应该就可以看到Selenium IDE菜单项 

     

    --------------------------------------------------------------------------------------------------------- 

    一 Selenium-RC 是 selenium-remote control 缩写,是使用具体的语言来编写测试类。
    二 准备工作: 1,下载 selenium 了,到 http://www.openqa.org/selenium/ 下载就可以了,记得选择selenium-rc 的版本 
                 2, 学习一下xpath 的知识。有个教程:http://www.zvon.org/xxl/XPathTutorial/General_chi/examples.html 
                 3, 安装 jdk1.5 


    三 selenium-rc 一些使用方法 
        1,解压selenium-rc压缩包 
        2,启动服务器  
            Selenium Server是用JAVA实现的,相应的库文件在HOME/server/selenium-server.jar。运行如下代码从命令行启动: 
           java 代码 : java -jar selunium-server.jar 


    四   编写测试用例 
        需要的JAR: selenium-java-client-driver.jar;junit 
        编写一个JUNIT的单元测试,要构建一个Selenium,包括如下步骤: 
        * 构建一个Selenium实例 
        * 启动Selenium实例 
        * 执行Selenium命令,并验证结果。 
        * 关闭Selenium实例 

    如下是一个示例,用来测试http://www.google.com/,查找selenium,期望结果中包含"OpenQA: Selenium" 
      代码

    package com.thoughtworks.selenium;      
    import junit.framework.*;   
    import org.openqa.selenium.server.*;   
    public class GoogleTest extends TestCase   
     {   
        
    private Selenium selenium;   
        
    public void setUp() throws Exception {   
             String url 
    = "http://www.google.com";   
             selenium 
    = new DefaultSelenium("localhost", SeleniumServer.getDefaultPort(), "*firefox", url);   
             selenium.start();   
        }   
             
        
    protected void tearDown() throws Exception {   
              selenium.stop();   
        }   
             
        
    public void testGoogleTestSearch() throws Throwable {   
              selenium.open(
    "/intl/zh-CN/");   
              selenium.type(
    "q""selenium");   
              selenium.click(
    "btnG");   
              selenium.waitForPageToLoad(
    "30000");   
              assertEquals(
    "selenium - Google 搜索", selenium.getTitle());        
           } 
      }    

     


    五 多环境测试 
     
     代码

     

     
     

    六 如何选取元素   selenium提供如下强大的定位元素的方法。    * id=id    * name=name    * dom=javascriptExpression    * xpath=xpathExpression    * link=textPattern    * css=cssSelectorSyntax1 通过ID,name选择元素  :  如 selenium.type("id=q","百度"); selenium.type("name=search","百度")2 link= 根据链接文字来操作:如 selenium.click("link=个人资料");3 根据XPath来选择元素  : XPath Checker    * xpath=//img[@alt='The image alt text']    * xpath=//table[@id='table1']//tr[4]/td[2]    * xpath=//a[contains(@href,'#id1')]    * xpath=//a[contains(@href,'#id1')]/@class    * xpath=(//table[@class='stylee'])//th[text()='theHeaderText']/../td    * xpath=//input[@name='name2' and @value='yes']    * xpath=//*[text()="right"]      如: selenium.type("xpath=//input[@name='user.email']", "xxx@123.com"); // 向input中type为text的栏位键入信息          selenium.check("xpath=//input[(@name='user.sex')and(@value='男')]");// 向input中type为radiod的 选取4 dom选择    * dom=document.forms['myForm'].myDropdown    * dom=document.images[56]    * dom=function foo() { return document.links[1]; }; foo();5 css选择器这个不常用,它可以支持css2, css3选择器    * css=a[href="#id3"]    * css=span#firstChild + span七 使用selenium 这个对象来进行测试1  获取标 : assertEquals("Insert title here", selenium.getTitle());2  判断页面是否存在一个user.email元素  :assertTrue(selenium.isElementPresent("xpath=//input[@name='user.email']"));3  得到文本框里的文字:   assertEquals(selenium.getValue("xpath=//input[@name='user.username']"),"xxxaas");4  测试check box  :    assertTrue(selenium.isChecked("xpath=//input[(@name='user.sex')and(@value='男')]"));5  点击提交按钮   : selenium.click("xpath=//input[@type='button']");6  等待页面载入   : selenium.waitForPageToLoad("2000");7  验证指定文本出现在提交给用户的页面上: assertTrue(selenium.isTextPresent("验证码输入有误,请核实后再输入"));8  判断下拉框里选择了哪个选项 :assertEquals(selenium.getSelectedIndex("xpath=//SELECT[@name='HATIMING']"), "1"); 9  如何测试一些错误消息的显示? assertTrue(selenium.getBodyText().indexOf("错误消息")>=0);    getBodyText 返回的时浏览器页面上的文字,不回包含html 代码的,如果要显示html 代码,用下面这个:selenium.getHtmlSource(); 

    八   Firefox 的插件     1 XPath Checker :可以用这个工具测试简化我们的xpath表达式     2 Firebug     3 Selenium IDE     4 Execute JS

  • Selenium入门

    2011-04-11 14:46:47

    Selenium简介:
        Selenium 是 Thoughtworks公司的一个集成测试的强大工具。Selenium 是 ThoughtWorks 专门为 Web 应用程序编写的一个验收测试工具。与其他测试工具相比,使用 Selenium 的最大好处是: Selenium 测试直接在浏览器中运行,就像真实用户所做的一样。Selenium 测试可以在 Windows、Linux 和 MacintoshAnd 上的 Internet Explorer、Mozilla 和 Firefox 中运行。其他测试工具都不能覆盖如此多的平台。
      Selenium 不同于一般的测试工具。一般的脚本测试工具录制脚本,实际上都是通过拦截浏览器收发的http 请求来实现的。事实上并没有办法录制用户对html 页面的操作。Selenium 的脚本录制工具是通过监听用户对html 页面的操作来录制脚本的。Selenium是真正能够监听用户对html 页面的操作的录制工具。Selenium 完全了解用户操作的html 页面。
    selenium原理:
    SeleniumServer 通过网络与Selenium 客户端通讯,接收Selenium 测试指令。
    SeleniumServer 通过向浏览器发出JavaScript. 调用实现对Html 页面的全面追踪,并通过网络把执行结果返回给Selenium 客户端。
    Selenium 客户端一般使用单元测试技术实现,通过判断返回的结果与预期是否一致来决定程序是否运行正确。
    Selenium 是通过javascript. 来实现对Html 页面的操作的。它提供了丰富的指定Html 页面元素和操作页面元素的方法。
    Selenium 打开浏览器时,把自己的JavaScript. 文件嵌入网页中。然后Selenium 的网页通过frame. 嵌入目标网页。这样,就可以使用Selenium 的JavaScript. 对象来控制目标网页。
    Selenium 的JavaScript. 对象中,最重要的就是Selenium 对象。它的作用是代表Java 中的Selenium 接口执行一系列的命令,让浏览器执行。

    好,下面进入正题!
    Selenium 的版本
    Selenium 现在存在2个版本,一个叫 selenium-core, 一个叫selenium-rc 。
    selenium-core 是使用HTML的方式来编写测试脚本,你也可以使用 Selenium-IDE来录制脚本,但是目前Selenium-IDE只有 FireFox 版本。
    Selenium-RC 是 selenium-remote control 缩写,是使用具体的语言来编写测试类。
    selenium-rc 支持的语言非常多,这里我们着重关注java的方式。这里讲的也主要是 selenium-rc,我们这里主要讲解selenium-rc方式。
    准备工作:
    1、 下载selenium-rc的压缩包,地址:http://seleniumhq.org/download/,将其解压缩到D:\selenium下。
    2、 开发工具eclipse\myeclipse
    3、 Jdk 1.5以上
    4、 学习一下xpath的知识。
    使用步骤:
    1、 在dos环境下进入selenium-server所在目录,运行命令:
    java -jar selenium-server.jar,如出以下画面则说明成功

    2、 启动eclipse,新建一个web工程,在工程中添加.jar文件,选择工程,鼠标右键—>Build path—>configure build path—>Libraries—>add external jars—>选择 selenium-java-client-driver 文件夹下的全部jar文件。
    另外点击 add library,选择Junit,点击next 选择Junit的版本 ,点击ok完成部署。
    3、 在工程下添加一个测试类。其代码如下:
    package selenium;

    import junit.framework.TestCase;

    import com.thoughtworks.selenium.DefaultSelenium;
    import com.thoughtworks.selenium.Selenium;

    public class SeleniumTest extends TestCase {

    private Selenium ss;

    @Override
    protected void setUp() throws Exception {
    ss = new DefaultSelenium("localhost", 4444, "iexplore",
    "http://www.google.com/");
    ss.start();
    }

    public void testSelenium() {
    ss.open("http://www.google.com/");
    ss.type("q", "hello world");
    ss.click("btnG");
    ss.waitForPageToLoad("5000");
    }

    @Override
    protected void tearDown() throws Exception {
    ss.stop();
    }

    }
    点击运行你就会看到selenium自动打开一个网页,输入Google的网址,再在Google的输入框中输入hello world关键字,点击查询按钮,不一会就会出现查询的结果,跟人的行为一样。
     
  • 搜索引擎评测

    2011-03-24 10:10:37

    我们先分析一下几个重要评测要素的能力缺陷:

    一:查全率

      既然是搜索引擎,首先比搜索范围是天经地义的事,如果这条不及格,后边的评测好象也不用参加了。由于收录网页的数量都是各搜索引擎自己宣布的,未可全信,而同一个关键词的搜索结果却是显而易见的,所以一般的评测都以这个为准。
      但以这个为准还是有很多毛病,多数象样一点的搜索引擎我都可以找出一批关键词来证明它的搜索结果是最全的。因为网页索引数量虽然有大小,但robot和spider程序不同,索引范围和索引标准也不尽相同,在最大的搜索引擎上搜不到的有可能在小得多的搜索引擎上搜到。


      有的搜索引擎支持“的,about,了,of,啊,么”等虚词助词搜索,有的不支持,这又如何来比?哪次评测提到过?
    关键词除了内容难选择,在长短上也不好定。有的搜索引擎完全不支持单个汉字搜索,怎么算它?一般都只比较单关键词搜索,而多关键词的搜索呢?长句的搜索呢?甚至有搜索引擎能支持任意文章或片段作为关键词,这样比较出来的结果跟单关键词搜索出来的可是不一样的,更别提没法比的功能了。象excite这样语义搜索的引擎,还有支持模糊搜索的引擎,别的搜索引擎搜索结果极少甚至为零的关键词它们可以搜出一大堆结果,这又如何比较?


      最后一点,搜索引擎是可以针对特定的关键词进行结果优化的,评测的公正性谁来保证?如果其中某个被评测搜索引擎事先知道所用的关键词,那么只要轻松优化一下,冠军就非它莫属了。

    二:搜索速度

      比完了查全率,就该比搜索速度了,如果有搜索引擎索引的网页虽多,但是搜索一次要五、六秒或更长,直接请它出局吧,没有比下去的意义了。


      速度的问题首先还是在关键词,单关键词搜索快的不一定多关键词搜索快。
      然后是访问量的问题,对一个日访问量一亿以上的搜索引擎和一个日访问量几万的搜索引擎作同样的测试本身已是不公平。
      还有网页索引数量的问题,一个搜索引擎索引了10亿的网页,另一个搜索引擎索引了一千万的网页,让它们对同一个关键词在各自的数据库里搜索比搜索速度,这样的结果如何让人信服?


      除了事先优化的问题外,有的搜索引擎本就具有记忆搜索结果加速调用的能力,一个关键词哪怕第一词搜索花了10秒,第二次搜索也许就2秒了,第三次,第四次,到你去测试的时候已经永远是0.0001秒了。这样,如果你选常见词测试,它快得惊人,如果来个偏僻词,也许老半天出不来,到底该选什么关键词?常用和偏僻各占多少?这真是一笔糊涂帐。


      搜索引擎不是放在实验室的本地机上测试用的,而是给普通网友用的,所以这搜索时间应该还包括搜索界面和搜索结果的传输过程在内。一个搜索引擎搜索时间花了0.0001秒,但是传输结果网页花了3秒,另一个搜索花了0.5秒,但是传输网页结果花了一秒,你说哪个搜索引擎算快?真正用的时候,你选那个3.0001秒以后看到搜索结果的还是1.5秒以后看到搜索结果的?

    三:查准率

      这个相当重要,搜到的东西即使又多又快,但你想要的那条结果不知道要翻多少页才能找到,那这搜索结果要来何用?这样的搜索引擎只有在查稀罕东西时才有用,但是要查稀罕东西应该去元搜索引擎呀,干吗要用它?查准率的评价标准很难定,得看你查什么,你要查一个特定的网站和找一群相似网站根本就是两回事。查准率的关键还是在于要搜什么和选择什么关键词,评测人可以随意定夺的,然后影响到评测结果的可靠性。

    四:死链接

      普通搜索引擎总有些搜索结果是点不进去的,少到百分之一二,多到百分之八九,这个也常被用作评测条件之一。但是象google使用了网页快照功能,几乎不存在死链接问题,就算搜索结果中的那个网站已关闭,你还是可以看到google自己储存的网页。这种死链接怎么计算?

    五:用户负担

      还没见过国内搜索引擎评测有谁用过这一项,但它是评价搜索引擎优劣的重要因素,包括很多方面。搜索引擎是给人用的,一定要让人用得舒服方便快捷,任何妨碍和延迟用户到达最终搜索结果的都算用户负担。


      首先是搜索界面,一个只有搜索框的纯粹搜索引擎界面跟一个带有广告和大量网页内容的门户相比,它们带给用户的搜索负担是高下立判的。

      其次是搜索结果描述,搜索结果网页的文字描述是长还是短,网页文字描述采用索引带关键词的部分还是索引网页的开始几行还是索引网页的主要内容,关键词是否高亮显示又采用什么颜色,是否显示网页地址,还有搜索结果页面的布局,这些对于用户的搜索负担区别大大的有。

      再者就是对用户操作步骤的影响,是否可以用鼠标启动搜索,搜索结果每页显示数量是否只有10条,翻页的便捷与否,搜索框是两个还是一个,放在上边还是下边,一次搜索后关键词是否还在搜索框中显示,这些每一条都会影响搜索效率。

    六:其它还有

    是否支持本目录下搜索,
    internet索引数据库更新时间长短,
    搜索引擎的稳定性,
    对高级搜索的支持能力强弱等也应该加以评测

  • 搜索引擎测试的难点

    2011-03-24 09:34:53

    衡量搜索引擎系统功能质量方面有2大指标,查询率、查准率。

      性能方面从吞吐率、响应时间、系统资源消耗等多方面综合考虑。

      搜索引擎应用参与运作的角色划分:分发请求/合并查询结果的merger,以及查询服务的searcher。

      搜索引擎系统部署可以划分为:

      1) 1个Merger带N个searcher,searcher上数据一样 (分布式单个集群多台机器) ,N>=1且为整数。

      2) 1个机器同时充当Merger以及searcher (单机版)。

      3) 为避免2)单点故障,几台机器同时为merger/searcher,机器的数据一样。

      4) M个分布式单个集群多台机器组成1个大型的分布式多集群多机器的复杂环境。

      实践中3)、4) 2种部署模式都是存在的。

      大数据量、高吞吐率的都采用4),避免单点故障

      小型的数据采用3),节约成本。

      单机上搜索引擎的模块划分一般有:

      ● 索引模块:为海量数据(数据库导出的文件数据)建立索引文件(依照一定数据结构格式保存为二进制文件)

      ● 查询模块:接收http请求,查询本机硬盘上的索引文件,返回文档ID以及第二次查询时返回具体的内容

      ● 即时更新模块:加入新的数据,可以从0开始重新建索引,也可以在原有基础上增加索引。

      ● 分布式模块:merger/searcher多台机器的网络通信。

      ● CACHE模块:这里可以做查询请求的缓存,也可以做查询结果的缓存,但缓存后者的话,将极大消耗系统内存。

      ● 其他管理模块

      ● 外部接口

      基于如上复杂的系统架构,尤其是4)模式,我们在测试当中也碰到相当多棘手的技术问题:

      1) 海量数据是否都按预期的分词算法建立索引了呢?

      2) 机器分词的效果与手工分词相差有多大呢?

      3) 海量查询的返回结果是否多查了?

      4) 海量查询的返回结果是否漏查了?

      5) 海量查询的返回结果的加亮、标注如期加了?

      6) 海量查询的返回结果中相关性分数计算是否正确?

      7) 海量查询的返回结果积分计算是否正确了呢?

      8) 海量查询的返回结果积分相同时,排序的先后依据唯一么?

      9) 加入即时更新模块后,每次查询结果都不同,新建的索引内容是否都反馈到查询结果里面了呢?

      10) 海量数据时CACHE是否预期CACHE该cache的内容?

      11) 海量数据时CACHE是否依照一定的过时算法令cache的内容失效呢?

      12) 应用程序在32位LINUX操作系统和64位的LINUX的索引、查询结果是否依然一样?

      13) 应用程序在不同的OS上索引、查询结果是否依然一样?

      我们在实践中,针对查询结果正确性有3类方法处理以上问题:

      第一类,基于人工肉眼对比,极度耗费脑细胞。

      1) 少量数据单机测试准确性

      2) 少量数据1个集群,搭建1merger 1searcher测试准确性

      3) 少量数据1个集群,搭建1merger多searcher测试准确性

      4) 少量数据多个集群,搭建1merger多searcher测试准确性

      第二类,经过人工对比确认基本功能无大问题后,开发linux shell脚本或者loadrunner脚本比较部署方式不同但测试返回结果理当相同的。这个方法也帮我们发现了一些BUG

      第三类方法,直接测试大量数据多个集群,搭建1merger多searcher测试准确性。

      这个时候采用loadrunner施加高峰压力,抽样检查查询请求的正确性。

      对于分词结果、相关性的结果,有人可能建立另外按照同样的算法以及输出格式,由2个不同的开发工程师实现,再对比同样的数据分词、相关性是否相同。在项目开发时间从容的情况下,可以考虑这么做的,但现实中有几个项目时间从裕?呵呵,我没有这么好运气遇上。

  • 搜索引擎的主要指标

    2011-03-24 09:34:16

    搜索引擎的主要指标有响应时间、召回率、准确率、相关度等。这些指标决定了搜索引擎的技术指标。搜索引擎的技术指标决定了搜索引擎的评价指标。好的搜索引擎应该是具有较快的反应速度和高召回率、准确率的,当然这些都需要搜索引擎技术指标来保障。

    召回率:一次搜索结果中符合用户要求的数目与用户查询相关信息的总数之比
    准确率:一次搜索结果中符合用户要求的数目与该次搜索结果总数之比
    相关度:用户查询与搜索结果之间相似度的一种度量
    精确度:对搜索结果的排序分级能力和对垃圾网页的抗干扰能力

  • 搜索引擎测试方法【转】

    2011-03-24 09:31:33

     
            搜索引擎的测试也分为功能与性能测试,我在下面依次来分享:

            首先,我们把整个测试计划分为线下测试与线上测试。线下与线上测试都要分功能测试与性能测试,先说现线下的测试。

            一、线下功能测试分为两个部分,一部分为搜索引擎本身的功能测试,一部分为嵌套在前台应用中的功能测试:

            1、搜索引擎本身的功能测试,主要就是按照用例,通过不同的搜索关键字、属性的组合(按照搜索引擎的规则)来直接访问搜索引擎,查看返回的数据、参数是不 是符合原先预计的结果。可以编写脚本来批量执行,判断每一个搜索的返回结果数与内容,相对应的参数是否一致。也可以手工执行,使用浏览器或者命令行(如 curl)来做,用肉眼来观察结果。

            2、嵌套前台应用的功能测试,只要就是按照用例通过前台的操作,来测试搜索引擎的相关的功能,测试搜索引擎与前台的接口是否正确应用,至于如何测试,这个地球人都知道了,我就不在这里多说了。

            二、线下性能测试也分为两个部分,一部分为直接对搜索引擎进行加压的性能测试,另一部分为通过前台应用进行加压的性能测试:

            1、直接对搜索引擎进行加压,可以测试出搜索引擎本身最真实的性能状况。可以把搜索引擎的有效负荷,最大承受的压力测试出来。具体的方法是,使用工具如 loadrunner使用一个web_url直接加压,加压的内容其实就是你在功能测试中,直接测试搜索引擎时使用的那些搜索关键字、属性的组合(按照搜 索引擎的规则),具体的规则可以通过log来查看,也可以询问开发人员。需要注意的是,数据准备一定要海量,至少10万条以上的搜索数据(注意,就是你访 问搜索引擎的那些关键字组合,至于被搜索的数据,越大越好,最少多大,看你实际需要了)。当一切都准备完毕后,就可以启动工具来进行加压了。

            2、通过前台应用进行加压,主要的压力都集中在前台应用上面,对于搜索引擎本身的压力并不会很大,但是这种测试也是必须的,因为你的搜索引擎是离不开前台应用的,这种测试可以模拟最真实的终端用户使用。所以不要怕麻烦,这个才是最后真正有意义的测试结果。

            三、线上的功能测试,其实就是功能回归了,使用预发布环境(一套独立的缩小的线上的架构)来跑回归,手工或者自动化随便,这是不能缺少的。

            四、线上的性能测试,这个也是使用预发布环境(记得一定要和线上一样哦,只不过是缩小的),分流线上的一部分压力到这里,观察线上与预发布环境中的各服务 器的情况,如果是第一次发布,线上没有流量,那么就自己来模拟,或者靠运营来宣传了(有点想网络游戏的公测)。记录下服务器的各性能指标,如 load,cpu,队列,最大并发连接数,log等等。

           特别需要注意的是,不同层次服务器之间的数据传输方式,正确率以及配置,多试试不同的配置,寻找性能最优点。
     

     

  • QTP讨论会记录

    2011-02-17 16:50:21

    1、主控调用的function中只能有一个参数,非主控调用的function可以多个参数

    2、关联VBS文件

    setting 中环境变量设置中 testdir

    A:获取环境变量“testDir”的方法

    testPath=Environment.Value("TestDir")

    B:动态加载VBS文件

    executefile logVbs

    logVbs=testpath&(或+)“\log.vbs”

     

  • QTP编码讨论会内容

    2011-02-17 16:48:41

    内容记录:

    1 为什么被主action调用的function参数只能是唯一的sheetName

      解答:自动化测试框架采用的是循环读取测试用例文件,并执行测试用例。这就要求所有组成测试用例的数据必须保持一致。

    测试用例文件表形式大致如下:

    其他判断标识等.........

    functionName

    Function所在的vbs

    Function所需数据对应的sheet

    其他说明(例如function功能说明等)........

     

     

     

     

     

     

    2 为什么function所需数据必须在调用function时必须已经导入完毕

      解答:参考问题1,为了保证后续的集成,function所需数据必须已知,对于function需要导出到外部的数据,是属于function自身的功能。

    3 function所需数据存储的excel文件为什么一定要使用相对路径方法?

      解答:测试规范中已经定义了工程目录的组织结构,在不改变工程目录的情况下,需要做到工程目录存储在任何位置脚本都可以正确执行,为此工程目录的存储位置只能动态获取。

    4 function所在的vbs文件为什么不能直接关联脚本,一定要动态加载。

      解答:参考问题3

    需要注意的是用于支撑框架的vbs文件是需要直接关联到脚本的。比如我们目前用户获取父路径方法所在的vbs文件。

    5 收集脚本开发过程中遇到的问题,并给予解答

      :她的function所需数据源自多个sheet表,最初的想法是增加function参数个数。

      解答:她的方法与要求不符,修改办法是建立主sheet表,其他协同工作的数据表放到主表中,协同工作的表中的数据因不会在测试用例中出现,所以协同工作的表格数据应在function内部进行处理。

     

    代码参考:

    '获取环境变量“testDir”的方法

    testPath=Environment.Value("TestDir")

    '组成完整文件路径的方法

    myLogVbs=testPath&"log.vbs"

    myLog=testPath&"log.txt"

    '动态加载vbs文件的方法

    Executefile myLogVbs

    注意事项:Executefile命令不能识别unicode格式的文件,而QTP自动存储的vbs文件恰恰是unicode格式的,所有要使用其他文本工具将vbs文件转换为非unicode格式,调试过程中如果报“非法字符”,多数为文件格式导致。

  • 转 QTP实用函数(包括WEBTABLE等)

    2010-12-28 15:34:43

    QTP实用函数(包括WEBTABLE等)


    DTParameter对象指的是运行时DataTable Sheet中的列对象。
    注意:所有应用于DTParameter对象的方法仅适用于run-time DataTable对象。所有对run-time DataTable对象的改变只影响测试结果,不影响design-time Data Table。
     
    1.     Property
    ??        Name
    描述
    返回run-time Data Table的列名。
    语法
    DTParameter.Name
    示例
    下面的例子使用“Name”方法返回run-time Data Table中新创建的列的名称,并将列名写入Report。
    Dim paramname
    paramname = DataTable.LocalSheet.AddParameter("Food", "pizza").Name
    Reporter.ReportEvent 1, "The New Parameter name is", paramname
    ??        RawValue
    描述
    获取当前行指定列所对应的单元格的原始数据。原始数据是尚未计算处理过的数据,如单元格中的公式内容等。
    语法
    DTParameter.RawValue
    本语法与DataTable.RawValueParameterID[,SheetID]用途是一样的,但是使用方法不同。
    示例
    下面的例子使用RawValue属性来获取run-time Data Table的“ActionA”表“Date”列的当前行所对应的单元格中的公式。本例中的返回值应该是“=Now()“。
    FormulaVal=DataTable.GetSheet("ActionA").GetParameter("Date").RawValue
    ??        Value
    描述
    这个属性是列对象的默认属性。获取或设置列的当前行所对应的单元格的数据。
    注意:这个方法返回的数据是计算后的数据。假如单元格中包括公式,则这个方法返回True或False。
    语法
    获取单元格数据:
    DTParameter.Value or DTParameter
    设置单元格数据:
    DTParameter.Value=newvalueor DTParameter=newvalue
    示例
    下面的例子使用Value来设置Sheet“ActionA”的“Destination”列的当前行所对应的单元格的数据。
    DataTable.GetSheet("ActionA").GetParameter("Destination").Value="New York"
    注意:可以省略本语句中的“Value”,因为Value是DTParameter的默认属性。
    ??        ValueByRow
    描述
    获取指定列指定行所对应的单元格的数据。
    语法
    DTParameter.ValueByRow(RowNum)
    Argument
    Type
    Descrīption
    RowNum
    Number
    指定行号。行号从1开始。
    示例
    下面的例子使用“ValueByRow”来获得表“ActionA”的“Destination”列的第4行数据。
    DataTable.GetSheet("ActionA").GetParameter("Destination").ValueByRow(4)

     1.GetCellData函数
     作用:获取单元格的值
     例: rowCount = Browser("xxx ").Page("xxx ").Frame("xxx").WebTable("xxx").RowCount
    For counter = 1 To rowCount
     text = Browser("xxx").Page("xxx").Frame("xxx").WebTable("xxx").GetCellData(counter,1)
     If (text = "xxx") Then
        counter = counter - 1
        selectNO = "#" & counter
        Browser("xxx").Page("xxx").Frame("xxx").WebRadioGroup("xxx").Select selectNO
        Exit For
     End If
    Next
     
    2.把值插入datatable里
     例:   datatable.setcurrentrow(i)
            datatable.value("name","Global")="name"
            datatable.value("passwd","Global")="passwd"
     
    3.用代码来启动浏览器
     Browser1 = "IE"
     StartURL = "www.51testing.com"
     IF Browser1 = "IE" THEN
         set IE = CreateObject("InternetExplorer.Application")
         IE.Visible = true
         IE.Navigate StartURL
     END IF
     
     
    4.ExecuteFile函数
     作用:ExecuteFile 可以直接执行vbs文件,而不需要将其导入resource中
           ExecuteFile FileName
     说明:where FileName is the absolute or relative path of your VBscrīpt file.
     
     例:ExecuteFile("F:"test.vbs")
     
    5.Strcomp函数
     作用:比较文本
     例:dim strtext1,strtext2,str ,str1,comp1
         strtext1 = "xxx"
         strtext2 = "xxx"
         str = VbWindow("xxx").VbWindow("xxx").VbLabe1("xxx").GetTOProperty("text")
         str1= VbWindow("xxx").VbWindow("xxx").VbLabel("xxx").GetTOProperty("text")
         comp1=strcomp(strtext1,str,0)
         If comp=0 Then
              msgbox “这两个串相等”
         else
           msgbox str
         End If
     
    6.CaptureBitmap
     作用:捕获屏幕
     
    7. GetROProperty
     作用:取对象属性值
     例:VbWindow("xxx").VbWindow("xxx").VbWindow("xxx").ActiveX("xxx").GetROProperty("TextMatrix(1,0)") 
     
    8.ExitAction - 退出当前操作,无论其循环属性如何。
     ExitActionIteration - 退出操作的当前循环。
     ExitRun - 退出测试,无论其循环属性如何。
     ExitGlobalIteration - 退出当前全局循环。
     
     
    9.如何使用Excel对象处理数据?
     Dim xl
     打开excel文件
     Function OpenExcelFile(strFilePath)
     Set xl = CreateObject("Excel.Application")
     xl.Workbooks.Open strFilePath
     End Function
     获得指定单元格数据
     Function GetCellData(strSheet,rwIndex,colIndex)
     GetCellData = xl.WorkSheets(strSheet).Cells(rwIndex,colIndex)
     End Function
     填充单元格数据
     Function PutCellData(strSheet,rwIndex,colIndex,varData)
     xl.WorkSheets(strSheet).Cells(rwIndex,colIndex) = varData
     End Function
     保存并推出
     Function SaveAndQuit()
     xl.Activeworkbook.save
     xl.Quit
     Set xl = nothing
     End Function
     
    10.连接sql数据库
     例:Dim res,cmd,sql
         Set Res=createobject("adodb.recordset")
         Set Cmd=createobject("adodb.command")
         Cmd.activeconnection="Provider=SQLOLEDB.1;Password=111111;Persist Security Info=True;User ID=sa;Initial Catalog=xhq;Data Source=192.168.191.142"  ’这句话是连接数据库的数据源,要做修改
        Cmd.CommandType = 1
        sql="selec t * from 表 where name=username"
        Cmd.CommandText = sql
        Set res = Cmd.Execute()
        Set res = nothing
        Set cmd.ActiveConnection = nothing
    Set Cmd= nothing
     
    11 检查页面是否存在
    对象exist可以检查某一个页面是否存在。
    代码:
    if Browser("…").Page(“…").Exist then
    ‘在运行结果中显示的报告, “micPass”的状态是通过, micFail是不通过
       reporter.ReportEvent micPass ,“页面存在“,”通过“ 
       else
       reporter.ReportEvent micFail ,"页面不存在“,"不通过"
    end if

    12 防止程序中断的方法
    在回放脚本的时候,有时因为错误导致运行的脚本中断,不能自动运行。为了能达到真正无人职守的状态可以在脚本的最前面加上如下的代码:
    On error resume next  ‘遇到错误返回到脚本的下一行继续执行。
    On error goto 0 ‘错误处理的控制权,平时是由QTP控制的(这个叫默认的),当有on error resume next 时,是交给on error处理,当on error goto 0时,就换给QTP

    13 同步点的设定
    等待某一对象出现后继续执行,为了防止qtp找不到对象而设定同步点。有2种方法:1种是用wait加等待的时间,如wait 5(qtp等待5秒钟后继续执行)。另一种方法是等待要执行对象的出现,如果出现就继续执行,否则一直等待,代码如下:
    y=......waitproperty("visible",true,10000)
    If y=true then
       ‘执行下一条语句
       else
        ’对象不出现就一直等待,直到过了10000秒后程序找不到对象报错
    End if

    14 截屏
    在优化脚本时,如果想查看某一页面在执行后的页面效果,可以采取截屏的办法截取当前的操作页面并保存到本地。代码:
        desktop. capturebitmap “c:"***.bmp“,ture     ’在脚本中想要查看的一行插入,运行后图片保存到设置的路径下

    15 导入execl文件并参数化数据方法
    Qtp自带了datatable表,可以把要参数化的数据写在里面,但这样写脚本和数据不能分离,后期不好维护脚本。现在采用从外部导入execl文件的方法导入数据。代码如下:
       datatable.ImportSheet “D:"..."data.xls”,“sheet1”,“global“
       ‘第一个参数是要导入文件的路径,第二个是execl的第一个表格,第三个参数是在execl的全局范围内查找
       另外datatable对象还有很多操作,比如:获取表中字段的行数,插入表数据,删除数据等,下面是获取表中数据的代码:datatable("A","dtglobalsheet)

    16 为描述性编程自动创建注释
       当希望在每一个新建action时都增加一些头部说明,比如作者、创建日期、说明等信息,那么用action template 来实现最简单快捷。 方法:用记事本等文本编辑器,输入如下类似的内容:           'Company:东方般若            'Date: Date          然后将文件保存为ActionTemplate.mst,并存放到QTP安装目录下的dat目录。

    17 导入vbs文件
    想要实现脚本的函数化,并更好的维护它,可以把一些公用的函数写到vbs里面,用qtp来调用它。
    实现调用vbs的方法有2种:
    1.函数executefile加vbs文件的路径
      executefile “c:"..."funcation.vbs”
    2.设置QTP test/settings/resources/+函数目录

    18 时间差函数
    统计两个日期时间段之间的间隔,还有多少小时
    Dim timediff
    timediff=datediff(“H”,now,“2008-8-8” )
    Print timediff

    19 获取web下拉框中数据的行数和数据值
    1.获取行数:首先将webtable添加到对象库中,查看对象库里有该webtable的属性后
    count=Browser("…").Page("Page").Frame("…").WebTable("...").RowCount
       Msgbox count ‘查看行数
    2.获取数据值,
       for i=1 to  count   
    value=Browser("…").Page("Page").Frame("…").WebTable("...").getcelldata(i,1)
       msgbox value
       next
    获取到列表中的数值后,qtp的对象库中没有这个WebElement的对象,一般采用描述性编程的方法获取对象,比如:用getcelldata获取的表中数据的innertext属性是“普通岗”,那么就可以用如下代码:
    for i=1 to  count   
       value=Browser("…").Page("Page").Frame("…").WebTable("...").getcelldata(i,1)
     
       Browser(“…”).Page(“Page”).Frame(“…”). WebElement(“innertext:=“&value,”index:=1”).click
    next

    20 对象获得焦点
    判断某个webedit输入框是否获取了焦点,如果没有获取就给它焦点,然后输入数值。代码如下:

    if not browser("**").page(“**").webedit(“
    **").object.isdisabled  then
             .object.focus
             .object.set "输入数值“

    21 获取对象当前属性值
    用GetROProperty可以获取对象的当前属性值,比如一些对象的属性经常发生变化,用getroproterty就能定位对象当前的属性状态来执行相应的操作。
    Dim pro
    pro= browser("**").page(“**").webedit(“
      **“). GetROProperty(“property”,value)
    Msgbox pro ‘弹出窗口,查看获取的属性。

    22 Systemutil对象的应用
    利用systemutil可以实现的功能:回放qtp脚本时禁止鼠标和键盘的输入;打开应用程序或web;通过句柄关闭进程;通过进程名关闭进程等。下面的代码是打开百度网页:
      systemutil.run “iexplore.exe”,“http://www.baidu.com”,“”,“”,“”,3        ‘打开百度的首页,最后面的参数“3” 代表打开ie后最大化

       SystemUtil.CloseProcessByName(“iexplore.exe”)      ‘关闭ie

      
    23 Action的使用
    action分为内部调用和外部调用2种方法:内部调用使用split划分;外部调用时被调用的action设置成share,并共享对象库。
       split action:RunAction "action", oneIteration

    24.  随机数
    在测试中有时会用到随即数,有多种方法:
    第一种 :n=randomnumber.value(1,255)  ’n的值从1到255之间随即产生
    第二种 :randomize      ‘更新反回的数据          dim n
                 n=int (10*rnd())
                 msgbox n        ‘n为10以内的整数


    25 “is+*”类型功能
       isarray'是否是数组 isconnected'判断QTP是否连接到TD isdate'是否是合法的日期类型 isempty'判断是否初始化 isNull'判断是否为空值 isNumeric'判断是否是数字型 isobject'判断是否一个功能对象 isready'判断设备是否准备就绪 isRootFolder'是否是根目录

    26 对象库
    打开对象库resources->object repository,或者用快捷方式:ctrl+r来打开。
    1.Qtp中的对象库和脚本是一一对应的,如果脚本中某个对象在对象库中不存在,则无法回放成功,会提示找不到对象。
    2.对无法识别的对象用spy工具获得后添加到对象库中。
    3.有时候脚本回放失败就是找不到对象的原因,可以通过用spy工具查看找不到对象的属性,然后打开对象库,比较二者的属性信息,如果属性有不相同的说明就是属性的原因,可以通过更改属性的方式统一对象属性。

    27 调试脚本
    1.脚本编写完毕,可以用按ctrl+f7来查看脚本是否有语法错误。
    2. Msgbox和print:在回放脚本时可以方便的查看自己想看到的信息。
    3.设置断点:为了测试某一小段脚本的功能,而当整个action很长的时
    候,可以设置断点单步debug。

    28 强制退出
    遇到问题退出可以用exittest或 exit for,例如下面代码:
    Public function text_exit()
         for i=0 to 10
                if i=3 then
                    exittest
                    ‘exit for
                end if
         next
    End function

    Text_exit()
         
    29 连接数据库_增删改
    Dim conn,strSql    '定义变量
    set conn = CreateObject("ADODB.Connection")   '创建连接
    conn.ConnectionString="Provider=SQLOLEDB.1;Password=isaac121379;Persist Security Info=True;User ID=sa;Initial Catalog=WisdomCRM;Data source=192.168.12.29"   '设置连接字符串
    conn.open  '开启连接
    'strSql="insert into UM_User  values(1,'UserID')"  '设置插入语句
    strSql="drop  table TM_Task_14_Target"
    'strSql="select *  from UM_User"

    If conn.state=0 Then   '如果连接状态为0,表示连接失败,写入reporter对象中,否则表示连接成功
        Reporter.ReportEvent micFail,"testing","数据库连接失败"
        conn.close
        Set conn = nothing
    else
       Reporter.ReportEvent micPass,"testing","数据库连接成功"
       conn.execute strSql    '执行更新语句
       conn.close
       Set conn = nothing
    End If

    30 连接数据库_查
    Dim conn,res,strSql    '定义变量
    set conn = CreateObject("ADODB.Connection")   '创建连接
    conn.ConnectionString="Provider=SQLOLEDB.1;Password=isaac121379;Persist Security Info=True;User ID=sa;Initial Catalog=WisdomCRM;Data source=192.168.12.29"  '设置连接字符串
    conn.open  '开启连接
    Set res = CreateObject("ADODB.RecordSet")   '创建一个记录集对象
    strSql="select * from UM_User"  '设置查询雨具
    If conn.state=0 Then   '如果连接状态为0,表示连接失败,写入reporter对象中,否则表示连接成功
        Reporter.ReportEvent micFail,"testing","数据库连接失败"
        res.close                               '关闭结果集和连接,并且置为空
        Set res = nothing
        conn.close
        Set conn = nothing
    else
       Reporter.ReportEvent micPass,"testing","数据库连接成功"
       res.open strSql,conn    '执行查询语句
       res.MoveFirst        '将记录集游标指到记录集的最开始
       Do
          Reporter.ReportEvent micPass,"file",cstr(res(0))+" : "+cstr(res(1))  '循环遍历查询结果,并且保持到reproter对象中,直到记录集到达末尾,循环结束
          res.MoveNext
       Loop until res.eof = true
       res.close
       Set res = nothing
       conn.close
       Set conn = nothing
    End If
    低级录制
    在无法识别对象时使用
    利用Vbs运行外部程序
    WSH也就是用来解析Vbs的宿主,本身包含了几个个常用对象:
    1、scrīpting.FileSystemObject  —>  提供一整套文件系统操作函数
    2、scrīpting.Dictionary  —>  用来返回存放键值对的字典对象
    3、Wscrīpt.Shell  —>  提供一套读取系统信息的函数,如读写注册表、查找指定文件的路径、读取DOS环境变量,读取链接中的设置
    4、Wscrīpt.NetWork  —>
    提供网络连接和远程打印机管理的函数。(其中,所有scrīpting对象都存放在SCRRUN.DLL文件中,所有的Wscrīpt对象都存放在WSHOM.ocx文件中。)
    现在我们需要的是第三个对象,好了,让我们先连接一下对象看看,在记事本的编辑窗口中输入:
    Set ōbjShell = CreateObject(“Wscrīpt.Shell”)
    objShell.Run “notepad”
    Objshell.run “calc”

    自建日志
    Public Sub logfile(message)
    Const ForReading = 1, ForWriting = 2, ForAppending = 8
    Dim fileSystemObj, fileSpec
    Dim currentTime
    currentDate = Date
    currentTime = Time
    testName = "log"
    Set fileSystemObj = CreateObject("scrīpting.FileSystemObject")
    fileSpec ="f:"log.txt"
    If Not (fileSystemObj.FileExists(filespec)) Then
    Set logFile = fileSystemObj.CreateTextFile(fileSpec, ForWriting, True)
    logFile.WriteLine("###############################################")
    logFile.WriteLine (currentDate & currentTime & " Test: " & environment.Value("TestName") )
    logFile.WriteLin("######################################")
    logFile.Close
    Set logFile = Nothing
    End If
    Set logFile = fileSystemObj.OpenTextFile(fileSpec, ForAppending, False, True)
    logFile.WriteLine (currentDate & " "& currentTime & " " & message)
    logFile.Close
    Set logFile = Nothing
    Set fileSystemObj = Nothing
    End Sub
    logfile(“ok")
    Vb6生成dll
    Environment对象
    检查页面文字显示颜色
    Set Elements = Browser(“WisdomCRM客户关系管理系统”).Object.Document.all.tags(“div”)’tags(“td”)为在td中检查
    For each Element in Elements
      If Element.InnerText="执行团队" Then
        strhtml=Element.Innerhtml
        n=instr(strhtml,"color=red")
        If n=0 Then
          msgbox "Text color is red!"
       exit for
        End If
      End If
    Next
    关闭重复的页面
    Dim loginwin
    Set loginwin = descrīption.Create()                               '创建对象名为loginwin的对象
    loginwin( "name").value="WisdomCRM客户关系管理系统"   '对象属性及值

    Set child=desktop.ChildObjects (loginwin)
    cout=child.count
    msgbox cout
    For i=1 to cout
       child(i-1).close  '循环寻找这个对象
    Next
    获取当前测试的路径
    Path = environment("TestDir")'获取当前测试的路径
    msgbox path
    获取本机ip
    set IPConfigSet = GetObject("winmgmts:{impersonationLevel=impersonate}").ExecQuery _
    ("select IPAddress from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE")

    for each IPConfig in IPConfigSet
    if Not IsNull(IPConfig.IPAddress) then
    for i=LBound(IPConfig.IPAddress) to UBound(IPConfig.IPAddress)
    Msgbox IPConfig.IPAddress(i)
    next
    end if
    next
    点亮对象
    highlight
    fireEvent用法
    针对Link对象,onmouseover时间, 还有onchange, onclick, ondblclick, onblur, onfocus, onmousedown, onmouseup, onmouseout, onsubmit, onreset, onpropertychange事件可以使用
    sendkeys实例
    Set wshshell=createobject(“wscrīpt.shell”)
    其使用格式为:object.SendKeys string “object”:表示WshShell对象 “string”:表示要发送的按键指令字符串,需要放在英文双引号中。 1.基本键   一般来说,要发送的按键指令都可以直接用该按键字符本身来表示,例如要发送字母“x”,使用“WshShell.SendKeys "x"”即可。当然,也可直接发送多个按键指令,只需要将按键字符按顺序排列在一起即可,例如,要发送按键“happy”,可以使用“WshShell.SendKeys "happy"”。
    sendkeys实例
    2.特殊功能键 对于需要与Shift、Ctrl、Alt三个控制键组合的按键,SendKeys使用特殊字符来表示: Shift---------WshShell.SendKeys "+" Ctrl---------WshShell.SendKeys "^" Alt---------WshShell.SendKeys "%" 由于“+”、“^”这些字符用来表示特殊的控制按键了,如何表示这些按键呢? 只要用大括号括住这些字符即可。例如: 要发送加号“+”,可使用“WshShell.SendKeys "{+}"” 另外对于一些不会生成字符的控制功能按键,也同样需要使用大括号括起来按键的名称,例如要发送回车键,需要用“WshShell.SendKeys "{ENTER}"”表示,发送向下的方向键用“WshShell.SendKeys "{DOWN}"”表示。 Space---------WshShell.SendKeys " " Enter---------WshShell.SendKeys "{ENTER}" ←---------WshShell.SendKeys "{RIGHT}" ↑---------WshShell.SendKeys "{UP}" F1---------WshShell.SendKeys "{F1}" Tips:如果需要发送多个重复的单字母按键,不必重复输入该字母,SendKeys允许使用简化格式进行描述,使用格式为“{按键 数字}”。例如要发送10个字母“x”,则输入“WshShell.SendKeys "{x 10}"”即可。

    先录制取得初始脚本,再做简单的修改和参数化,再进行封装形成可重用的函数,最后回放调试,形成了最终的脚本。

  • Sikuli0.10.1试用

    2010-08-04 14:57:23

    在51testing 7月份的杂志上看到这个工具,下载了来(http://groups.casil.mit.edu/uid/sikuli/download.shtml)试用了下,此工具虽然和描述中那样的操作图形化,界面简单,但是回放出错率挺高的,必须将被回放的东西置于IDE之后,且精准的真是差强人意。试验了N多次,那工具就是找不到我IE的地址栏,后来N多找不到图片的情况发生,很是失望。

    参考:http://bugway.appspot.com/?p=324801

  • 今天开始进行数据迁移项目

    2010-08-04 11:05:52

    今天开始进行数据迁移项目,在此做个标记,用来总结在此项目中学到的东西。

    以后在做项目时,要总结失误,积累经验知识,并在下次项目中进行逐步改进。

  • 360病毒软件误杀LoadRunner文件orchidcommutils.dll

    2010-06-11 09:44:26

    昨天发现我的LR启动不了了,几近周折的调试,还是不行,搜遍各大论坛,连abc的论坛也搜索了,还是解决不了,郁闷的重装了LR,结果还是悲剧的不能启动。郁闷到顶!

    无意间查看了下360杀毒,发现历史中有两个屏蔽病毒操作,点进去一看,我晕!破360又坏我事,它竟然是整个事件幕后黑手!

  • 转-LoadRunner中Web_submit_form和Web_submit_data的区别详细解释

    2010-06-10 14:40:44

    在LoadRunner中有两个常用函数:Web_submit_form和Web_submit_data,在群里有人问这两个函数有什么区别。为什么会有两个不同却功能相似的函数。区别在哪里。

    首先,从工具的角度来说,厂商推荐使用Web_submit_form函数,因为这个函数看起来更易用,需要关注的东西较少。但是,从个人的角度来说,我推荐使用Web_submit_data函数。因为这个函数提供更多技术细节。在测试的过程中可控性更高。下面我就详细解释一下两个函数的工作机制:

    首先看一下下面这段HTML代码

    <Form. Action=login.asp Method=POST>

    <input name=user value=“”>

    <input name=password value=“”>

    <input type=hidden name=sessionID value=15379>

    </Form>

    在录制的过程中,当打开这个页面的时候,这个页面会放在LR的Cache中,之后当我们输入了用户名、口令之后,点了一下提交。Browser会向LR Record Proxy发送一个提交请求,提交内容应该是这样的:

    POST login.asp HTTP/1.1

    user=steve password=buba

    sessionID=15379

    这时候,LR会自动比较提交的内容和Cache的内容,首先它会比较提交的数据项和Cache中的数据项是否一致。页面中有三个输入域user、password、sessionID,而提交的内容也有这三项数据,所以它认为提交数据使用了Cache中的页面,之后它会继续比较具体数据的值。它会发现sessionID的值和Cache中的值是一样的。但是user和password的值不一样。

    这时候,Web_submit_form和Web_submit_data的区别就出现了:

    web_submit_form(”start",

    ITEMDATA,

    "name=user", "value=steve", ENDITEM,

    "name=password", "value=bean", ENDITEM,

    LAST);

    web_submit_data(”start",

    Action=login.asp,

    Method=POST

    ITEMDATA,

    "name=user", "value=steve", ENDITEM,

    "name=password", "value=bean", ENDITEM,

    "name=sessionID", "value=15379", ENDITEM,

    LAST);

    可以看到,Web_submit_form只提供了和Cache中有差别的数据,其余的数据会自动从Cache中取。而Web_submit_data则提供了所有的数据,不管Cache存在不存在Web_submit_data都是可以工作的。

    所以厂商会推荐使用Web_submit_form,因为它看起来更易用,甚至关联都不需要作,就能直接回放。但是这种情况只能对于简单系统适用。对于一些银行或者移动的复杂系统来说,有时侯会对Cache作特殊操作,Web_submit_form有时侯就会报一些莫名其妙的错出来。而Web_submit_data则跟Cache内容无关。稳定性和可控性都要比Web_submit_form要高很多。所以个人推荐尽量使用Web_submit_data函数。

  • Subject: HP LoadRunner 9.10

    2010-04-20 16:45:35

    Subject: HP LoadRunner 9.10 - Setup has determined that a previous

    installation has not completed     
    1. Open the %TEMP% folder (on the Start -> Run dialog box type: %TEMP% and

    click Enter).

    2. On this folder, search for a file named

    "Prereq_Mgr.HP_QuickTest_Professional_9.5.log". This file is created by the

    installation program and contains a list of registry keys that can

    potentially fail the latest setup process.

    Check for any entries to that file and figure out what to do about it

    双击PendingRenameOperations,在弹出的窗口中,将临时文件删除。

  • SOHU 招聘

    2009-08-25 16:21:52

    搜索引擎测试工程师招聘(高级、中级)


    你觉得自己是这样的人吗:
    面对技术难题,有打破砂锅问到底的精神。
    面对繁杂的业务需求,能够抽丝剥茧合理分解。
    面对简单枯燥的重复劳动,既能甘之如饴的完成,又能主动思考改进流程和方法,减少重复劳动。
    面对工作中的问题,能够不逃避、不回避,即使失败,也能主动总结,不会在一个地方跌倒两次。

    你觉得自己有这样的能力么:
    熟练使用C、C++,并对其他脚本语言有涉猎。
    拥有良好的程序设计思想,计算机原理、网络原理等基础知识扎实,技术术语熟知,与开发人员间的沟通无障碍。
    拥有良好的产品思想,能够从用户角度思考问题,与产品人员间的沟通无障碍。
    对产品有着近乎苛刻的质量要求,能够在各种压力下,坚持质量至上的原则。
    良好的文档能力,并且对文档和流程非常重视。

    如果你自信具备以上条件,那么请加入我们的搜索引擎测试团队,共同创造未来!

    搜索引擎测试工程师与普通的测试工程师有什么特别之处呢?

    在搜索引擎测试过程中,开发代码都是可见的,测试工程师与开发工程师协作非常紧密,除了发现bug以外,测试工程师还经常帮助开发跟踪bug原因,提出解决方案
    测试粒度方面,以组件级测试为主,单元测试、集成测试也都有广泛应用。因为搜索引擎包含了大量对搜索相关性等品质有重大影响的算法,因此算法的合理性测试也是重要的测试类型,这与其他的产品有明显的区别。
    由于搜索引擎作为大用户量的产品,对性能要求非常高,因此对测试工程师的性能测试及性能分析的能力要求相对较高。
    为了保证搜索质量,搜索引擎收录了海量数据,普遍采用分布式部署和多线程编程。这就要求整个系统的鲁棒性很高,鲁棒性测试也就成为了测试重点,对测试工程师的网络编程、多线程编程的理解程度要求较高。

            总体来说,搜索引擎测试工程师,需要具备全面的测试能力、问题分析能力、计算机基础知识,并且能够将这些能力与知识有机结合起来。
            那么,是否一定要有丰富的测试经验,才能加入搜索引擎测试团队呢?那可不见得。我们同样欢迎具备良好素质,好学勤奋的应届生或以前从事开发工作的工程师。应届生的爆发力、可塑性,开发工程师丰富的开发经验、技术水平,都是我们非常看重的。
            那么,如果只做过web应用黑盒测试,是否就不能加入了呢?那也不一定。如果您拥有丰富的web应用产品的测试经验,拥有良好的黑盒用例设计能力,我们也非常欢迎,因为web应用测试也是搜索引擎测试中不可或缺的组成部分。

            可以这样说,经过了在搜索引擎测试团队的工作与磨练,你将获得远超其他类型产品测试人员的经验与能力,成为测试行业高端专业人士,不仅对代码实现进行测试,还能发现产品的架构缺陷、设计缺陷,能够指导开发人员。
     
    windows网络产品测试工程师招聘

    “成为大师级的测试专家”,这曾经是我刚踏上测试这条路的梦想。时过境迁,才发现自己刚刚迈入测试的门槛。

    很多人不了解软件测试,也不看好它的前景。习惯的将测试理解成是一种“模拟用户重复的点击行为”。如果你也是这样的话,看来说服你要花费一些工夫了,先别着急,耐心的看下去吧,跟着我在测试的世界中走上一遭。

    软件测试最直接的目的,就是保证软件的质量。如何保证软件的质量呢?

    首先我们需要了解被测对象,当然不是仅仅知道了它是干什么的就可以,这只是产品层面的事情,我们还要尽可能多的考虑它究竟是如何实现。在技术方面,一个好的测试人员,在技术方面是不逊于任何一个开发的。从windows到linux,从bs结构设计到cs结构程序设计,各种平台,各类架构,被测对象的多样性决定了测试人员要在计算机技术方面要有扎实的基础,主动学习新软件技术的能力是前进的动力源。

    其次,了解了被测对象之后,必要的测试分析是不可或缺的,它正如开发人员不能上来就写代码,要做概要设计和详细设计一般。在这个阶段,如何降低测试复杂度,减轻测试时的耦合度,考虑哪些测试的类型,需要准备什么样的测试工具。工欲善其事,必先利其器。没有思想,代码只是一些英文字母和关键字的堆砌,同样,没有思想,测试用例只是一些汉字的叠加。发散而缜密的思维和深入的分析是一个高级测试人员必备的素质

    第三,经过了前面的准备工作,要开始用例的设计了,就像开发要开始写他们的代码一样。按照自己的思路去细化之前的思想。好的测试用例,是测试思想凝结出的精华。对比来说,开发注重代码规范,测试注重用例规范;完美的用例覆盖完美的代码逻辑,没有令人讨厌的缺陷,看上去是多么美妙的事情。思考思考再思考,细心细心更细心。

    第四,真正的测试执行到现在才到来,不过还不算晚,要相信万丈高楼平地起,靠的是平稳的地基。在这里有几个问题一定要解决
    你的语言表达和沟通能力怎么样?你会如何对待看上去很小的问题?你是否足够关心每个问题出现的细节?……

    看上去像是在搞心理测验。测试执行,引用微软亚洲研究院前院长沈向阳博士的一句话“nothing replace hard work”,准备工作做得差不多了,执行更多的是一种态度,一种责任。耐心,细心,不轻易放弃,有责任感的要求是好的测试工程师所强调的,更是未来一个成功人士的必备素质。

    第五,测试结果的总结和分析阶段,我们要对之前的执行结果和过程,进行深入的分析和总结,为上线,开发过程和项目管理提供最直接的数据。总结和报告犹如画龙点睛。

    那么,windows客户端测试主要做哪些工作呢?客户端测试,有纯windows端产品,也有windows client-服务器结构的产品,还有客户端-数据库的测试等等。从测试角度上讲,客户端的测试尤其复杂,平台的多样性,丰富界面,控件的多样性,要从中理出清晰的思路不是一件容易的事情,在客户端测试过程中,由于“盒子”过黑,大多数公司缺乏系统的分析测试,而是多采用了随机测试,并且过多的局限于功能,这让诸多参与测试的工程师感到无趣。从所涉及到的技术上来说,同时要了解的windows方面的技术也不少,什么是p2p,什么是nat穿透,什么是媒体数据流,什么是com,什么是activeX,BHO,除了这些还要熟悉网络,数据库等相关技术。要学习的东西很多很多; 从产品的角度上讲,windows占据了操作系统平台70%以上的市场,用户量很庞大,能够测试一个成功的客户端产品,让所测试的产品为大众所津津乐道,看着使用人数与日剧增。也会让每个参与测试的工程师颇有成就感

    洋洋洒洒的说了一大堆,希望可以明白客户端测试并不是一件容易的事情,所做的事情还有很多,除了保证产品质量,还要在驱动开发方面做很多工作,就是说不但要做的更好,还要做的更快,也就是更加高效。因为,品质卓越,力求高效一直是我们的目标。
    职业发展方面我不想说太多,只要我们抱着成为专家的目标,相信成为大师之后的你,也一定是各大公司争相竞争的人才。目前,高级软件测试人才是稀缺的,好的客户端软件测试工程师更是稀缺
     
    商业产品测试工程师招聘

    你觉得自己是这样的人吗:
    面对技术难题,有打破砂锅问到底的精神。
    面对繁杂的业务需求,能够抽丝剥茧合理分解。
    面对简单枯燥的重复劳动,既能甘之如饴的完成,又能主动思考改进流程和方法,减少重复劳动。
    面对工作中的问题,能够不逃避、不回避,即使失败,也能主动总结,不会在一个地方跌倒两次。

    你觉得自己有这样的能力么:
            了解Struts+hibernate+spring框架及其各层编程特点。
    曾经具备C/C++/Java/Perl一定的基础编程能力。
    可以快速编写复杂的sql脚本,并应用到触发器和存储过程。
    对业务规则非常敏感,并且拥有良好的理解能力。
    拥有良好的产品思想,能够从用户角度思考问题,与产品人员间的沟通无障碍。
    对产品有着近乎苛刻的质量要求,能够在各种压力下,坚持质量之上的原则。
    良好的文档能力,并且对文档和流程非常重视。

    如果你自信具备其中以上五个条件,那么请加入我们的商业产品测试团队,共同创造未来!

    商业产品测试团队有哪些特性呢?

    我们团队组建时间不长,各个岗位的人员均有需求。如果你有能力,这里将给你提供广阔的发展舞台。
    对于产品质量要求苛刻的客户,驱使我们不断的提高。如果你的web测试足够牛,那么来这里尽情施展吧。
    我们测试的对象是多样的,既要求我们懂得web应用测试,也要求我们掌握数据库存储过程、后台数据库任务、后台复杂网络应用服务的测试。
    业务的复杂性,以及技术的多样性,驱使我们团队不断的总结,并在组员之间进行传递, 在这里知识是共享的。如果你也渴望交流,那么加入我们吧。

        总之,商业产品测试团队是一只年轻,上进,踏实,肯干的团队,我们真诚的邀请你加盟。
     
    软件自动化测试工程师招聘

    你是否能够通过编写测试程序来代替手工测试的繁琐工作?
    你是否具有扎实的计算机基础知识、很强编程能力以及设计能力?
    你是否有很宽的技术面,能够综合运用各种方法来解决实际遇到的问题?
    你是否不仅懂开发,还具有测试思想,能够用程序驱动的方式来进行软件质量保证?
    你是否不仅能够自己开发,还能利用一些商业或开源的工具来简化复杂的问题?

    如果你的回答是肯定的,你或许已经认识到:
    软件测试自动化已经是软件测试发展不可逆转的趋势;
    精通自动化测试技术,无论从企业的核心竞争力还是个人的工作技能来说,都有巨大的优越性。

    那么,请你加入我们专业的自动化测试团队。

    我们在做什么?
    也许有些人提到自动化测试,就认为是“利用测试工具进行录制回放”或者“执行已有的自动化测试程序”。但,我们的工作方式不是这样。
           我们的自动化测试不是录制回放。
    录制回放只是自动化测试的最初级阶段,而我们目前正在使用自主开发的基于关键字驱动的自动化测试框架,框架具有模块化、层次化、松耦合等特点。使用框架,脚本、数据、业务分离,Case分层且能够复用。
            我们的自动化测试不仅仅是使用工具。
    我们会使用一些工具来简化复杂的问题,但这是不足够的。更多的情况下,我们会综合运用Windows底层编程、GUI编程、COM技术、HOOK技术等方法,辅助完成自动化测试需求。
           我们的自动化测试不是一种独立的行为。
    公司高层重视自动化测试,全面支持自动化测试。自动化测试纳入整体研发体系中,不仅在测试本身流程上、组织结构上进行了调整与改进,也在需求、设计、开发等各个环节进行配合。

    我们正在进行的工作
          使用java、C++等语言,自主开发API测试工具、评测工具、模拟工具、检查工具、性能测试工具。
           结合自动化测试工具并开发辅助脚本,以关键字驱动方式进行带有UI界面的自动化测试。
           为搜索产品测试组、桌面产品测试组提供多种自动化测试支持。比如输入法配置界面自动化测试、输入法效果评测、输入法按键流程测试、输入法切出速度检测、linux下内存泄露检查等

    你能来从事什么工作?
    我们是一个正处于发展期的团队,需要各种角色的成员加盟。
          如果你精通自动化测试技术
    加入我们的团队后,你能够与我们团队其他自动化测试方面的专家一起,进行自动化测试框架的设计、优化、扩展等方面的工作,并参与自动化测试流程的改进。发展方向为架构设计师。
          如果你有很强的开发功底及扎实的计算机基础知识,但目前还不是很熟悉自动化测试
    加入我们的团队后,会以导师制度进行培训,以实践的方式不断加强自动化测试思想,并在多个项目中进行磨练。发展方向为高级自动化测试工程师。

    我们的未来什么样?
          自动化测试平台
    我们将会搭建公司统一的自动化测试平台,实现可视化操作、测试用例集中管理、测试执行调动与控制、测试结果综合分析等。具体分为:
          测试管理--管理不同产品,不同版本的测试需求、测试脚本、测试用例、测试数据
          测试调度--测试的调度,控制和执行中心
          测试资源--管理测试资源,用于执行测试用例
          测试维护--测试用例的维护
          测试分析--测试结果汇总及分析


          技术及管理
          改进自动化测试框架,进一步提高可重用性、增强可扩展性、加强稳定性、降低维护成本、更加快速定位问题。
          提高项目需求覆盖度
          缩短成本收回周期
          更好与研发体系融合

          团队建设
          下半年招聘人数:5
          角色划分:架构设计人员、用例设计人员、脚本开发人员、测试执行人员

  • LINUX学习笔记3

    2009-08-17 11:19:25

    五、vi编辑器

    1、vim是vi升级版本,有增加5个方面

    • vim能无限撤销,vi只能撤到上一步(但vi有全部撤销功能)
    • vim可以跨平台
    • vim可用不同颜色显示代码,自动分析,自动提示
    • 能高亮显示
    • vim有Xwindow界面

    2、vi工作环境常用3种模式:

    • 查看模式: vi 文件名 ~= cat 只能查看
    • 编辑模式
    • 命令模式:此模式下可以直接编辑文本,可查找,替换,批量修改,可用正则表达式

    3、基本命令

    只读模式

    •  esc 退到只读模式
    •  a 插入,在当前字符后插入 
    •  A 在行尾插入
    •  i 在当前位置前插入
    •  I 在行开头插入
    •  o 在下行插入
    •  O 在上行插入
    •  s 删除当前字符,并进入插入状态
    •  S 删除当前行,并进入插入状态
    •  r 替换当前字符,仍为只读模式
    •  R 替换当前字符后面一行内的所有,并进入替换模式
    •  k j h l 分别为光标移动的上下左右
    •  0(零) 回到一行的最前面
    •  G 回文档的最后面(最后一行开头)
    •  ctrl + f/b 向前向后翻页
    •  H 回本页最上面
    •  M 回本页中间
    •  u 撤销到上一步

    命令模式

    • 用“:”可在任何状态下进入命令模式
    • set nu 加行号
    • set nonu 不加行号
    • “|”回文档第一行    :|2 到第二行,依次类推
    • 用“/”引导来查找 如/abcd 区分大小写,看下一个用“n”
    • :w存盘,存盘后不能撤销
    • :e!完全撤销

     

     

  • Java RMI、EJB

    2009-08-13 15:58:28

    Java RMI

    Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用应用程序编程接口。它使客户机上运行的程序可以调用远程服务器上的对象。远程方法调用特性使Java编程人员能够在网络环境中分布操作。RMI全部的宗旨就是尽可能简化远程接口对象的使用。

    Java RMI极大地依赖于接口。在需要创建一个远程对象的时候,程序员通过传递一个接口来隐藏底层的实现细节。客户端得到的远程对象句柄正好与本地的根代码连接,由后者负责透过网络通信。这样一来,程序员只需关心如何通过自己的接口句柄发送消息。

    接口的两种常见实现方式是:最初使用JRMP(Java Remote Message Protocol,Java远程消息交换协议)实现;此外还可以用与CORBA兼容的方法实现。RMI一般指的是编程接口,也有时候同时包括JRMP和API(应用程序编程接口),而RMI-IIOP则一般指RMI接口接管绝大部分的功能,以支持CORBA的实现。

    最初的RMI API设计为通用地支持不同形式的接口实现。后来,CORBA增加了传值(pass by value)功能,以实现RMI接口。然而RMI-IIOPJRMP实现的接口并不完全一致。

    所使用Java包的名字是java.rmi

    EJB

    企业级JavaBean(Enterprise JavaBean, EJB)是一个用来构筑企业级应用的服务器端可被管理组件。

    Java企业版API(Java Enterprise Edition)中提供了对EJB的规范。EJB是一个封装有某个应用程序之业务逻辑服务器端组件。EJB最早于1997年由IBM提出,旋即被太阳微系统采用并形成标准(EJB 1.0 和EJB 1.1)。其后在Java社区进程(Java Community Process)支持下陆续有一些JSR被制订来定义新的EJB标准,分别是JSR 19 (EJB 2.0), JSR 153 (EJB 2.1) 以及最新的JSR 220 (EJB 3.0)。

    EJB规范的目的在于为企业及应用开发人员实现后台业务提供一个标准方式,从而解决一些此前总是在作业过程中总是重复发生的问题。EJB以一个标准方式自动处理了诸如数据持久化,事务整合,安全对策等不同应用的共有问题,使得软件开发人员可以专注于程序的特定需求而不再饱受那些非业务元素的困扰。

    据此,EJB规范明确了一个应用服务器应当支持的中间管理细目,包括:

    • 数据持久化
    • 事务处理
    • 并发控制
    • 基于JMS的事件驱动
    • 基于JNDI的名字和空间管理
    • 基于JCEJAAS的安全管理
    • 应用服务器端的软件组件部署
    • 使用RMI-IIOP协议的远程过程调用
    • 将业务方法暴露为Web服务

    此外,EJB定义文档还指定了EJB容器和各EJB的角色定位,以及如何将EJB部署至EJB容器当中。

    EJB种类

    EJB容器可以接受三类EJB

    • 会话Bean(Session Beans)
      • 无状态会话Bean(Stateless Session Beans)
      • 有状态会话Bean(Stateful Session Beans)
    • 实体Bean(Entity Beans)
    • 消息驱动Bean(Message Driven Beans ,MDBs)

    无状态会话Bean是一类不包含状态信息的分布式对象,允许来自数个客户端的并发存取。实例变量的内容在前后数次呼出中不被保留(确切地说是不保证保留)。由于不必控制与用户间的对话信息而减少了开销,无状态会话Bean不像有状态会话Bean那样具有资源集约性。举例来说,一个发送邮件的EJB就可被设计为一个无状态会话Bean。在整个会话期,用户只向服务器提交一个动作:发送指定邮件到指定地址。(称为开关行为)

    有状态会话Bean是包含状态的分布式对象,即是说,贯穿整个会话它们都要保有客户端信息。举例而言,在一个网上商店进行实施结账很可能就需要一个有状态会话Bean,因为结账是一个多步动作,服务器端必须可以随时了解到用户已经进行到了哪一步。此外,尽管有状态会话Bean的状态信息可被保持,但始终只能同是由一个用户来访问之。

    实体Bean是含有持久化状态的分布式对象。这个持久化状态的管理既可以交给Bean自身(Bean-Managed Persistence,BMP),也可以托付于外部机制(Container-Managed Persistence,CMP)。

    消息驱动Bean是支持异步行为的分布式对象。它们并不对请求进行当即响应。比方说,某网站用户点击“请通知我更新信息”按钮,将会触发某个MDB将这名用户加入到数据库的希望获得更新信息用户列表中。这个动作就是一个异步的消息驱动过程,因为用户不必等待当时会返回某个结果。MDB的消息源来自Java消息服务(JMS)提供的消息队列或消息主题。自EJB 2.0规范起,JMS被加入进来以允许在容器内部实施事件驱动处理。与其他EJB不同,MDB不存在一个用户视图(如需要用户引用的远程接口),用户也不能通过资源定位获得一个MDB实例。MDB只在后台监听消息源并实施自动处理。

    除了上述以外,目前还有一些EJB处于设想阶段,如JSR 86提出了用于在Java EE应用中整合多媒体对象的媒体Bean(Enterprise Media Beans)。

    EJB实行

    EJB部署于应用服务器端的EJB容器中。规范给定了EJB与EJB容器之间,以及用户代码与EJB/EJB容器之间的交互方式。对于Java EE API,javax.ejb包定义了EJB类,javax.ejb.spi包定义了EJB容器应当实现的各个接口。

    在EJB 2.1和以前的版本中,每个EJB都由一个类和两个接口组成。EJB容器负责创建这个类的实例,接口则供客户端调用。

    两个接口分别被称为Home接口和组件接口,负责提供各个EJB远程方法声明。这些EJB远程方法可分成两组:

    • 类方法:由Home接口提供。与特定实例无关,仅负责一些公共内容,比如创建一个新的EJB实例(create方法),或寻找一个已经存在的EJB实例(find方法)等等。
    • 接口方法:由组件接口提供的针对特定实例的业务方法。

    EJB容器将为这些接口提供对应的实现类以充当客户远程代理,当客户端调用这个生成的代理类的某个方法时,代理类内部会将此调用的方法和参数封装成一个消息发送给服务器。服务器受到消息后在转发给真实的EJB实例,后者负责执行真正的业务逻辑。

    远程通信

    EJB规范要求EJB容器能够支持基于RMI-IIOP的EJB访问。EJB既可被任何CORBA应用访问,也能提供Web服务。

    事务

    EJB容器必须支持符合ACID(原子性/一致性/独立性/持久性)特性的容器级事务管理,以及bean内部事务管理。容器级事务需在部署描述符中(EJB应用的配置文件)进行声明。

    事件

    EJB使用JMS向客户对象发送消息,客户则可以异步地接受这些消息。MDB则接受来自客户端的消息。

    命名和目录服务

    EJB客户端使用JNDI或CORBA名字服务定位Home接口实现 对象。通过此Home接口,用户还可以寻找,创建或删除实体对象。

    安全

    EJB容器对客户端的访问权限负责。

    部署EJB

    EJB规范还定义了一个跨平台的统一部署机制。部署描述符中定义了关于EJB应用的一切相关内容。文件名通常为ejb-jar.xml。

    部署描述符是一个XML文档,负责为该EJB应用中的每一个EJB定义入口。部署描述符的主要内容包括:

    • Home接口名
    • Bean的Java类名
    • Home接口的Java接口名
    • 组件接口的Java接口名
    • 持久化存储(针对实体Bean)
    • 安全策略和角色分配

    通常EJB容器提供者还定义了一些额外的XML或其他格式描述文件来强化其容器的功能。他们还同时提供这些描述文件的解读工具类和对Home接口的自动实现类生成。

    EJB3.0起开始广泛使用Java注释替代传统的部署描述符ejb-jar.xml。但后者仍然有效。

  • Navicat与MySQL GUI Tools比较

    2009-08-05 12:07:58

    MySQL GUI工具很多,本文就常用的Navicat for MySQL与MySQL GUI Tools的特色功能做一个详细介绍与比较。

    一、MySQL GUI Tools

    MySQL官方提供的一个可视化界面的MySQL数据库管理控制台,提供了四个图形化应用程序,这些图形化管理工具可以大大提高数据库管理、备份、迁移和查询效率。它们分别是:

    ◆ MySQL Migration Toolkit

    ◆ MySQL Administrator

    ◆ MySQL Query Browser

    ◆ MySQL Workbench

    1.MySQL Query Browser

    MySQL查询浏览器是为MySQL数据库服务器创造,执行和优化SQL查询的最简单的可视化工具。MySQL Query Browser主要特色功能:

    ◆ 查询工具栏导航按钮,让您浏览查询历史,可以回顾及重新执行以前的查询。可以保存查询,打开查询文件 *.qbquery。

    ◆ 使用结果窗口轻松管理多个查询

    比较多个查询通过查看制表符分隔,或是纵向或是横向联合的显示在结果窗口。此外,解释按钮,可以用来获得解释,输出为当前查询。比较按钮允许您快速比较两个查询的结果,让您确定在何处行已插入,更新或删除。

    ◆ 脚本编辑与调试

    脚本区域的特点是编号和语法突出。另外,脚本调试按钮,使您可以设置断点和控制执行该语句和脚本。

    ◆ 内置帮助
    即时帮助你获得搜选的对象,参数,和职能,可以查看mysql syntax语句句法,函数,参数。

    2.MySQL Administrator

    Mysql Administrator让使用者更容易管理和监测你的MySQL环境,并对数据库取得更好的能见度。

    MySQL Administrator主要特色功能:

    ◆ 启动/停止mysql服务

    ◆ 健康状况查看:连接健康实时曲线图查看(连接使用率,流量,sql查询数), 内存健康查看(Query Cache Hitrate,Key Efficiency), 状态变量查看(普通,性能,网络,执行的命令,混合,新变量) , 系统变量查看(普通,连接,SQL,内存,表类型,新变量)

    3.Migration Toolkit

    ◆ 可以从MS SQL,Oracle等数据库移植复制数据库到Mysql。

    4.MySQL Workbench

    ◆ 添加EER 图表(Extended Entity-Relationship的缩写)

    ◆ 使用默认Schema,创建新表,新的视图等对象

    ◆ 可以导入SQL脚本

    缺点:

    ◆ Mysql Query Browser总是做了几个查询之后就使用内存太多。

    ◆ 手动安裝 MySQL GUI Tools 5.0时,将目录名称取名为中文,或是将它放置在桌面上执行 MySQL Query Browser,在中文系统会产生此问题:..... MySQL GUI Tools 5.0\XML\mysqlqb_functions.xml (error

    ◆ 中文介绍及中文资料不多。

    ◆ 导入导出支持格式太少。

    二、Navicat for MySQL

    Navicat for MySQL是一个强大的MySQL数据库服务器管理和开发工具。它可以与任何3.21或以上版本的MySQL一起工作,并支持大部分的MySQL最新功能,包括触发器、存储过程、函数、事件、视图、管理用户,等等。它不仅对专业开发人员来说是非常尖端的技术,而且对于新手来说也易学易用。其精心设计的图形用户界面(GUI),Navicat for MySQL可以让你用一种安全简便的方式快速并容易地创建,组织,访问和共享信息。

    Navicat for MySQL在三种平台上是可用的——微软Windows、Mac OS X 和Linux操作系统。它可以使用户连接到本地/远程服务器,提供了几种实用工具,例如数据结构同步、导入/导出、备份和报告,使维护数据的过程很容易。

    除了常规的管理数据库对象外,Navicat for MySQL功能主要有:

    ◆ 多种格式的导入导出能力,使维护数据的过程很容易。并可以从ODBC导入数据:将MSSQL,Oracle数据导入MySQL

    ◆ 批量的工作调度处理,有力减轻了数据库管理员的负担。

    ◆ 快速地实现广域网远程连接,更加安全简便。

    ◆ 智能地构建复杂的SQL查询语句,提高开发效率。

    Navicat for MySQL相比MySQL GUI Tools有其自身优势:

    ◆ 下载次数最多的MySQL图形用户工具。自2001年初以来, Navicat已在世界各地被下载超过二百万次,并有超过五万个客户群用户。

    ◆ 支持Mysql数据库新对象,例如事件。

    ◆ 导入导出支持多达17种格式(slk,dif,wk1,wq1,rtf,mdb,sav,ldif等特殊的格式)。

    ◆ 报表设计,打印及定制。

    ◆ 具有结构同步,数据同步功能而且速度快。

    ◆ 调度,创建Batch Job,设置任务调度. 创建一个设定的计划批处理工作,以计划执行一个或多个定期的,指定开始及结束的日期及时间。批处理可以创建的对象包括查询,报表打印,备份,数据传送,数据同步,导入和导出。发送计划工作的电子邮件通知,产生通知电子邮件给你指定的收件人。

    ◆ 安装下载非常方便,占用内存少,运行速度很快。

    ◆ 简体中文版已经发布,且有中文技术支持论坛。中国大陆有授权销售代理商。

    缺点:

    ◆ 没有像MySQL Workbench那样的EER图表,ER数据库模型工具。(可能不久就有了)

    ◆ 数据同步与结构同步时注意保持数据库版本的一致性。

    文章来源:网站制作爱好者(www.devdao.com) 出处:http://www.devdao.com/Article/533113.htm

661/41234>
Open Toolbar