51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 3151|回复: 13
打印 上一主题 下一主题

[原创] 关于描述性编程参数化的话题

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2007-4-20 10:44:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请高手帮忙!
首先我提的这个问题应该N多个人提过了,问题是这样:
使用描述性编程写一段代码,并且使之数据参数化,是导入本地的Excel表格的数据,不用QTP里的向导设置。

场景1:
User1登陆系统后,在系统里增加一条数据后,继续增加数据(参数化就2条数据),然后退出;
User2再登陆系统,在系统里增加一条数据后,继续增加数据(参数化就2条数据),然后退出。

按照录制的方式,要实现场景1的话,登陆的用户就要使用Global参数化,在里面操作的数据要使用Local参数化,并且要分割Action,才能实现。

下面是我用描述行编程写的代码:(我本地的Excel数据:Sheet1是Global,也就是登陆的数据;Shee2是Local,是登陆后操作的数据。)

Count=2
DataTable.ImportSheet "E:\a.xls",2,"Action1"
DataTable.ImportSheet "E:\a.xls",1,"Global"

' Log In
browser("title:=BugTest1.0").page("title:=BugTest1.0").webedit("name:=username","type:=text").Set DataTable("username",dtGlobalSheet)
browser("title:=BugTest1.0").page("title:=BugTest1.0").webedit("name:=password","type:=password").Set DataTable("password",dtGlobalSheet)
browser("title:=BugTest1.0").page("title:=BugTest1.0").webbutton("name:=Log In","type:=button").Click
'Log In

For i=1 to Count   
' New Staff
browser("title:=BugTest1.0").page("title:=BugTest1.0").webedit("name:=CHNName","type:=text").Set DataTable("CHNName",dtLocalSheet)
browser("title:=BugTest1.0").page("title:=BugTest1.0").webedit("name:=Age","type:=text").Set DataTable("Age",dtLocalSheet)

' Save
browser("title:=BugTest1.0").page("title:=BugTest1.0").webbutton("name:=Save","index:=0").Click

DataTable.GetSheet(2).SetNextRow
DataTable.GetSheet("Global").SetNextRow
Next

' Log out
browser("title:=BugTest1.0").page("title:=BugTest1.0").link("name:=   Log out","class:=sublink").Click

效果是:User1登陆系统后,在里面做完事情后,才退出,但是再次登陆系统的用户还是User1在里面做事情。
怎样才能让User2也能进系统做事情呢?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
 楼主| 发表于 2007-4-20 14:34:19 | 只看该作者
这么多人浏览帖子,怎么没一个给出建议的呀!
郁闷,是不是提的问题很烂啊

但是还是希望大家提一些建议帮我解决一下,谢了。
回复 支持 反对

使用道具 举报

该用户从未签到

3#
 楼主| 发表于 2007-4-21 22:52:33 | 只看该作者
sdlkfj9 高手们,请帮帮忙吧。
跪谢!
回复 支持 反对

使用道具 举报

该用户从未签到

4#
发表于 2007-4-22 09:45:42 | 只看该作者

你的CODE 能RUN 吗? 在你的"登陆后操作"ACTION

这个ACTION 你想让他RUN 两遍.是吧. 但他的起始页面和终点页面不同(从你的CODE中来看). 这可以运行下去吗?
可能我的理解有错?


原帖由 alex_82712 于 2007-4-21 22:52 发表
sdlkfj9 高手们,请帮帮忙吧。
跪谢!
回复 支持 反对

使用道具 举报

该用户从未签到

5#
 楼主| 发表于 2007-4-22 20:48:53 | 只看该作者

回复 #4 henhenchen 的帖子

可以运行,因为点击保存以后,页面自动跳转到New Staff的页面,所以可以继续运行,直到把所有参数都运行一边后就推出,再换另外个用户进来

可现在是另外换的新用户还是参数化里的第一个用户,其他的用户都没有被运行,不知道是什么原因
回复 支持 反对

使用道具 举报

  • TA的每日心情
    开心
    2016-2-27 08:48
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]测试小兵

    6#
    发表于 2007-4-23 08:25:09 | 只看该作者

    有点疑问

    QTP运行到  browser("title:=BugTest1.0").page("title:=BugTest1.0").link("name:=   Log out","class:=sublink").Click 以后,系统能自动出现 browser("title:=BugTest1.0").page("title:=BugTest1.0") 这个页面吗?
    另外 请参考 [QTP精华区] 里面的 http://bbs.51testing.com/thread-14818-1-1.html 帖子。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    7#
    发表于 2007-4-23 09:53:30 | 只看该作者
    如果把QTP识别页面对象的方式改为忽略某些条件的话,比如忽略用户和非用户输入数据(Get和Post),QTP可能会把一个浏览器窗口的多个页面识别为一个对象。
    在上个页面用户退出登录后,应该回到用户登录页面。但是QTP可能会将用户登录页面和先前的数据录入页面作为同一个对象保存。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    8#
    发表于 2007-4-23 11:27:52 | 只看该作者

    回复 #1 alex_82712 的帖子

    出现这种现象,可能和QTP判断循环次数以及测试脚本设计有关系。
    因为这个问题和页面功能没有关系,我简化成下面的脚本来比较一下数据放在测试脚本的默认数据表和外部数据中的区别:
    Count = 2
    DataTable.ImportSheet "C:\a.xls",2,"Action1"
    DataTable.ImportSheet "C:\a.xls",1,"Global"

    'User Log In
    Reporter.ReportEvent micDone, "Action1", "User Login As: " & DataTable("User", dtGlobalSheet)

    For i=1 to Count
            Reporter.ReportEvent micDone, "Action1", DataTable.GetSheet("Global").GetCurrentRow
    'Inster New Data
            Reporter.ReportEvent micDone, "Action1", "Insert New Data As: " & DataTable("Field", dtLocalSheet)
            DataTable.GetSheet(2).SetNextRow
            DataTable.GetSheet("Global").SetNextRow
    Next
    数据导入后,在Global表里面是一列数据User,有两行User1和User2;
    数据导入后,在Action1表里面有一列数据Field,有两行aaa和bbb;
    这样运行的情况应该和你说的差不多了,运行的结果是:
    Log In as User1, Insert aaa, bbb;
    Log In as User1, Insert aaa, bbb;

    把数据直接放到测试脚本的默认数据表中并且注释掉导入数据的语句,再次运行的结果很有意思:
    Log In as User1, Insert aaa, bbb;
    Log In as User2, Insert aaa, bbb;
    可能这才是你要的结果吧?

    考虑到QTP运行时的默认循环次数是根据Global里面的数据行数决定的,两次运行的用户登录次数都是对的。至于为什么从外部导入数据时,总是读取Global的第一行而不读取第二行数据,可能QTP有Bug吧。如果数据从外部导入,下面的数据导入语句是放到Action1里面的。
    DataTable.ImportSheet "C:\a.xls",2,"Action1"
    DataTable.ImportSheet "C:\a.xls",1,"Global"
    也就是说Global里面数据是在测试脚本已经开始运行了,才加载进来的,和默认放到Global中的数据有些不同。可能QTP判断对了循环的次数,即Global有两行。但是读取数据的时候却读取了Global的第一行数据。

    前面的分析部分是猜的,我觉得把应该调整一下测试脚本的结构。把几个操作分开成几个Action更加合理,而且可以避开你遇到的问题。下面的代码供参考:
    'Action1 --- 导入数据,并且调用Action2,即用户登录
    DataTable.ImportSheet "C:\a.xls",2,"Action3"
    DataTable.ImportSheet "C:\a.xls",1,"Action2"
    RunAction "Action2", "1-" & DataTable.GetSheet("Action2").GetRowCount

    'Action2 --- 用户登录,并且调用Action3,即插入数据
    'User Log In
    Reporter.ReportEvent micDone, "Action1", "User Login As: " & DataTable("User", dtLocalSheet)
    RunAction "Action3", "1-" & DataTable.GetSheet("Action3").GetRowCount

    'Action3 --- 插入数据
    Reporter.ReportEvent micDone, "Action1", "Insert New Data As: " & DataTable("Field", dtLocalSheet)
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2007-4-23 12:21:27 | 只看该作者

    winfood 说的没错了. 反正记注.在CODE 中每当你调用

    IMPORT STATEMENT 时. DATATABLE 的指针总是指在第一行(不管GLOBLE/LOCAL).所以在你的CODE 的开头把以下
    Count=2
    DataTable.ImportSheet "E:\a.xls",2,"Action1"
    DataTable.ImportSheet "E:\a.xls",1,"Global"

    变成
    Count=2
    CURROW=DATATABLE.GLOBALSHEET.GETCURRENTROW
    DataTable.ImportSheet "E:\a.xls",2,"Action1"
    DataTable.ImportSheet "E:\a.xls",1,"Global"
    DATATABLE.GLOBALSHEET.SETCURRENTROW CURROW
    就应该能工作了吧. 你试试.有结果告诉大家一下



    原帖由 alex_82712 于 2007-4-22 20:48 发表
    可以运行,因为点击保存以后,页面自动跳转到New Staff的页面,所以可以继续运行,直到把所有参数都运行一边后就推出,再换另外个用户进来

    可现在是另外换的新用户还是参数化里的第一个用户,其他的用户都没 ...
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
     楼主| 发表于 2007-4-23 16:11:43 | 只看该作者

    回复 #6 walker1020 的帖子

    版主你提的问题,点击logout后,就直接退出到登陆界面,只要参数化,可以继续运行的
    现在我把登陆后里面的操作全部删除了
    就仅仅一个登陆,使用global参数化,只能运行第一行的参数,其他行的参数不能被运行,不知道是什么原因
    请版主以及高手们帮忙解决一下。下面是代码

    '  [Descriptive Programming]


    DataTable.ImportSheet "E:\a.xls",1,"Global"

    ' Log In
    browser("title:=BugTest1.0").page("title:=BugTest1.0").webedit("name:=username","type:=text").Set DataTable("username",dtGlobalSheet)
    browser("title:=BugTest1.0").page("title:=BugTest1.0").webedit("name:=password","type:=password").Set DataTable("password",dtGlobalSheet)
    browser("title:=BugTest1.0").page("title:=BugTest1.0").webbutton("name:=Log In","type:=button").Click
    ' Log In
    DataTable.GetSheet("Global").SetNextRow
    ' Log out
    browser("title:=BugTest1.0").page("title:=BugTest1.0").link("name:=Log out","class:=sublink").Click
    ' Log out
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    11#
    发表于 2007-4-23 16:32:50 | 只看该作者
    这个很好理解阿,你每次执行都重新import datatable,自然是从user1开始执行

    解决办法,要么就是把globle的数据静态引入,要么就增加一个action,只负责引入datatable,在action2中进行login
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    12#
     楼主| 发表于 2007-4-23 16:56:09 | 只看该作者
    谢谢大家的帮助,我按照你们的提示
    1: Count=2
    2: CURROW=DATATABLE.GLOBALSHEET.GETCURRENTROW
    3: DataTable.ImportSheet "E:\a.xls",2,"Action1"
    4: DataTable.ImportSheet "E:\a.xls",1,"Global"
    5: DATATABLE.GLOBALSHEET.SETCURRENTROW CURROW
    运行到第5行就会报错,报错信息看附件

    不过在我原来的代码上,做了些修改,就运行成功了。跟大家分享一下代码
    Count=2
    DataTable.ImportSheet "E:\a.xls",2,"Action1"
    DataTable.ImportSheet "E:\a.xls",1,"Global"

    For a=1 to Count   '登陆按照global参数化的for循环
    ' Log In
    browser("title:=BugTest1.0").page("title:=BugTest1.0").webedit("name:=username","type:=text").Set DataTable("username",dtGlobalSheet)
    browser("title:=BugTest1.0").page("title:=BugTest1.0").webedit("name:=password","type:=password").Set DataTable("password",dtGlobalSheet)
    browser("title:=BugTest1.0").page("title:=BugTest1.0").webbutton("name:=Log In","type:=button").Click
    'Log In

    For i=1 to Count   '登陆以后按照local参数化的for循环,主要在里面做事情
    ' New Staff
    browser("title:=BugTest1.0").page("title:=BugTest1.0").webedit("name:=CHNName","type:=text").Set DataTable("CHNName",dtLocalSheet)
    browser("title:=BugTest1.0").page("title:=BugTest1.0").webedit("name:=Age","type:=text").Set DataTable("Age",dtLocalSheet)

    ' Save
    browser("title:=BugTest1.0").page("title:=BugTest1.0").webbutton("name:=Save","index:=0").Click

    DataTable.GetSheet(2).SetNextRow   ' 在里面做事情的循环
    Next

    DataTable.GetSheet("Global").SetNextRow '登陆的循环
    ' Log out
    browser("title:=BugTest1.0").page("title:=BugTest1.0").link("name:=   Log out","class:=sublink").Click
    Next

    但是还是要设置一下,在File >> Settings里的Run 选项卡里选中Run from row1 to row1
    要不然,它会重复执行。譬如
    User1登陆后,在里面循环做完事情后,退出;换User2登陆,再在里面循环做事情,退出。按道理就应该结束了。
    但是它又重复了刚才的事情:“User1登陆后,在里面循环做完事情后,退出;换User2登陆,再在里面循环做事情。”
    因为我的参数设置了2条数据

    不知道是不是应该在代码里进行控制。

    有什么不对的,请大家指点,谢谢。

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

    x
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2007-4-24 09:23:50 | 只看该作者

    再加一句IF

    Count=2
    CURROW=DATATABLE.GLOBALSHEET.GETCURRENTROW
    DataTable.ImportSheet "E:\a.xls",2,"Action1"
    DataTable.ImportSheet "E:\a.xls",1,"Global"
    IF CURROW=0 THEN
    CURROW=1
    ENDIF
    DATATABLE.GLOBALSHEET.SETCURRENTROW CURROW



    原帖由 henhenchen 于 2007-4-23 12:21 发表
    IMPORT STATEMENT 时. DATATABLE 的指针总是指在第一行(不管GLOBLE/LOCAL).所以在你的CODE 的开头把以下
    Count=2
    DataTable.ImportSheet "E:\a.xls",2,"Action1"
    DataTable.ImportSheet "E:\a.xls",1,"Globa ...
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    14#
    发表于 2007-6-6 11:22:00 | 只看该作者

    回复 #13 henhenchen 的帖子

    感谢您提供的解决方法!sdlkfj3 sdlkfj3
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-24 01:50 , Processed in 0.096840 second(s), 29 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表