51Testing软件测试论坛

标题: QTP之读取excel表格空数据时错误 [打印本页]

作者: liaojianguo    时间: 2010-3-26 11:05
标题: QTP之读取excel表格空数据时错误
用qtp录制网页的登录过程。用户名和密码都从外部excel读取,但是如果有某个excel表格设计为空,读取到数据后,在界面上回放点击登录按钮没反应。如果将该空表格填入数据,则能正常点击登录按钮。同样,不读取外部excel数据,就算是用本地参数化的形式,如果有空数据,点击登录按钮都没反应,除非把空数据补好。是何故?
作者: zzxxbb112    时间: 2010-3-26 11:26
没看懂,你数据为空,登陆当然没反应咯~
作者: feiyunkai    时间: 2010-3-26 13:15
在你要设置空数据的单元格里加一个英文状态下的单引号 ,不然EXCEL会认为这个单元格没有数据,而不是空数据
作者: yujie6832    时间: 2010-3-26 13:15
数据为空,读出来也是空值
作者: shotstar    时间: 2010-3-26 14:04
你是否想测试在不输入用户名和密码的时候点击登录会得到错误提示?
在手工测试的时候如果不输入用户名和密码是否有提示呢?


或者说你的意思是点击的动作根本没有执行,但是你想让他执行。如果是这样可以看看report,是否有点击登录的报告在里面。

[ 本帖最后由 shotstar 于 2010-3-26 14:07 编辑 ]
作者: liaojianguo    时间: 2010-3-26 14:12
我的意思就是想模拟密码为空,点击登录是否会得到提示信息。可是现在的状况是好像那个登录的点击操作没执行。但是如果密码加上去,不为空,则登录的点击则有效。
作者: shotstar    时间: 2010-3-26 14:41
那很有可能是因为获取数据获取到的是Empty,pass=Empty和pass=""是不同的。
很可能由于这个原因导致点击登录的操作没有执行。建议你先尝试一下直接使用pass=""看看能否正常点击登录。如果成功的话,可以考虑在你的代码前面加个判断:
If pass=Empty Then
    pass=""
End If
作者: wenbingping    时间: 2010-3-26 15:25
原帖由 shotstar 于 2010-3-26 14:41 发表
那很有可能是因为获取数据获取到的是Empty,pass=Empty和pass=""是不同的。
很可能由于这个原因导致点击登录的操作没有执行。建议你先尝试一下直接使用pass=""看看能否正常点击登录。如果成功的话,可以考虑在你的代 ...


正解,楼主快试试
作者: liaojianguo    时间: 2010-3-26 15:30
不太明白 If pass=Empty Then
    pass=""
End If

pass是什么
作者: feiyunkai    时间: 2010-3-26 15:33
为空的单元格里加个英文状态的单引号就行了
作者: shotstar    时间: 2010-3-26 15:34
是保存密码的变量。你是直接把数据使用在语句里了吧,
例如你的可能是这样的:
Browser().Page().WebEdit("password").Set DataTable(A1,globalSheet)
这个DataTable(A1,globalSheet)很可能是Empty的值。我一般习惯用变量进行处理。用参数化的Parameter我也习惯这样做。
pass=DataTable(A1,globalSheet)
Browser().Page().WebEdit("password").Set pass
然后加上这个判断之后就成这样了。
pass=DataTable(A1,globalSheet)
If pass=Empty Then
    pass=""
End If
Browser().Page().WebEdit("password").Set pass
作者: liaojianguo    时间: 2010-3-26 17:59
喔,我明白了。多谢
作者: liaojianguo    时间: 2010-3-26 18:03
还有个问题想探讨下。就是循环问题,例如我一个脚本里有登录和新增数据的过程,登录为正常,新增的数据是用dtLocalSheet方法。这样每个循环都要将登录和新增数据都做一次,我想只是登录一次然后只将后面的新增数据取dtLocalSheet的数据循环即可,这个如何实现
作者: shotstar    时间: 2010-3-26 22:44
直接解决问题的办法,你的登录和新增数据是2个action吧,把他们按顺序放好,设置action的属性登录只循环一次,新增选择all row。

另外提供一种更优化的解决方案,这是方便你以后扩展的一种方案。
首先,你的登录和新增各在一个action里面,他们两个存放在一个test里也可以,放不同test也可以,把action的属性设置为reusable(好像是这么拼的吧),就上让action可重用。建议新增数据的action使用parameter参数化。上面2个action我们可以称之为API。
下面我们新建一个test(称之为测试案例),改到专家视图,在他的action里面使用添加exist action,选择刚才的test,选择里面的action(只有设置为可重用的才能选)。这样把2个API都添加进来了。刚添加好之后,在测试案例的里面应该是这样的:

Runaction 登录[testAPI]
Runaction 新增[testAPI]

因为我没打开QTP,上面的代码可能略有差别。之后我们就可以按照需要进行测试流程的设计:你需要新增进行循环,也是有2种方法,一个是修改新增的循环次数,需要修改action call property(关键字视图右键点action名字),改成run all row。另一个是用vbs写代码,我写个大概的伪代码。
********************
Runaction 登录[testAPI]
Row=1
Do
  Runaction 新增[testAPI],oneIteration, dtLocalSheet(单元格)的值, dtLocalSheet(单元格2)的值
  Row=Row+1
  SetCurrentRow(Row)
Loop until dtLocalSheet(单元格)的值=""
********************
或者获取dtLocalSheet的行数用for循环。我忘记怎么获取dtLocalSheet某个单元格的值是怎么获取的了,这些方法在QTP帮助目录里有,帮助文件的名字是u开头的那个文件。

这样做的好处是让测试模块化,每一个API的action只处理一个独立的事情,在一个大一点的系统里你就可以做多个模块的划分,然后根据需要把不同的模块串联起来,形成一定的流程。比如你的系统可能现在只有新增数据,以后多一个删除数据的模块,你就可以再做一个删除数据的API,然后把他们串起来,例如 登录-新增数据-删除数据。
不过这样做最好把每个模块的起始页面和结束页面统一起来,比如都以登录后的页面作为起始页面,每一个API都是从起始页面进入具体功能点,处理完成后返回起始页面,如果功能较大也可以继续拆分,不过要保证其连续性,避免组合模块的时候出问题。在测试案例里插入API的时候一般选择insert exist action,不要选copy action。以后维护案例基本上很少,主要是维护API。同时每个API的action都可以用parameter参数化,自己定义输入输出参数,在流程案例里action之间传递数据相当方便。

写了很多,其实我更喜欢后一种方法,他让你在做测试案例的时候有一种设计的思路在里面,另外就是重用的思想。希望能对你有所帮助,也欢迎其他朋友一起交流。




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2