51Testing软件测试论坛

标题: 关于GUI自动化测试工具RFT的手动验证问题 [打印本页]

作者: usdark    时间: 2011-7-14 16:28
标题: 关于GUI自动化测试工具RFT的手动验证问题
我按照http://www.cnblogs.com/mingzi/archive/2009/01/13.html这篇文章写了一个手动验证点。
就是自己写个类,然后创建ValueManager,按照上面说的把ValueManager转换为JAR文件。结果验证的时候,得到的验证点失败,然后查看验证的比较器,里面的值预期值和实际值都是相同的。不知道为什么会显示验证失败。
[attach]74203[/attach]

后来我查看了他的.rfpvt.发现基线和实际值是相同的,但预期值和实际值有点区别
下面是基线和实际值的.rfpvt的内容
<?xml version="1.0" encoding="UTF-8"?><MyPoint L="MyPoint"><X>6</X><Y>7</Y></MyPoint>

下面是预期值的内容:
<?xml version="1.0" encoding="UTF-8"?><UnsupportedObject L="MyPoint"><Y>7</Y><X>6</X></UnsupportedObject>

既然基线和实际结果是一样的,为什么预期结果会有差别呢?
还有vpManual的实现过程是什么样的?
作者: hanhuamei2008    时间: 2011-7-15 13:29
顶下帖,
顺便请教lz ,rft支持SUSE系统的QT的c 语言变成么?
作者: hanhuamei2008    时间: 2011-7-15 13:29
C/S框架的
作者: usdark    时间: 2011-7-15 16:08
RFT是针对JAVA的eclipse,貌似不支持C
作者: 散步的SUN    时间: 2011-7-18 14:01
首先,你是构造了一个值管理器:值管理器与值类进行交互,这样可以对值类对象进行序列化和比较处理并使值类对象持久存在
猜测:是不是你只进行了值管理器的注册和值的比较,但是没有在实际项目中体现perfomece,即没有对返回的值进行判断(0),具体看看你的日志回显情况
vpManual的实现过程:其实就是定义一个需要判断的object,在回放过程中,回根据这个实际对象的各个属性值去匹配其实际运行过程中的测试对象
拓展:其实你真要做匹配的话,建议别用这种方式,太麻烦而且灵活性不高,用getProperty与getTestData的方式,然后自己写一个比较函数和日志(可以写到RFT的日志中,也可以自己拓展一个日志)
作者: usdark    时间: 2011-7-20 09:26
非常感谢LS的回复,还是没有找到问题,可能就是你说的没有体现perfomece判断。但我不知道怎么实现它的判断。RFT把这些方法都编译过了,看不懂。不过我已经放弃这种方法了,确实如LS说的,这种方法麻烦而且不灵活,呵呵。

我刚刚开始学习RFT,很多地方都不懂。比如可不可以实现树的展开这个功能。我想调用JTreePoxy这个类我想用这样的代码去调用:JTreeProxy myTree = new JTreeProxy(Object)

结果运行到这一行的时候,控制台就会抛出这样一个异常:
回放脚本期间发生异常:[Script1] [脚本“Script1”的第 107 行上的 RationalTestScriptError:[java.lang.NoClassDefFoundError] - com.rational.test.ft.domain.java.jfc.JTreeProxy。]。

它的日志是这样的:
失败 2011年7月20日 上午09时18分28秒 Script1.testMain 有未经处理的错误。
exception_name = java.lang.NoClassDefFoundError
exception_message = com.rational.test.ft.domain.java.jfc.JTreeProxy
script_name = Script1
script_id = Script1.java
line_number = 107
exception_stack = at Script1.testMain(Script1.java:107)
at org.eclipse.equinox.internal.app.EclipseAppContainer.callMethodWithException(EclipseAppContainer.java:587)
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:198)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:369)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:619)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:574)
at org.eclipse.equinox.launcher.Main.run(Main.java:1407)
at org.eclipse.equinox.launcher.Main.main(Main.java:1383)
at org.eclipse.core.launcher.Main.main(Main.java:34)
at com.rational.test.ft.util.FtClassLoader.loadClass(FtClassLoader.java:159)
at java.lang.ClassLoader.loadClass(ClassLoader.java:619)

请问这是什么原因呢?如何解决?
非常感谢
作者: 散步的SUN    时间: 2011-7-21 14:15
我觉得:
1、你这里实例化了一个JTree的代理类,想通过这个代理类直接去操作AUT,刚开始弄RFT就这样,想法不错~~~
2、这里的异常是.NoClassDefFoundError是无法找到某个类,哪个类,个人觉得是你那个object类是不是有问题,是不是不是标准的注册的ProxyTestObject类?
具体能看看你的Script1中关于object?
作者: usdark    时间: 2011-7-25 16:40
本帖最后由 usdark 于 2011-7-25 17:08 编辑

我的object是这样的:
1   我先定义一个TestObject[]的对象,就是找到树;
                        TestObject[] page = getRootTestObject().find(atDescendant(".class",
                                        "SysTreeView32"));

2 然后我把TestObject找到的最后一颗树(就是我要操作的树),定义为一个ITestDataTree类的对象cdTree;
                        cdTree = (ITestDataTree)page[page.length-1].getTestData("tree");

3 把 cdTree传递给JTreeProxy类的构造函数:
                       JTreeProxy proxy = new JTreeProxy(cdTree);

cdTree就是那个object了;我也曾经试过直接把TestObject对象(就是不把最后一颗树转化为ITestDataTree类型,而直接用TestObject类型),结果他们的报错是一样的。

这几天休假,呵呵,没有来论坛。请LS指点。
作者: 散步的SUN    时间: 2011-7-25 17:23
休假很舒服吧,羡慕,指教说不上,一起探讨吧,难得有兴趣
1、你这里是测试win32的程序吧
2、我对win32程序不是很了解,但是个人觉得你在这里应该是一个页面中有很多SysTreeView32对象?这样的话,你用只用了一个识别方法去寻找SysTreeView32,RFT是无法识别的
3、如果你的页面中只有一个SysTreeView32,你所说的寻找最后一颗树,难道是节点?因为你这里定义的是ITestDataTree对象,这是树中的节点数据
4、我觉得,你构建的代理类JTreeProxy ,其中映射的对象只能是树,而不能是cdTree之类的数据,可以看看其中的映射XML就知道了,其对象都是一一映射的。
你可以将其界面的情况说说,也许可以一起更好的分析一下
呵呵,希望不要误导你了
作者: usdark    时间: 2011-7-27 10:53
1 呵呵。我是因为公司测试需要,所以学习RFT。我们的界面是用eclipse写的,运行在windows操作系统。
2 主界面上有两颗树,就是两个SysTreeView32对象,在find 的时候会找到两个属性为SysTreeView32的TestObject对象,而我要操作的树是后面一颗,所以我选择后面的一个。
3 我试过直接把TestObject作为对象传递:
  TestObject[] page = getRootTestObject().find(atDescendant(".class", "SysTreeView32"));
  Tree = page[page.length-1];
  JTreeProxy proxy = new JTreeProxy(Tree);
  结果,报错是一样的。
4 映射对象只能是树的话,那么这个对象的类型是什么样的呢?  另外映射XML应该在哪里查看?我不是很明白这个。

谢谢
作者: 散步的SUN    时间: 2011-7-27 13:31
1、你输出一下你的“page.length-1”,个人觉得应该不是1
2、Tree = page[1]试试
按道理应该是Tree没有那个对象,所以你实例化对象的时候根本就装载不了吧,没有那个对象传递啊,构造方法就不对吧
试试吧
作者: usdark    时间: 2011-7-27 13:48
有的。这是调试框里page 的内容,有两个对象
[attach]74464[/attach]

这是把两个树的属性都打印出来的(我把.class属性标成红色了):
{.clientRectangle=java.awt.Rectangle[x=0,y=0,width=144,height=558], .description=null Object, .class=SysTreeView32, .textColor=java.awt.Color[r=0,g=0,b=0], .visible=true, .windowedcontrol=true, .name=null Object, .style=1442923061, .value=null Object, .helpFile=null Object, .text=, .enabled=true, .helpTopic=0, .keyboardShortcut=null Object, .defaultAction=null Object, .exstyle=1048576, .screenRectangle=java.awt.Rectangle[x=769,y=340,width=144,height=558], .backgroundColor=java.awt.Color[r=255,g=255,b=255], .processId=5064, .classstyle=16392, .numChildren=7, .associatedId=593574, .hasFocus=false, .font=com.rational.test.ft.value.FontInfo[name=微软雅黑,style=0,size=9], .id=593574, .hwnd=593574, .state=1048576, .role=9, .help=null Object}

{.clientRectangle=java.awt.Rectangle[x=0,y=0,width=232,height=537], .description=null Object, .class=SysTreeView32, .textColor=java.awt.Color[r=0,g=0,b=0], .visible=true, .windowedcontrol=true, .name=null Object, .style=1443971637, .value=null Object, .helpFile=null Object, .text=, .enabled=true, .helpTopic=0, .keyboardShortcut=null Object, .defaultAction=null Object, .exstyle=1049088, .screenRectangle=java.awt.Rectangle[x=528,y=340,width=236,height=558], .backgroundColor=java.awt.Color[r=255,g=255,b=255], .processId=5064, .classstyle=16392, .numChildren=7, .associatedId=68318, .hasFocus=false, .font=com.rational.test.ft.value.FontInfo[name=微软雅黑,style=0,size=9], .id=68318, .hwnd=68318, .state=1048576, .role=9, .help=null Object}
作者: usdark    时间: 2011-7-27 13:53
我用:

Tree2 = page[1];
JTreeProxy proxy = new JTreeProxy(tree2);

试了,还是一样的错误。
作者: usdark    时间: 2011-7-27 13:55
我用:

Tree1 = page[0];
JTreeProxy proxy = new JTreeProxy(tree1);

试了,也是那样的错误。呵呵
作者: 散步的SUN    时间: 2011-7-27 14:42
1、我在RFT试了随意去构造一个JTreeProxy
2、你这个Tree 是一个什么对象?
3、你直接试试这样JTreeProxy proxy = new JTreeProxy(page[1]);
4、你再试试
GuiTestObject a = (GuiTestObject )page[page.length-1];
JTreeProxy proxy = new JTreeProxy(a);
5、再不行的话,我索性在用这个方法写一个试试
作者: usdark    时间: 2011-7-27 15:54
1        你是如何构造的?构造成功了吗?传递的参数是什么类型的对象?
2        我的Tree类型是TestObject:     TestObject Tree = page[1];
3、4   用你的两种方法试过了,还是一样的错误
作者: 散步的SUN    时间: 2011-7-27 16:26
1、我就是这样构造的啊,除了与你查找的class属性不一样外
2、TestObject 也应该没问题
3、你的jdk的版本是多少,环境变量对么...
按道理应该不会有什么问题,你就是在JTreeProxy proxy = new JTreeProxy(a)这行出问题了?
作者: 散步的SUN    时间: 2011-7-27 16:51
你这里要不不用TreeProxy试试
直接试试
GuiSubitemTestObject a = new GuiSubitemTestObject(page[page.length-1]);
a.click(atPath("节点名称"));
试试再看~
作者: usdark    时间: 2011-7-27 17:23
a.click(atPath("节点名称"));是可以的。我的脚本上有这个功能。但问题是这样是没法判断是否展开树的。

因为如果是在树展开的状态去click的话,就会折叠起来。在测试的时候,不能知道click后树是展开了,还是折叠了。我要实现的一个功能中,需要首先判断树是否展开。

这个问题困扰很久了,虽然影响不是非常大,但没有解决,感觉总有点遗憾,呵呵。
作者: 散步的SUN    时间: 2011-7-27 19:31
1、哦,这样
2、判断树的状态,这样我也不是很清楚,不好意思没能帮上你,可以的话,你短消息发你的QQ或者MSN给我,再一起研究研究
作者: usdark    时间: 2011-7-28 10:10
我们大概找到原因了。我们用的RFT是试用版的,所以那些代理类都不可用……
作者: usdark    时间: 2011-7-28 11:32
本帖最后由 usdark 于 2011-7-28 11:37 编辑

开发RFT挺不容易的,遇到的问题多多,呵呵
作者: 散步的SUN    时间: 2011-7-29 12:38
回复 22# usdark
呵呵,不容易才是好玩
因为灵活性高,所以才不容易嘛
作者: fxy860709    时间: 2012-8-28 14:59
我想请教LZ一个基本的问题,你的验证点的构造的基本思路是什么样的?看了一下回复和问题,没有特别明白。能否给讲讲?
作者: fxy860709    时间: 2012-8-28 15:02
找到了,在你发的链接里,刚才没打开,哈,非常感谢!




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