9年资深测试,独立研发适用IOS、安卓、WEB平台的自动化软件, 使用Jenkins、shell、Maven实现项目全自动化一条龙服务。

发布新日志

  • 中级进阶--使用JS、循环、条件语句丰富SeleniumIDE的测试应用

    2012-07-30 17:32:14

    有人用SeleniumIDE来编写测试场景,然后利用Java语音来做各种条件、循环等工作。
    其实IDE配合插件用好了也很经典,尤其在IDE中使用Java_script能编写更丰富的测试用例。摆脱庞大的SeleniumServer端就从这里开始吧!

    先给大家出4个题目,下面围绕他们你将一一学会如何在SeleniumIDE中使用JS、循环、条件语句。

    1.随机给出一个小数,请将整数位与小数位相加,输出结果。
    2.随机给出一个实数,请将第一位与最后一位数字相乘,输出结果。
    3.输出一个指定正整数的阶乘。
    4.随机给出一串字符,如果有数字2,请输出所在字符串的位置。

    开始讲解之前,请大家先安装如下2个插件。
    1.Stored Variables Viewer
    2.Flow Control(https://github.com/davehunt/selenium-ide-flowcontrol)
    其中Stored Variables Viewer可以很直观的看到存储的各个变量及其值。
    Flow Control则提供了能在IDE中使用循环和条件。

    问题一:随机给出一个小数,请将整数位与小数位相加,输出结果。
    打开附件中的Selenium_test.html Selenium_test.rar(312 B ),在测试条件里输入一个小数(如123.456)
    代码{{{
    storeValue//html/body/form/inputnum
    storejavascript{storedVars['num'].split(".") [0]}left
    storejavascript{storedVars['num'].split(".") [1]}right
    storejavascript{parseInt(storedVars['left'])+parseInt(storedVars['right'])}sum
    type//html/body/form/input[2]${sum}
    }}}
    解说{{{
    第一行就是从测试条件里取出这个数存为num。
    第二行用js的split函数分割出2个数组,存储第一个数组到left。注意js中取出selenium存储的变量必须用storedVars['变量名']。split(".")是以小数点作为分隔符。
    第三行存储第二个数组到right。
    第四行将left和right相加并存为sum。这里必须使用parseInt()强制转换为int型,否则就是字符串的+了。
    第五行输出结果到返回结果。
    }}}
    效果{{{
    1.告诉大家js中如何取出selenium的变量。
    2.如何使用js的split函数
    3.如何在js中对selenium变量做加法
    }}}

    问题二:随机给出一个实数,请将第一位与最后一位数字相乘,输出结果。
    打开附件中的Selenium_test.html Selenium_test.rar(312 B ),在测试条件里输入一个小数(如321.567)
    代码{{{
    2
    storeValue//html/body/form/inputnum
    storejavascript{storedVars['num'].substr(0,1)}x
    storejavascript{storedVars['num'].substr(-1,1)}y
    storejavascript{parseInt(storedVars['x'])*parseInt(storedVars['y'])}result
    type//html/body/form/input[2]${result}
    }}}
    解说{{{
    第一行就是从测试条件里取出这个数存为num。
    第二行用js的substr函数取出字符串首字符,存储到x。
    第三行存储字符串尾字符到y。
    第四行将x和y相乘并存为result。
    第五行输出结果到返回结果。
    }}}
    效果{{{
    1.如何使用js的substr函数
    2.如何取出指定位置的字符
    }}}

    问题三:输出一个指定正整数的阶乘。
    打开附件中的Selenium_test.html Selenium_test.rar(312 B ),在测试条件里输入一个正整数(如5)
    代码{{{
    3
    storeValue//html/body/form/inputnum
    store1result
    while${num}!=0
    storejavascript{parseInt(storedVars['num'])*parseInt(storedVars['result'])}result
    storejavascript{parseInt(storedVars['result'])}result
    storejavascript{parseInt(storedVars['num'])-1}num
    endWhile
    type//html/body/form/input[2]${result}
    }}}
    解说{{{
    第一行就是从测试条件里取出这个数存为num。
    第二行将1赋值给result。
    第三行开始while循环,条件num不为0.
    第四行将num和result相乘并存为result。
    第五行将num减1.
    第六行结束循环。
    第七行输出结果到返回结果。
    }}}
    效果{{{
    1.如何使用插件的while循环
    2.如何设置条件
    }}}

    问题四:随机给出一串字符,如果有数字2,请输出所在字符串的位置。
    打开附件中的Selenium_test.html Selenium_test.rar(312 B ),在测试条件里输入一个字符串(如2abc%^234)







    下班了,明天接着写,如果不忙。
  • WindowsXP下subversion的安装和配置

    2007-12-18 16:58:08

    1.软件准备
    a)Apache2.2.6,下载地址:http://httpd.apache.org/download.cgi
    b)Subversion(俗称SVN) windows服务器端,下载的时候注意下win32下的msi安装包,别下源文件回来。下载地址:   http://subversion.tigris.org/downloads/1.4.5-win32/apache-2.2/svn-win32-1.4.5.zip
    c)TortoiseSVN(俗称“乌龟”),Windows集成客户端,下载地址:   http://downloads.sourceforge.net/tortoisesvn/TortoiseSVN-1.4.5.10425-win32-svn-1.4.5.msi?download
    d)svnservice,启动windows服务的第3方工具,下载地址:    http://www.cnblogs.com/Files/ron2k/SVNService.rar


    2.安装服务器端和客户端
    按顺序安装apache/subversion/Tortoise(一路默认选项安装即可)


    3.启动服务

    a)拷贝SVNService.exe文件到C:\Program Files\Subversion\bin

    b)运行CMD,在模拟DOS下运行如下命令:svnservice -install
    c)运行 开始->控制面板->管理工具->服务。找到SVNService服务,启动它,并将其属性修改为自动。



    4.建库

    选中本地一个目录(最好是系统盘下的),右键——乌龟SVN——Create Repository Here…建一个库


    5.配置库

    新建好的库是不能用的,需要修改配置文件。其中最重要的文件是svnserve.conf文件。
    a)进入刚才建库的目录下conf目录,打开svnserve.conf找到以下两句:
    # [general]
    # password-db = passwd
    删除每行开头的#,其中第二行是指定身份验证的文件名,即passwd文件
    b)同样打开passwd文件,找到
    # [users]
    删除行开头的#
    c)添加自己的用户名和密码
    依照# harry = harryssecret
       # sally = sallyssecret
    添加用户名和密码。密码文件[users]下面放的就是 用户名 = 密码。因为太容易被看见了,所以其实只能在自己机器上用用,局域网用都不安全。



    6.导入版本

    选中要导入的文件或者文件夹.右键–乌龟SVN–Import在URL里写”svn://localhost/[项目名(分支名)]”即可。






    7.导出版本
    在其它机器上,选中要导出的文件夹.右键–SVN Checkout在URL里写”svn://domain/[项目名(分支名)]”即可。


  • LoadRunner(1) 如何在LR脚本中做关联

    2007-10-26 16:15:50

    关联的概念

       当录制脚本时,VuGen会拦截client端(浏览器)与server端(网站服务器)之间的对话,并且通通记录下来,产生脚本。在VuGen的Recording Log中,您可以找到浏览器与服务器之间所有的对话,包含通讯内容、日期、时间、浏览器的请求、服务器的响应内容等等。脚本和Recording Log最大的差别在于,脚本只记录了client端要对server端所说的话,而Recording Log则是完整纪录二者的对话。
       当执行脚本时,您可以把VuGen想象成是一个演员,它伪装成浏览器,然后根据脚本,把当初真的浏览器所说过的话,再对网站伺服器重新说一遍,VuGen企图骗过服务器,让服务器以为它就是当初的浏览器,然后把网站内容传送给VuGen。所以纪录在脚本中要跟服务器所说的话,完全与当初录制时所说的一样,是写死的(hard-coded)。这样的作法在遇到有些比较聪明的服务器时,还是会失效。这时就需要透过「关联(correlation)」的做法来让VuGen可以再次成功地骗过服务器。
       所谓的关联(correlation)就是把脚本中某些写死的(hard-coded)数据,转变成是撷取自服务器所送的、动态的、每次都不一样的数据。
       假如脚本需要关联(correlation),在还没做之前是不会执行通过的,也就是说会有错误讯息发生。不过,很不幸地,并没有任何特定的错误讯息是和关联(correlation)有关系的。会出现什么错误讯息,与系统实做的错误处理机制有关。错误讯息有可能会提醒您要重新登入,但是也有可能直接就显示HTTP 404的错误讯息。

    关联函数

    int web_reg_save_param (const char *ParamName, <List of Attributes>, LAST);
    参数说明
    ParamName:存放动态数据的参数名称
    list of Attributes:其它属性。
    LB:动态数据的左边界字符串。此属性质是必须要有的,而且区分大小写。
    RB:动态数据的右边界字符串。此属性质是必须要有的,而且区分大小写。

    手动关联

    1。使用相同的业务流程与数据,录制二份脚本
       依照相同的操作步骤与数据录制第二份脚本并存盘。注意,所有的步骤和输入的数据一定都要一样,这样才能找出由服务器端产生的动态数据。有时候会遇到真的无法使用相同的输入数据,那您也要记住您使用的输入数据,到时才能判断是您输入的数据,还是变动的数据。

    2。使用WinDiff工具协助找出需要关联的数据
       在第二份脚本中,点选VuGen的【Tools】>【Compare with Vuser…】,并选择第一份脚本。接着WinDiff会开启,同时显示二份脚本,并显示有差异的地方。WinDiff会以一整行黄色标示有差异的脚本,并且以红色的字体显示真正差异的文字。(假如没看到红色字体,请点选【Options】>【View】>【Show Inline Differences】)。逐一检视二份脚本中差异的部份,每一个差异都可能是需要做关联的地方。选取差异的脚本,然后复制。在复制时,有时并不需要取整行脚本,可能只会选取脚本中的一部分。
    注意:请忽略lr_thik_time的差异部份,因为lr_thik_time是用来模拟每个步骤之间使用者思考延迟的时间。
       在Recording Log中找到了要找的数据,这时要确认数据是从服务器端传送过来的。首先可以先检查数据的标头,从标头的Receiving response可以知道数据是从服务器端传送到client端的,而此数据极有可能需要做关联。

    3。使用web_reg_save_param函数手动建立关联
       在之前的步骤,我们已经在Execution Log找到可能需要关联的动态数据。在Execution Log中选取动态数据前的文字然后复制,我们将会利用这段文字,来帮助我们找出要关联的动态数据。 
       不过在这之前我们要先找出使用web_reg_save_param函数的正确位置,所以我们要再重新执行一遍脚本,而且这次会开启所有的Log。在VuGen中点选【Vuser】>【Run-Time Settings】。点选【General】>【Log】。勾选【Enable logging】、【Always sends messages】、【Extended log】,以及【Extended log】下的所有选项。按下【OK】就可以执行脚本了。
       执行完脚本之后,在Execution Log中搜寻刚刚复制的字符串。找到字符串后,在字符串前面会有A.tion1.c(9),这个9就是到时候要插入web_reg_save_param函数的位置,也就是要插入到脚本的第9行。

    4。将脚本中有用到关联的数据,以参数取代
       当使用web_reg_save_param建立参数后,接下来就是用“UserSession”参数去取代脚本中写死的(hard-coded)资料。
    例如:将“Name=userSession”,Value=75893.0884568651DQADHfApHDHfcDtccpfAttcf”, ENDITEM,换成“Name=userSession”, “Value={UserSession}”, ENDITEM,

    5。找出左边界字符串
       再回到Recording Log/Execution Log中,选取动态数据前的字符串并且复制它。这时会有个问题,到底要选取多少字符串才足以唯一识别要找的动态数据呢?建议是越多越好,但是尽量不要包含到特殊字符。

    6。找出右边界字符串
       接下来要找出动态数据的右边界字符串,这个字符串就比较好找了,从动态数据的最后一个字符开始,通常就是我们要找的右边界字符串了。

       到这里您已经完成了一个关联了,接下来就是执行脚本,是否能成功运行,假如还是有问题,就要检查看看是否还需要再做另一个关联。

    代码展示

    1 #include "web_api.h"
    2
    3
    4 Action()
    5 {
    6 lr_rendezvous("upload"); //集合点
    7
    8 lr_start_transaction("key and upload"); //Tansaction开始
    web_reg_save_param("mykey", //mykey就是ParamName
    10  "LB=clientIp/192.168.1.104.html<br>wkey:", //左边界
    11  "RB=<html>", //右边界
    12  LAST);
    13 lr_end_transaction("key and upload", LR_AUTO); //Tansaction结束
    14
    15 web_url("upload.php",
    16  "URL=http://dev.accessport.com/rs_client/upload.php",
    17  "Resource=0",
    18  "RecContentType=text/html",
    19  "Referer=",
    20  "Snapshot=t1.inf",
    21  "Mode=HTML",
    22  EXTRARES,
    23  "URL=upload.swf?rserver=http://if.rs.accessport.cn/rs_save.php&siteid=470dc0a863cef2f501a8bc59&wkey={mykey}", ENDITEM,
    23  "URL=http://if.rs.accessport.cn/crossdomain.xml", ENDITEM,
    24  "URL=http://store.rs.accessport.cn/getdata.php? pid=1a10110f2q4dl2q18l470dc0a863cef2f501a8bc59&name=&key=d557e2a7a8bdeffbbe099fb54dd29436&rkey=lLWHWHWHwWywWy4KwWyLDq3&siteid=465ac0a84ce3d38c01671317", ENDITEM,
    25  LAST);
    26 lr_think_time(3);
    27
    28 web_custom_request("rs_save.php",
    29  "URL=http://if.rs.accessport.cn/rs_save.php?siteid=470dc0a863cef2f501a8bc59&wkey={mykey}&filesize=103624",
    30  "Method=POST",
    31  "Resource=0",
    32  "RecContentType=text/html",
    33  "Referer=",
    34  "Snapshot=t2.inf",
    35  "Mode=HTML",
    36  "EncType=multipart/form-data; boundary=----------Ef1Ij5cH2ae0ae0gL6Ef1GI3ae0Ef1",
    37  body_variable_1,
    38  LAST);
    39
    40 return 0;
    41 }

  • QTP(1)编写循环脚本建立10000个用户

    2007-10-24 17:06:24

    目标:测试时在登陆区注册10000个用户
    说明:如果不使用VB语言写循环的话,建立10000个用户的注册显然有些麻烦。总不能在表格中填写user0~user9999吧,那多累啊。
    步骤:(怎么感觉我是在写bug report呢
    1。录制脚本(把第一个用户注册的全过程录制下来)
    2。修改脚本(使用专家视图模式)
        a〉在脚本的启示位置输入:
           dim x
           dim shuzu(10000)
           for x=0 to 9999
           shuzu(x)="user" & cstr(x)  //这就是user0~user9999了
           。
           。
           。
           。    //这些都是脚本了
        b〉在脚本的末尾输入:
           Next   //千万别忘了,不然不能循环了
        c〉不过还要记住,在输入用户名的脚本那一行,把原来的用户名修改为shuzu(x)
           密码无所谓了,改不改都可以

    代码部分展示:(棕底黄色字为手动添加部分)
    Dim x
    Dim shuzu(10000)
    For x=0 to 9999
    shuzu(x)="user" & cstr(x)

    Browser("BeeSpace 1.1.0 - Powered").Page("BeeSpace 1.1.0 - Powered").Link("注册").Click
    Browser("BeeNest Board - Powered").Page("BeeNest Board - Powered").WebEdit("username").Set shuzu(x) //用户名用shuzu()代替
    Browser("BeeNest Board - Powered").Page("BeeNest Board - Powered").WebEdit("password").SetSecure "46496a903e697216e833ae69" //密码(加密过啦)
    Browser("BeeNest Board - Powered").Page("BeeNest Board - Powered").WebEdit("password2").SetSecure "46496a924885146e6d1f674a" //重复密码
    Browser("BeeNest Board - Powered").Page("BeeNest Board - Powered").WebEdit("email").Set shuzu(x) & "@126.com" //email地址都不一样,防止不能注册
    Browser("BeeNest Board - Powered").Page("BeeNest Board - Powered").WebButton("确定").Click
    Browser("BeeNest Board - Powered").Page("BeeNest Board - Powered_2").Link("如果不能跳转,请点击此连接").Click
    Browser("BeeNest Board - Powered").Page("申请空间 - BeeSpace 1.1.0").WebRadioGroup("tplid").Select "brown"
    Browser("BeeNest Board - Powered").Page("申请空间 - BeeSpace 1.1.0").WebButton("确定").Click
    Browser("BeeNest Board - Powered").Page("消息提示 - Powered By").Link("确定").Click
    Browser("BeeNest Board - Powered").Page("user的我的空间首页").Link("Cookie清除").Click
    Browser("BeeNest Board - Powered").Page("消息提示 - Powered By_2").Link("确定").Click
    Browser("BeeNest Board - Powered").Page("user的我的空间首页").Sync
    Browser("BeeNest Board - Powered").Close
    Browser("BeeSpace 1.1.0 - Powered").Page("BeeSpace 1.1.0 - Powered").Sync
    Next

    注意啦:
    在测试的时候需要在后台管理关闭验证码功能,否则就不能达到这个效果了。
    那么如何解决网页上诸如验证码的动态网页内容在QTP测试时的困扰呢?且听下回分解!
  • 冒泡了,浮出水面

    2007-10-24 16:32:26

    访问了51testing半年了,也没发表个什么。不过半年来在测试的道路上前进再前进,真的有很多话要说。这次就先冒个泡,闲暇的时候把自己的经验同朋友们分享。独乐乐不如与众乐乐。
Open Toolbar