海是我向往的地方,吸纳和咆哮是他的魅力!!!

发布新日志

  • 精妙Sql语句

    zhaoyabin123456 发布于 2009-02-26 17:54:20

  • Loadrunner Port Mapping录制方法

    zhaoyabin123456 发布于 2009-08-18 12:26:48

    Loadrunner Port Mapping录制方法(一种通用的录制脚本的方法)


    以下观点仅是本人对loadrunner的理解所写,不一定正确,仅供大家参考!如果有不对的地方还请指出!

    我们在很多时候因为无法录制脚本而困惑,如loadrunner使用FTP协议录制Core FTP Lite时,只能看到loadrunenr捕获到事件,但无法生成脚本,又比如使用POP3或SMTP协议录制邮件收发时也是只能捕获到时间,但无法生成脚本,此时我介绍一种万能的录制方法可以解决这个问题。

    其实loadrunner录制的基本原理就是通过Port Mapping这个方法实现的,只不过我们在平时没有在意而已,那么先来介绍一下loadrunner典型的录制原理,再介绍一下loadrunner使用Port Mapping方式的录制原理。

    通常情况下,我们在录制脚本的过程是:

    1、  选择协议

    2、  输入要录制的URL或指定要录制的应用程序的路径

    3、  选择录制脚本的位置,存放在哪个ACTION中

    4、  设置录制选项

    5、  开始录制

    此时loadrunner会自动监控你所指定的URL或应用程序所发出的请求及服务器返回的响应,它做为一个第三者监视着客户端与服务器端的所有对话,然后把这些对话记录下来,生成脚本,再次运行时模拟客户端发出的请求,捕获服务器端的响应。它在做监视时会自动捕捉客户端发出请示时所用的端口,并根据请求内容向服务器端的相应端口发送,而服务器回应时,根据请求消息中的端口向客户端某个端口发出回应,也就是说loadrunner监听的端口是由应用程序或请求所决定的。

       好了,知道通常情况下loadrunner录制脚本的原理后,我们在说一下Port Mapping录制脚本的原理:

       Port Mapping录制过程是:

       我们已使用POP3协议录制收邮件的过程来举例

    1、  选择协议,选择POP3协议

    2、  在要录制的应用程序路径中输入“loadrunner安装路径\bin\wplus_init_wsock.exe”

    3、  设置录制选项,在NETWORK的Port Mapping中新建一个代理

    根据下图新建一个代理:

    在socket service设置中,要指明你客户端程序要连接的服务器地址、端口、协议、录制脚本的类型等选项,由于负责收邮件的服务器默认的端口是110,所以我们这里将PORT设置为110;

    在TRAFFIC FORWARDING设置中,这个端口可以为任意端口,主要是为了让loadrunner启动的代理服务知道要把所有发往指定端口111的请求转发给指定服务器的110端口

    原理图如下:

    4、  设置要录制的程序端口

    将要录制的应用程序原本发往外网服务器的请求发送到本地的loadrunner启动的代理程序上,以便loadrunner进行监控

    设置发送到本地的111端口:

    5、  完成以上设置后,就可以开始录制脚本了

    在录制脚本时我们会看到loadrunner会启动一个代理程序

     

     这个就代表我们设置的代理服务正常启动了。通过重新录制我们不仅看到了loadrunner捕获到了事件,而且正确生成了脚本。

    好了,总结一下Port Mapping录制的录制原理:

    首先将要录制的应用程序向服务器发送请求的服务器地址和端口改为本地计算机及111端口,在Port Mapping中设置的代理程序再将发往111端口的所有请求转发给真正的服务器端,相当于loadrunner强制性的将本地某端口的通讯录制了下来,通过这个代理更明确了需要监控的端口和协议。

    其实loadrunner通常使用的录制方式也是采用这样一个原理,只不过我们并不知道它具体监控的是哪个端口,而在Port Mapping录制方法中我们明确的指定了监听端口。可以说通常的录制方法是一种隐性的,而后一种录制方法是显性的。

    可以通过此方法录制我们现有的所有协议的脚本,不会再出现只看到事件无法生成脚本的情况了!

    其实这才是一种通用的录制方法!

  • LoadRunner中的一个关联技巧

    zhaoyabin123456 发布于 2009-08-18 14:50:55

       众所周知,在LoadRunner中,关联是一个很重要的动作,大多数的脚本在录制完成后并不能直接回放,需要通过一定的关联才能成功回放。关联的技巧有很多,这里介绍的就是其中之一,以下用一个实际的例子来说明。
        脚本的背景如下:
        web_submit_data("classiLoanMaterial.jsf_2")(web_submit_data函数的其它部分省略,下同。)返回的页面上可能存在多条记录,可能一条,可能两条,也可能三条,等等。我们需要将这些记录逐个选中进行操作。注意:不是全部选中,而是要逐条记录进行操作。同时,每一条记录各有一个编号,这是需要进行关联的值。在下面的操作中web_url("directAdjust.jsf",
            "URL=http://128.64.96.105:1158/clpmapp/bizprocess/loanservice/creditassetsriskclassi/
    classiadjuststepbystep/directAdjust.jsf?approveFormNum=123456")需要使用到该编号,即黑体字部分的值。面对这样的目的,很自然地,我们会想到用一个循环语句来实现。首先,在classiLoanMaterial.jsf页面之前加一个关联如下:
        web_reg_save_param("sor","LB=sor\" value=\"","RB=\"","Ord=ALL",LAST);将Ord参数值设定为ALL,则关联函数将自动把符合条件的关联值保存到参数数组里。在本例中,假设关联值返回三条记录,则LR分别将值保存到sor_1,sor_2,sor_3中,同时,LR还将自动创建一个sor_count变量来保存总的记录数,在这里sor_count值等于3。利用这些信息,我们就可以很方便地在循环语句中实现我们的目的了。步骤如下:
    1、声明各变量:
        int count;
        int i;
        char sor[50];
        char sorvalue[50];
    2、将返回的记录数保存到count变量里:
    count=atoi(lr_eval_string("{sor_count}"));
    3、使用for循环:
    for(i=1;i<=count;i++)
    {
        sprintf(sor,"{sor_%d}",i); //分别将各个sor值保存到sor字符串中

        sprintf(sorvalue,"%s",lr_eval_string(sor));//通过lr_eval_string函数将字符串赋给sorvalue变量

    }
    4、在循环体中使用关联值替换相关值:
    web_url("directAdjust.jsf",
            "URL=http://128.64.96.105:1158/clpmapp/bizprocess/loanservice/creditassetsriskclassi/
    classiadjuststepbystep/directAdjust.jsf?approveFormNum={sorvalue}")
     
        一切看起来似乎顺理成章,然而如果按照以上的步骤做下来,将会很遗憾地发现:我们定义的{sorvalue}值根本就不被LR认可并接受,于是它将无情地给我们抛出一个错误,说该值是非法的。怎么办?难道我们前面做的一切都白费了吗?
        有句老话说得好:天无绝人之路。聪明而又善良的LR开发团队已经为我们考虑到了这个问题,给我们预备了一个很有用的函数:lr_save_string,它可以帮助我们解决这个问题。于是我们祭出lr_save_string这道最后的杀手锏:
    5、在使用关联值之前进行字符串格式转换:
        lr_save_string(sorvalue,"sorvalue1");
       
    web_url("directAdjust.jsf",
            "URL=http://128.64.96.105:1158/clpmapp/bizprocess/loanservice/creditassetsriskclassi/
    classiadjuststepbystep/directAdjust.jsf?approveFormNum={sorvalue1}")

    需要特别注意lr_save_string的用法,它是参数值在前(sorvalue),参数名在后("sorvalue1"),这和一般的习惯用法正好反过来(真是好奇怪!)。而且"sorvalue1"这个参数名称不需要事先声明,它只是一个字符串而已(这也比较奇怪!^_^)。

    到此,我们总算大功告成!脚本回放成功,并且正确达到了预期的效果!打完收工!

    总结:C的变量不能直接在LR的API里调用,所以必须用lr_save_string进行转换。

    最后顺便说一下,lr_save_string这个函数真的很好用,这个例子中提到的方法也适用于另外一些情况,比如说有时候,通过关联函数出来的值我们不能直接使用,还需要做一些特殊的处理时,那么我们可以把关联得到的值取出来,赋给一个字符串,对其进行一番修剪加工后,再用 lr_save_string,就可以使用它来替代需要关联的值了。

    后记:我的这篇文章发布在网上以后,在广大的测试同行中间引起了强烈的反响,他们纷纷发来贺电和表扬信,对我这种勇于探索、乐于分享的精神给予了充分的肯定。^_^当然,这中间也难免存在极个别的不和谐声音,例如Zee同学就对我的这篇文章提出了不同看法,他觉得我的做法是把简单的问题复杂化了,理由是可以只做一次关联,每次只取第一笔记录即可,当循环进行操作时,第一笔做完以后,第二笔记录自然会上升到第一笔记录的位置,因此没有必要使用关联数组。我认为他的疑问并非没有道理,而且是比较有代表性的,因此我在这里做一个补充说明。在我接触过的大多数应用系统中,确实都是按照Zee所说的方式进行处理,在这种情况下,脚本的处理的确没有必要像我以上所述的那样复杂。不过我在本例中谈到的例子比较特殊,在操作完成后,它只是把每笔记录的状态位由“未完成”修改为“已完成”,而原有的记录并没有消失,而是仍然停留在原有的位置,此时如果按照Zee所说的方法,那么在执行第二次循环时,LR将取到操作状态为“已完成”的第一笔记录,而不会取到下一笔未完成的记录,显然这是不符合我们的要求的,因此在这里我需要做以上这样复杂的一个处理。

  • Loadrunner如何在脚本中做关联

    zhaoyabin123456 发布于 2009-08-18 14:52:30

    如何在脚本中做关联 (Correlation)
    当录制脚本时,VuGen会拦截client端(浏览器)与server端(网站服务器)之间的对话,并且通通记录下来,产生脚本。在VuGen的Recording Log中,您可以找到浏览器与服务器之间所有的对话,包含通讯内容、日期、时间、浏览器的请求、服务器的响应内容等等。脚本和Recording Log最大的差别在于,脚本只记录了client端要对server端所说的话,而Recording Log则是完整纪录二者的对话。

    当执行脚本时,您可以把VuGen想象成是一个演员,它伪装成浏览器,然后根据脚本,把当初真的浏览器所说过的话,再对网站伺服器重新说一遍,VuGen企图骗过服务器,让服务器以为它就是当初的浏览器,然后把网站内容传送给VuGen。
    所以纪录在脚本中要跟服务器所说的话,完全与当初录制时所说的一样,是写死的(hard-coded)。这样的作法在遇到有些比较聪明的服务器时,还是会失效。这时就需要透过「关联(correlation)」的做法来让VuGen可以再次成功地骗过服务器。
    何谓关联(correlation)?
    所谓的关联(correlation)就是把脚本中某些写死的(hard-coded)数据,转变成是撷取自服务器所送的、动态的、每次都不一样的数据。
    举一个常见的例子,刚刚提到有些比较聪明的服务器,这些服务器在每个浏览器第一次跟它要数据时,都会在数据中夹带一个唯一的辨识码,接下来就会利用这个辨识码来辨识跟它要数据的是不是同一个浏览器。一般称这个辨识码为Session ID。对于每个新的交易,服务器都会产生新的Session ID给浏览器。这也就是为什么执行脚本会失败的原因,因为VuGen还是用旧的Session ID向服务器要数据,服务器会发现这个Session ID是失效的或是它根本不认识这个Session ID,当然就不会传送正确的网页数据给VuGen了。
    下面的图示说明了这样的情形:
    当录制脚本时,浏览器送出网页A的请求,服务器将网页A的内容传送给浏览器,并且夹带了一个ID=123的数据,当浏览器再送出网页B的情求时,这时就要用到ID=123的数据,服务器才会认为这是合法的请求,并且把网页B的内容送回给浏览器。
    在执行脚本时会发生什么状况?浏览器再送出网页B的请求时,用的还是当初录制的ID=123的数据,而不是用服务器新给的ID=456,整个脚本的执行就会失败。

    要对付这种服务器,我们必须想办法找出这个Session ID到底是什么、位于何处,然后把它撷取下来,放到某个参数中,并且取代掉脚本中有用到Session ID的部份,这样就可以成功骗过服务器,正确地完成整个交易了。
    哪些错误代表着我应该做关联(correlation)?
    假如脚本需要关联(correlation),在还没做之前是不会执行通过的,也就是说会有错误讯息发生。不过,很不幸地,并没有任何特定的错误讯息是和关联(correlation)有关系的。会出现什么错误讯息,与系统实做的错误处理机制有关。错误讯息有可能会提醒您要重新登入,但是也有可能直接就显示 HTTP 404的错误讯息。
    要如何做关联(correlation)?
    关联(correlation)函数
    关联(correlation)会用到下列的函数:

  • LoadRunner关联应用实例

    zhaoyabin123456 发布于 2009-08-18 14:56:44

    脚本内容:录制web登录邮箱,发送一封带有附件的邮件。
            由于每次执行的时候服务器的返回值,这个返回值—附件变量"AttachFiles"每次返回都是不一样的,所以需要将这个变量"AttachFiles"进行关联操作!
            关联的方法大体上可以分为手工关联和自动关联。这两种方法各有所长,手工的比较保险,但是需要自己去找关联函数的位置和需要关联的参数,然后一一替代,自动关联就比较简单了,找到关联参数的特征,运行的时候自动关联就是了,但有时候自动关联不是很完整,可能有的参数找不全!在实际使用过程中需要注意。此处。录的脚本比较简单,需要关联的参数只有一个,所以,自动关联还是比较可靠的!
            自动关联方式也有两种:变量名关联和变量值关联!
            录制到关联的过程:
            一般情况下都是先录制两份相同的脚本,这里的相同是指录制时执行的业务流程,然后用工具比较两个脚本中变化的变量,可用Altraedit,loadrunner自身也有一个比较的工具,但是感觉这个用起来比较快!
            找到要进行关联的变量就可以关联了,下面是采用的几种关联方法:
            变量名关联:前提条件,已经知道整个脚本中需要关联的变量名是:"AttachFiles".那么,需要:RecordOptionàCorrelation,新建一个"aaa"的关联名,规则为:
    Action:parameterizeform
    filed value;Field name:AttachFiles;Parameter
    Prefix:AttachFiles;
            然后重新录制该脚本,录制的过程中,自然会有关联的提示,只需OK就可以了!
            变量值联:前提条件是已经知道整个脚本中需要关联的变量名是"AttachFiles"。选择RecordOptionàCorrelation,新建一个"bbb"的关联名,规则为:
    Action: Search for parameters in all of the body text   Left bounday:
            还有一点就是,这个左右边界值,一定要是服务器的返回值(response from server),而不是用户发出的请求值(userrequest),这个值可以在recording log里找,然后重新录制该脚本,录制的过程中,自然会有关联的提示,只需OK就可以了!
            手工关联:在脚本中输入函数:web_reg_save_param("ATT",
                        "LB="input type="hidden" name="AttachFiles" value=",
                        "RB=>",
                         LAST,);
            手工关联的关键在于这个函数位置怎么放,脚本的内容多了,不容易找到放此函数的位置。可以录完脚本后,再执行一遍,点击:viewàscancorrelation,loadrunner会自动找一些他觉得需要关联的值参数,并且显示在correlation- result里,我们再选取需要的参数,点击右边的”correlation“,然后这个函数就会自动加到他应该出现的位置,然后我们就可以"借用"它的劳动成果,自己手动添加函数啦!
            接着就是在脚本中寻找使用该变量出现的位置,执行替换,value={ATT},这个脚本中共需要两次替换即可!
            手工关联后,就不需要再重新录制脚本了!

  • LoadRunner脚本录制

    zhaoyabin123456 发布于 2009-08-18 15:02:02

    有不少网友在了解软件测试时,最初都知道测试按照方法可以分为手工测试和自动化测试,手工测试比较容易理解,就是按照测试用例的步骤严格执行就可以了,其中的技巧在于测试用例的设计。而自动化测试则是在被测系统的回归测试以及企业建立自动化测试框架中大量使用。而自动化测试中又以功能自动化和性能自动化为主,本期专题主要研究的是性能自动化测试工具LoadRunner的脚本的基础知识以及如何录制LoadRunner测试脚本和测试脚本中调试方法

     

    {专题内容列表}

     

    1、什么是脚本以及什么是LoadRunner脚本

    2、LoadRunner脚本录制方法

    3、LoadRunner脚本录制技巧

     

    1、 什么是脚本以及什么是LoadRunner脚本

    http://www.51testing.com/?uid-76700-action-viewspace-itemid-8801

     
    编者语:通过这个帖子可以让初学者明白什么叫做脚本以及什么是LR测试脚本,能够清楚的了解性能测试脚本和手工测试的不同之处

     

    2、 LoadRunner脚本录制方法

    LR的基础操作之脚本录制之—基础脚本录制、LR脚本的录制以及完善

     http://bbs.51testing.com/thread-109272-1-1.html
     

    编者语:通过LR脚本录制方法能够看出常见的脚本录制的流程和如何进行LR脚本的完善,希望通过这二个例子可以让广大网友明白LR脚本的录制方法以及协议的选择。

     

    3、 LoadRunner脚本录制技巧

     

    HTTP/HTML脚本中过滤不需要的请求

     

    LoadRunner脚本录制技巧放送


    http://hi.baidu.com/lidhcn/blog/item/bad75efcd546e6f8fd037f36.html

    http://hi.baidu.com/lidhcn/blog/item/af6ab8dd675d59dc8c102938.html


    编者语:录制脚本要有一定的技巧,这部门内容演示了如何在init,action,end进行脚本录制技巧自定义以及如何过滤无效请求

     

    4、 LoadRunner脚本举例

    LR自带订票系统经典脚本

     

    LR经典脚本

     

    LR利用foxmail发送邮件部分的脚本代码

     

    LR视频录制案例

     

    LR利用foxmail发送邮件部分

     

    LR录制WAP

     

     

    编者语:上面的脚本有文本演示也有视频演示,希望大家的水平能够得到进阶和提高。

     

    希望大家多多提出自己的意见,本期专题内容后续仍会不断更新,大家如果发现哪个帖子比较好的话可以发邮件或消息给斑竹,斑竹会及时更新相应专题列表,这样大家才能共同进步,测试时代才能做的更好!

  • LoadRunner脚本录制技巧

    zhaoyabin123456 发布于 2009-08-18 15:04:57

    下面文章说明如何在LR里面过滤多余请求,希望对大家有帮助

    http://bbs.ltesting.net/viewthread.php?tid=16634&highlight=LR%2B%BD%C5%B1%BE

     

    LR录制技巧放送

    http://bbs.ltesting.net/viewthread.php?tid=41068&extra=page%3D1&frombbs=1

    LoadRunner脚本录制方法

    发布: 2008-8-19 18:29 | 作者: snooker | 来源: 本站原创 | 查看: 241次 | 进入软件测试论坛讨论
    领测软件测试网

    这篇文章性能测试工具LR进行简单介绍,LR的安装和如何录制简单的脚本并对录制好的脚本进行加压等内容,主要目的是让大家对LR有一个基本的了解,同时也掌握录制一个简单脚本的方法。
    在学习过程中的问题可以在此帖中发帖询问,心得也可在此帖中跟帖进行交流,共同进步。如果有更好的资料希望可以贴到帖子中,共同分享。

    http://bbs.ltesting.net/viewthread.php?tid=16644&highlight=LR%2B%BD%C5%B1%B

    http://bbs.ltesting.net/viewthread.php?tid=19676&highlight=LR%2B%BD%C5%B1%BE

     

  • LR脚本的调试

    zhaoyabin123456 发布于 2009-08-18 11:16:16

    沉浮于LR很多天了,以前一直在WR分论坛漂。看到大家提出很多问题,不过发现大家的脚本大都已录制为主,而且经常有提出录制的脚本回放有问题,其实很多问题很好解决,LR提供了很多手段调试和优化我们的脚本。
    1.设置断点
    相信大家都不陌生,LR也是可以设置断点的,在需要设置断点的语句前按F9快
    捷键,断点就设置好了,程序运行到断点语句后会暂停,这时我们可以用F10单步
    调试程序.
    2.打开EXtended Log
    只是设置断点是不够的,我们还得知道具体发生了什么事情,Log告诉了我们一切,默认的Log是 standard Log,这时远远不够的.我们要extended log,打开路径
    为runtime settings-->log-->extended log.把parameter substitution和data returned by server和advanced trace大家根据需要勾选吧.
    3.注释掉多余的语句
    很多回放时出错的脚本都是因为多余的语句.因为LR在录制的时候,LR生成的语
    句很多不是我们想要的,这里结合几个网友的问题说说,曾有网友问:回放脚本的时
    候socket出错,提示: Error : socket0 - Address already in use. Error code
    : 10048.而且非常坚持说脚本不会有问题,因为脚本直接录制后回放,什么都没改,
    是不会出错的.拿到脚本一看,有一条语句lrs_create_socket,建立了socket0,但
    是之后没有任何socket0的语句,可以判断出 该语句是无效的,注释掉,问题解
    决。所以大家不要过分相信LR了 ,它生成的语句也是有很多BUG的。

    经常有朋友们问到,log文件在哪看,特别是controll执行后,怎么看log。这里一一说明一下:
    1)在vgen中,我们必须写输出函数输出信息,将我们所想要了解的信息用函数输出,主要有这么几个函数输出信息: lr_output_message,lr_error_message,lr_log_message。这些函数请参阅help-->function reference.
    其次,我们要在runtime settings中设置,勾选always send messages,具体的做法是:runtime settings--->log-->always send messages,这样我们才能写出Log,在我们的脚本所在的文件夹中,有两个文件很重要, mdrv.log.txtoutput.txt文件,lr_log_message只会把信息输到mdrv.log文件中,而lr_output_message则会写进以上两个文件。
    2)在controller中,很多朋友都会想知道多次迭代,参数是否正确的导入了呢,我们依旧查看log,我们在执行结束后,查看结果目录的Log文件夹,如果是负载生成器运行的话,则在tmp目录。 不过,还想提醒朋友们,在controller 我们也要设置runtime settings才行,而且每个用户组的runtime settings,设置的方法是:在controllerdesign标签页中,右下角的部分有runtime settings按钮,我们点击它,设置的方法与在vgen中一样的

  • 如何把已有的日期转换成特定的格式

    walker1020 发布于 2008-03-24 21:55:25

    Function MyCdate(oDate)

            currentLocale = GetLocale

            original = SetLocale("en-ca")

            mon=left(cstr(FormatDateTime(oDate,1)),3)

            original = SetLocale(currentLocale)

            MyCdate=cstr(day(odate))+"-"+mon+"-"+cstr(year(odate))

    End Function

    点评:

    此方法把原来的日期转换成成了dd-mm-yyyy 的格式。根据需要,你也可以转化成其它任何你需要的格式。此方法简单有效,非常值得学习。值得一提的是,原作者解决问题的思路和方法也值得学习。下面是作者的思路:

    前几天的时候,用QTP别一个AX日期控件对象的时候,不知道是对象的关系还是QTP的关系,不可以用SET方法,只可以用SETdate来设置,而且格式只有d-M-yyyy,如"7-Mar-2007",而日期只有2007-3-7  yyyy-m-d。先是有FormatDateTime,cdate(vbs没format)来转换,我用的是简体中文系统,所以无果。看来只好自己做,如果自己做的话就要拼字符串,日-短英月-长年,日和年可以用day和year取出来。

    月的话就要写select来做吗? 我发现短英月就是英文月份的前3个字符,这样的话,我就只要取出一个英文月份名就可以了。如何取出英文月份名呢?我想了,日期格式是和区域设置有关。幸好vbs中有GetLocale和SetLocale,我就方便了。这样我先设置美国英文"en-gb",得到"07 March 2007"(dd MM yyyy)。看来月份是有了。不过这个在中间,不太方便。我就是试了试别的英语国家。终于在加拿大"en-ca"中有了"March 07, 2007" ,这样我就只要取左3个字符了。

     From http://bbs.51testing.com/viewthread.php?tid=108937       http://www.114study.com/d0710190929060806

  • [论坛] Cannot identify the object 的解决方法

    walker1020 发布于 2009-03-29 13:50:20

    经常有人问,回放脚本的时候出现了Cannot identify the object 的错误。如何解决?
    Cannot identify the object是回放脚本时最常见的错误,解决的方法有:
         1,  增加Wait语句 或Sync 试试看看;
         2,  到对象库里面看看录制时对象的属性和回放时的属性是否不同。哪怕是对象的一个属性值发生了变化,最后都可能出现Cannot identify the object的错误;
         3, 如果还不行,你可以把这段代码删除,重新录制一下。这样也能解决问题。
         4,多回放几次试试看,说不定是因为网络的原因引起的。
       
    这是我常用的解决方法。不知道别的朋友还有什么好的方法,也说出来讨论一下,这样大家的能力都能得到提高。
  • [论坛] 如何使用WebTable 的ChildItem

    walker1020 发布于 2009-06-19 12:01:18

    不知道朋友们在使用WebTable 的ChildItem时遇到过麻烦?我是有过,曾经有一段使用拒绝使用ChildItem函数(当然是怕出错了),然后使用别的方法来代替。今天帮同事解决一个脚本的通用性时,终于把此问题解决了。
        根据WebElement 处在WebTable 的行数Row和列数Column,可以使用GetCellData(Row, Column)可以得到需要的数据,可是使用ChildItem (Row, Column, “WebElement”, 0)时就得不到需要的Object呢?
        例如下面的代码
              Set bj = Browser("***").Page("***").Frame("Frame").WebTable("***").ChildItem(4,2,"WebElement",0)
            Print obj.GetROProperty ("outerhtml")
        可是却得不到我们需要的outerhtml的值。如果改变了Row和Column的值,我们经常又会得到一个错误 Object required, 这说明obj 没有返回值。
    后来查阅QTP Help,发现WebTable有一个ChildItemCount 方法,于是我使用ChildItemCount (Row, Column, “WebElement”) 得到在的行数Row和列数Column上有多少个WebElement。 然后使用下面的代码验证,如果使用ChildItem (Row, Column, MicClass, Index), 我们需要操作的Object的Index的值到底是多少:
    For inter = 0 To Browser("***").Page("***").Frame("Frame").WebTable("***").ChildItemCount (Row, Column, “WebElement”) - 1
    Set bj = Browser("***").Page("***").Frame("Frame").WebTable("***").ChildItem(4,2,"WebElement", inter)
            Print obj.GetROProperty ("outerhtml")
    Next
        当然,对于ChildItem函数里面的Row和 Column的值,一般情况下,使用GetCellData(Row, Column)里面的Row和 Column就可以得到。

        这样我们就可以通过ChildItem 得到WebTable里面所有的Object,不需要添加大量的Object,脚本的通用性自然就增强了。

    [ 本帖最后由 walker1020 于 2009-6-18 18:11 编辑 ]
  • 做软件测试三、四年的给新手的建议

    starzuo 发布于 2009-08-13 11:05:54

    做软件测试三、四年的给新手的建议

    做软件测试三,四年了,确实正应了那句“测试不如开发”,只是个人观点,而且我工作过都是外企和大型国有企业,软件测试流程和管理都相对很规范化的。
    下面几点给做测试的朋友参考一下:
    1、钱肯定少过开发人员,除非你工作七,八年才能拿年薪10W以上,一般的软件测试工程师很难上6K以上,开发人员工作四,五年后拿7,8K是太多数的。

    2、加班的现象可以说是很普遍,周一到周五随时加班是很正常的,周末肯定有一天要加班。
    3、不管怎么样努力和用什么测试效果的数据说明,领导还是不太重视测试部,领导认为我们测试的没有什么技术含量。但是我们已经在流程上改进很大,使用测试管理工具和自动化测试工具来提高测试生产力等等,这些努力的结果好象只有我们的老大才得分比较高,我们下面的小兵就只有吃苦的份。
    4、团队合作精神比较差,都是做技术的人的通病,以为你在一间公司呆久了,就很牛B一样,说话口气难于接受,好象现在公司就是他的一样。这个问题在几间公司里面的测试队伍中得到证实。在工作之余,很少团队一起聚餐或是出外游玩的机会,好象大家就知道上班---吃中午饭--上班--吃晚饭---加班---下班回家---睡觉的简单模式。
    5、人际关系和沟通技能都很重要,这一点不用我多说,大家都知道的。
    6、还有一点要提醒测试人员的是:做测试容易懒惰,因为重复性的工作比较多,然后在公司呆着好好的,什么都不想学和提高了,这样容易使你在软件的测试面比较狭窄了,其实你到其他的公司面试的时候,才发现自己很多不知道,不懂的。
    7、我们做测试几年了,都不想老是停留在执行测试,写测试用例,设计测试计划,写测试脚本,评审开发/测试文档上,写缺陷报告,写测试报告,管理和维护测试工具。但是上面的几点工作后,我们软件测试人员还能做些什么?

    怎么样提高软件测试员自身素质培养?
    (1) 首先,应对软件测试感兴趣和对自己有自信,如果具备了这两点,那么在开发过程中不管遇到什么样的困难,我相信你一定能克服。
    (2) 善于怀疑,世界上没有绝对正确的,总有错误的地方,具有叛逆心理,别人认为不可能发生的事,我却认为可能发生。别人认为是对的,我却认为不是对的。
    (3) 打破砂锅问到底的精神,对于只出现过一次的bug,一定找出原因,不解决誓不罢休。
    (4) 保持一个良好的心情,否则可能无法把测试作好。不要把生活中的不愉快的情绪带到工作中来
    (5) 做测试时要细心,不是所有的bug都能很容易的找出,一定要细心才能找出这些bug。
    (6) 灵活一些,聪明一点,多制造一些容易产生bug的例子。
    (7) 在有条件的情况下,多和客户沟通,他们身上有你所需要的。
    (8) 设身处地为客户着想,从他们的角度去测试系统。
    (9) 不要让程序员,以“这种情况不可能发生”这句话说服你,相反,你应该去说服他,告诉他在客户心里,并不是这样的。
    (10) 考虑问题要全面,结合客户的需求、业务的流程、和系统的构架,等多方面考虑问题。
    (11) 提出问题不要复杂化,这一点和前面的有点矛盾,如果你是一新手,暂时不要管这一点,因为最终将有你的小组成员讨论解决。
    (12) 追求完美,对于新测试员来说,努力的追求完美,这对你很好,尽管有些事无法做到,但你应该去尝试。
    (13) 幽默感,能和开发小组很好的沟通是关键,试着给你的开发小组找一个“BUG杀手”,或对他们说“我简直不敢相信,你写的程序居然到现在没有找到BUG”。
    (14) 到此是不是对测试很有兴趣呢?不过我要告诉你,测试过程中有酸甜苦辣,其中的滋味只有你知道,也许你会感到枯燥,要学会放松自己,去溜冰或做你喜欢做的事,不过,别放弃,因为你的自信告诉过你“你会是很优秀的测试员”不是吗?

    我们常见软件测试的技巧 :
    软件测试虽然辛苦,但是掌握了一定的技巧之后将使你事半功倍。
    (1) 边界测试,测试用户输入框中的数值的最大数和最小数,以及为空时的情况。
    (2) 非法测试,例如在输入数字的地方输入字母。
    (3) 跟踪测试,跟踪一条数据的流程,保证数据的正确性。
    (4) 在开始测试时应保证数据的正确性,然后在从系统中找出各种BUG。
    (5) 接口测试,程序往往在接口的地方很容易发生错误,要在此模块测试勿掉以轻心。
    (6) 代码重用测试,在开发过程中有些模块功能几乎相同,程序员在重用代码时可能忘记在原有代码上修改或修改不全面,而造成的错误。
    (7) 突发事件测试,服务器上可能发生意外情况的测试。
    (8) 外界环境测试,有些系统在开发时依赖于另外一个系统,当另外一个系统发生错误时, 这个系统所受到的影响的情况。
    (9) 在程序员刚修复Bug之后的地方,再找一找,往往程序员只修复报告出来的缺陷而不去考虑别的功能在修改时可能会重新造成错误。
    (10) 认真做好测试记录在做完一天的测试记录之后,第二天再根据第一天的测试记录重复测试你会发现有未修正的错误。
    (11) 文字测试,如果在系统中有用词不当的地方,我想这是不应该的。
    (12) 系统兼容测试,例如有些程序在IE6能运行正常,到IE5下不能运行。有些程序在WIN2000下能运行,而到WIN98却不能运行。像一些很特别的用户去使用系统,你很有可能发现BUG。
    (13) 用户的易用性测试,往往用户的需求是不断的变化的,而其中的一部份变化的原因,是有用户操作上不方便引起的。
    软件测试是软件开发中的重中之重,没有一点可以马虎的,在项目管理过程,我强调的时是每个过程的每一个环节都要进行测试,保证系统在每个阶段可以控制。因为软件测试中考虑的问题基本上是项目管理中考虑的问题。
    我认为在项目管理中考虑的一些问题应该是在软件测试时有些体现,体现的内容是软件测试的一些侧重点,具体说,软件测试是事务性的,而项目管理是策略性,一些策略性的东西必须在一些事务性的事务上来实现。
    针对这个经验,看过的朋友都会产生相同或者不同的看法,不妨与大家共享一下!

  • 自动化测试中如何利用WMI(转)

    shuishixingyu 发布于 2009-08-10 20:56:29

    WMI即Windows 管理规范,是用户管理本地和远程计算机的一种模型。通过它可以访问、配置、管理和监视几乎所有的 Windows 资源。WMI的语法十分简单,基本上常见的命名空间、对象等用几乎一模一样。它对应的是Windows里的WMI服务(winmgmt)

    WMI实际是由两部分组成:CIM库和WMI脚本对象库。在具体使用过程中,我们是通过WMI脚本对象库去访问CIM库,管理托管的资源。也就是说,在我们编写脚本的过程大致可以分为这么几步:

    1)创建WMI对象脚本库的指针实例;

    2)调用其实例的方法,连接到CIM库,并指明需要访问的资源的逻辑位置;

    )获得托管资源也就是类的实例的集合;

    4)枚举实例,完成工作

    WMI的命名空间共有16个,不过我们常用的只有两个:

    1)root\cimv2  在这个命名空间里包括了绝大多数与计算机、操作系统相关联的类。

    2)root\default  管理注册表的类

    给出两个实例参考:

    日志报告中记录测试机器的地址:

    Public Function GetIP()
     '获取测试机器的IP
      ComputerName="."
      Dim objWMIService,colItems,objItem,objAddress
      Set ōbjWMIService = GetObject("winmgmts:\\" & ComputerName & "\root\cimv2")
      Set colItems = objWMIService.ExecQuery("Select * From Win32_NetworkAdapterConfiguration Where IPEnabled = True")
      For Each objItem in colItems
         For Each objAddress in objItem.IPAddress
             If objAddress <> "" Then
               GetIP = objAddress
               Exit Function
             End If
         Next
      Next
    End Function

    如何在判断进程是否存在

    Function ProcessExist(processName)
      For each Process in GetObject("winmgmts:{impersonationLevel=impersonate}").InstancesOf("Win32_process")
       If Process.Name = processName Then
         ProcessExist = True
         Exit Function 
       End If
     Next
     ProcessExist = False
    End Function

  • Linux与windows远端桌面连接

    系统消息 发布于 2009-08-10 17:18:44

    Linux与windows远端桌面连接 - [软件与系统]

    本文档主要包括四个部分:
    (1) 在Windows XP下登陆远端Ubuntu桌面
    (2) 在Ubuntu下登陆远端Ubuntu桌面
    (3) 在Windows XP下登陆远端 Windows XP桌面
    (4) 在Ubuntu下登陆远端Windows桌面
        各种情况我都在子网里都测试成功过。
     
    一.  在WindowsXP下登陆远端Ubuntu桌面
    在WindowsXP下登陆远端Ubuntu桌面,最简单的方法是使用xdmcp服务。
    1. Ubuntu系统修改下面几个地方来允许xdmcp:
    kissgnu@kissgnu-desktop:~$ sudo vi /etc/gdm/gdm.conf
    [daemon]
    # RemoteGreeter=/usr/lib/gdm/gdmlogin  将前面的#去掉
    [security]
    DisallowTCP=true  改称false
         [xdmcp]
    Enable=false  改成true
       然后重新启动机器。
    2. Windows XP连接到Linux:
        XManager是一个简单易用的高性能的运行在Windows平台上的X Server软件。下载安装后,同网段打开Xmanager-broadcast,跨网段在Xbrowser 中输入IP 即可。
       (测试:在windows下连接本机器上的虚拟机ubuntu系统,连接windows同一子网的另一个系统)
     
    二. 在Ubuntu下登陆远端Ubuntu桌面
    1. 远端服务器端Linux系统如上设置允许xdmcp.
    2. 客户端Ubuntu下直接用X命令连接到服务器桌面。
    kissgnu@kissgnu-desktop:~$ sudo X :1 -query 192.168.1.102   
    (ctrl+backspace退出远端桌面)
     
    三. 在Windows XP下登陆远端 Windows XP桌面
    1. 远端Windows XP作为服务器,首先必须在控制面板->帐户设置里设置登录帐户密码,然后桌面上我的电脑右键->属性->远程, 选中“允许用户远程连接到此计算机”。
    (Home版windows XP没有这个选项,本方法不适用, 这个问题后面再说)。
    2. 客户端Windows XP系统, 开始->附件->通讯->远程桌面连接,输入远端XP 地址IP,然后输入登录帐户和密码。
    (不过只能使用一个桌面,客户端连接后,远端桌面会强迫断开)
     
    四. 在Ubuntu下登陆远端WindowsXP桌面
     
       1. 远端Windows XP系统设置与上面三相同,即设置“允许用户远程连接到此计算机”。
       2. 客户端Linux下使用rdesktop命令连接到远端xp桌面(默认Ubuntu已经安装了rdesktop工具):
    kissgnu@kissgnu-desktop:~$ rdesktop -uxxx  -a 24 -f 192.168.1.2
    其中xxx是远端windows的登录帐号,-a 24表示24位色彩,-f选项表示让远端xp桌面Fullscreen. (如果不用-f选项全屏,也可以用-g 80% 来让远端桌面窗口缩放成80%)
    如果要断开连接,系统菜单开始->断开。
     
    五. 远端连接到Home Edition Windows XP桌面
     
    Home版XP没有“允许用户远程连接到此计算机”这个选项,所以上面的三和四的方法不适用。要决绝这个问题,需要借助于第三方软件WinVNC 。WinVNC是VNC桌面远程连接的Windows版本。这个方法也可以代替上面的三和四。
    (1) Windows XP to (Home Edition)Windows XP
    在服务器Windows Home XP和客户端Windows XP下分别安装winVNC。安装后发现其包括两个程序vncViewer和vncServer。服务器端设置vncServer,客户端使用vncviewer的程序来连到vncServer即服务器桌面上。 
    (2)Ubuntu to (Home Edition)Windows XP
    首先Windows XP服务器端同上面(1)一样设置好VncServer,然后在Linux下载安装客户端VNCViewer:
    kissgnu@kissgnu-desktop:~$ sudo apt-get install vncviewer
    然后,
    kissgnu@kissgnu-desktop:~$ vncviewer xxx.xxx.xxx.xxx
    (可以使用 –fullscreen选项全屏显示远端窗口,如果要退出远端窗口,按键F8然后选择Quit Viewer)
     
    使用WinVNC的好处是,可以允许多个Windows远端桌面存在,而不像用XP自带的“允许用户远程连接到此计算机”那样,一有用户登录到远端windows桌面,远端桌面立即断开。
  • liunx下安装JDK和Eclipse

    系统消息 发布于 2009-08-10 17:21:29

    安装JDK1.6

    下载jdk-6u3-linux-i586-rpm.bin

    chmod 755 jdk-6u3-linux-i586-rpm.bin //授权 按空格键往下
     ./jdk-6u3-linux-i586-rpm.bin             //安装 (yes)
     rpm -ivh jdk-6u3-linux-i586.rpm      //安装rpm      
       
     在vi /etc/profile 末尾加入
     
    JAVA_HOME=/JAVA/
    PATH=$JAVA_HOME/bin:$PATH
    CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME%/lib/dt.jar
    export JAVA_HOME,PATH,CLASSPATH

    按ESC后输入
    :wq保存退出
     
    vi /home/username/.bashrc 末尾加入

    set JAVA_HOME=/java/
    export JAVA_HOME
    set PATH=$JAVA_HOME/bin:$PATH
    export PATH
    set CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
    export CLASSPATH
     
    按ESC后输入
    :wq保存退出

    java -version  //试一下是不是可以看到Java(TM) SE Runtime Environnert 

     export设置全局变量大小写严格区分
     冒号":"分隔符
     "$"引用原来环境变量
     username 是你的用户名
     jdk1.6.0.03 安装完后的目录在 /usr/jdk1.6.0.03
      
     

    安装eclipse 

    下载eclipse-java-europa-fall2-linux-gtk.tar.gz

    gunzip  eclipse-java-europa-fall2-linux-gtk.tar.gz   //解压

    tar -xvf eclipse-java-europa-fall2-linux-gtk.tar         //执行压缩包 yes

    这时候就可以看到eclipse啦。
    在到桌面建一个快捷方式
    如:右击桌面====》新建启动器====》命令====》浏览路径设置到你解压下的文件里,/java/eclipse/eclipse
    安装完后再像windows一样配置一下eclipse的Jar路径指向/usr/jdk1.6.0.03

    编一个小程序试试,另一个世界感觉不错吧,就在这里OK啦! 

  • 作为测试人员应该掌握哪些技术?

    deanaa 发布于 2009-08-08 18:23:09

    从测试工程师的职业发展来看这个问题。一般来讲,测试工程师的发展方向无外乎以下几个方面,而每个方向的要求是不一样的,谈论测试人员的技术要求,我们也需要根据个人的职业规划和公司的发展来看这个问题。
    1,技术类。这个方向对于技术的要求是最高的。从一个测试工程师到一个测试技术专家,一般来讲,我们要求精通测试理论知识,精通一到两种自动化测试工具和 测试技术,精通一到两种测试类型与工具(性能测试,压力测试,安全性测试等);熟练掌握两到三种编程语言,熟练掌握windows和Linux,Unix 的系统管理,熟练掌握数据库的性能监控与调优,熟练掌握网络监控与管理知识;熟悉系统架构,质量管理,流程管理和控制,配置管理,软件开发,项目管理的知 识,熟悉公司的技术和产品发展策略;了解行业相关知识,了解公司的发展战略。
    2,管理类。这个方向对于技术的要求相对较低,但是对于管理相关的技术和非技术能力的要求较高。我们对于从事测试管理的组长到测试经理,一般都有以下的一 些要求。精通测试理论知识,项目管理知识;熟练掌握质量管理,流程管理和控制,配置管理的知识,熟练掌握各种测试类型,非常熟悉公司的产品发展策略;了解 测试工具和测试技术,了解行业知识,了解公司的发展策略。
    3,业务类。这个方向对于行业相关的技术和知识要求很高,而对于基本的测试理论和测试技术的要求较低。一般来讲,要求精通行业知识,即产品本身的知识,以 及产品相关的知识;非常了解甚至能够参与到公司产品策略的制定;了解测试理论和测试技术,了解公司的技术发展战略和整体发展战略。
    以上是测试人员比较常见的三个职业发展方向,每一个测试人员都应该有自己明确的发展目标,并和公司达成一致。从上面的三个发展方向大家可以看到,不同的发 展方向对技术和能力的要求是不一样的,只有清楚了自己的发展方向,才能有的放矢的在日常的工作中积累。另一方面,对于测试人员的要求不仅仅在于技术上,更 需要在沟通能力,领导能力等上下功夫,这样才能获得更好的职业发展!
  • 在中小型企业从事软件测试,如何提高薪资?

    deanaa 发布于 2009-08-08 18:23:51

    从国内的大环境来讲,测试的薪资水平现在的确处于整个行业较低的一个位置。这是一个不争的事实。特别是在一些中小型企业中,由于本身项目或产品的规模和质 量要求比较低,对于测试的需求并不是那么迫切。这个一方面是国内软件企业不成熟的一个标志,另一方面也部分反应出了大部分公司测试部门本身的较低的能力和 水平。所以如果在职业生涯的开始阶段,从薪资发展的角度考虑,测试本就不处于行业薪资水平的高端,在这个大环境下如果把薪资放在职业发展的一个很重要位置 的新人,建议还是不要选择测试这个行业。
    当然说完了大环境我们还是会看到即使同样规模性质的IT企业,甚至同一个企业中,测试的薪资待遇也是有很大的差别的。这种差别我觉得主要来自于个人能力,企业认知以及机遇。
    个人能力是薪资水平高低的决定性因素。但是需要大家注意的是,这个能力绝不是简单的技术能力或者其他某个方面的能力,而是一个综合素质和能力的体现。在之 前某期每周一问中,我曾经从技术角度给出了一个测试行业的职业发展规划,这里我就不重复了。这里再简单谈谈其他可能对薪资产生影响的方面。首先是沟通、领 导、计划能力。从我的经验看,测试和开发的沟通和交互是测试过程的一个重要组成部分,是否能和开发进行高效的沟通,很大程度上决定了测试者自己的绩效;如 果你能够在项目中或者测试过程中展现出自己突出的领导和计划能力,那么你就有机会走向管理岗位,而这恰恰就是你提高薪资的最直接的途径。其次是你的学习能 力,如果你有更好的学习能力,就意味着你有更多的机会在技术层面成为公司和项目的领导者,这同样也意味着你积累下了加薪的资本。再次是你的协作能力和细 心,协作能力决定了你是否是一个合格的团队成员,而细心的程度也部分决定了你的工作成绩,这两者是你加薪幅度高于一般水平的重要保证。
    如果说个人能力是决定性的内因,那么公司对于测试的认知则是决定性的外因了。对于公司的选择,我觉得主要从三个方面来考虑。一个是个人的发展,你要看到今 天,更要想到看到明天,后天,所以选择一个更好的发展方向可能是最明智的。第二是看公司的氛围,这个可以通过面试的互动来了解,比如你可以关心一下测试在 公司的地位,在项目中发挥的作用等等。一个重视测试的公司,一个测试部门发挥重要作用的公司,测试的薪资也不会太低的。最后是看老板,看测试部门的老板, 看你自己的直属老板。他们一般都会参与到面试的过程中来,一个好的老板,一方面能对你的发展起到重要的推动和指导作用,另一方面也知道如何为自己下属争取 更好的利益。
    最后谈的是机会。机会处处都是,就看你是不是有准备的人啦。对于测试来讲,跨国外企或者国内大型软件公司在薪资上是有很大优势的,而且对于个人职业发展也 更好,所以如果有机会就要尽力把握住。如果你有机会进入明天的google百度阿里巴巴腾讯们,不要放过机会,当你作为元老分到一份不菲的股份的时候,薪 资其实就不那么重要了。当然即使不跳槽,身边也有机会,当部门里需要引入新的测试技术,当新的项目过来的时候,这些都是机会,当你成为公司重要甚至不可或 缺的人的时候,你的薪资自然也就有了保障。
    最后我想说的是,不要去盲目羡慕或者鄙视那些拿着高薪的人们,因为只要你愿意,你也可以和他们一样。
  • 转:大量英文原版电子书下载的好地方

    tomtang 发布于 2009-05-06 16:42:50

  • Mount命令使用

    tomtang 发布于 2009-02-18 12:51:21

    Mount命令简介

    格式:mount -t 文件格式 -o 选项参数 磁盘分区 挂载点目录名

    加载NTFS文件系统分区

    mkdir /mnt/ntfs

    mount -t ntfs -o nls=utf8,umask=000 /dev/hda1 /mnt/ntfs

    或: mount -t ntfs -0 iocharset=utf8,umask=000 /dev/hda1 /mnt/ntfs

    补充:

    1)把ntfs换成对应的文件系统分区,就能加载指定的文件系统分区。例如:vfat==FAT32, fat==FAT16, iso9600==CD-ROM

    2)开机自动mount文件系统分区

    在/etc/fstab文件中加入如下的命令:/dev/hda1 /mnt/ntfs ntfs umask=000,iocharset=utf8

    例如:

    # /etc/fstab: static file system information.
    #
    # <file system> <mount point>   <type>  <options>       <dump>  <pass>
    proc            /proc           proc    defaults        0       0
    # /dev/sda2
    UUID=306e7261-43e5-4b6d-b20d-5942e8db4368 /               ext3    relatime,errors=remount-ro 0       1
    # /dev/sda5
    UUID=de1a5d56-f627-4484-af52-06cc10127aa5 none            swap    sw              0       0
    /dev/scd0       /media/cdrom0   udf,iso9660 user,noauto,exec,utf8 0       0

    /dev/hda1 /mnt/ntfs ntfs umask=000,iocharset=utf8

    3)卸载文件系统分区:umount 挂载点目录名

    4)将磁盘分区放在GNOME或者KDE桌面上。KDE环境下,桌面空白处右击找到磁盘;GNOME环境下,以用户身份登人系统,使用如下命令:ln -s /mnt/ntfs/ ~user/Desktop/ntfs



  • 安装Wicd

    tomtang 发布于 2009-02-23 16:30:44

    安装Wicd

    Ubuntu 8.10下安装
    1)添加 Wicd 源地址:deb http://apt.wicd.net hardy extras
    1)下载Key: wget -q http://apt.wicd.net/wicd.gpg
    2)添加Key:sudo apt-key add,也可以图形界面添加System--Administrator--Software Source_Authentication
    3)更新Source:sudo apt-get update   
    4)安装Wicd:sudo apt-get install wicd,也可以图形界面:新立得软件包管理器
Open Toolbar