Sikuli+RobotFramework集成

上一篇 / 下一篇  2011-10-27 12:09:05 / 个人分类:Robot Framework

我经手的一个手机项目曾经用Sikuli做自动化,但是其难看及简陋的test report着实让我郁闷的了一段时间,找来找去,只想到了一个替换方案,详细内容参见如何保存Sikuli的运行结果,但是这个方案仍然没有办法提供一个完整的结果统计数据,后来看到了Robot Framework这个测试框架,它本身并不能对被测试系统做任务测试,是通过第三方的工作及TestLibraries驱动完成的,但是它提供了一套完整的test report及log管理,后来想想是否可以将Sikuli与Robot Framework集成在一起呢?

抱着这种想法,在网上搜索(当然是google上而且是英语的关键字搜索)了一下,有一个贴子http://groups.google.com/group/robotframework-users/browse_thread/thread/d92ce2ec8b530d42?fwc=1&pli=1有人提到了在Mac版下如何进行2者的集成,后来又有贡献者提供了在window xp下2者集成的详细过程http://blog.mykhailo.com/2011/02/how-to-sikuli-and-robot-framework.html

以下我只介绍在Mac OS下如何进行2者的集成,需要在windows OS的童鞋可参考http://blog.mykhailo.com/2011/02/how-to-sikuli-and-robot-framework.html

1. Robot Framework 集成 Sikuli的工作原理如下:

   Robot Framework是基于Python的,它提供了2种方法执行脚本, 一个是python (pybot), 另一个是jython(jybot), Robot Framework支持自定义的libraries及第三方工具; Sikuli是通过jython执行脚本;初步的想法是:把Sikuli写成的脚本作为libraries供Robot调用,执行脚本时使用'jybot'驱动Sikuli工具完成, 如下集成结构图


2. 操作步骤:
  • (1)安装
  • (2)确保Sikuli脚本可以正确被java执行
  • (3)将Sikuli脚本转换成Robot Framework可识别的libraries
  • (4)执行脚本
  • (5)运行结果
以下按上述步骤详述:

(1)安装(以下是针对Mac OS的)
       具体的安装过程请参见各工具的官方网站,其中Robot Framework的安装可参见Installation 

(2)确保Sikuli脚本可以正确被java执行

    为了保证Sikuli的脚本可以通过Robot Framework驱动执行,我们首先要确保sikuli的脚本可以通过命令行的形式执行(java命令),详细过程参见 https://answers.launchpad.net/sikuli/+faq/1110
  • a.创建一个测试文件夹,本案例为 /work/RobotSikuli
  • b.找到下载完成的Sikuli.App文件,右击“Show Package Contents”, 将其目录“/Contents/Frameworks”文件夹拷贝至/work/RobotSikuli
  • c.打开/work/RobotSikuli/Frameworks文件夹,新建一个change-path.sh脚本,脚本中包括如下内容:
#!/bin/sh
for lib in *.*lib
do   
  for ref in `otool -L $lib | grep executable_path | awk '{print $1'}`   
  do     
    install_name_tool -change $ref @loader_path/../Frameworks/`basename $ref` $lib   
  done
done
  • d.打开终端,跳转至/work/RobotSikuli/Frameworks目录,执行如下命令
1. chmod +x  change-path.sh:先用命令把批处理文件修改为可执行文件
2. ./change-path.sh :执行该文件。
3. 然后输入”otool -L *.*lib“: 确保脚本中所有libraries中@executable_path都被@loader_path "即/../Frameworks"所替换
  • e. 在/work/RobotSikuli/中新建一个名称为tmplib的文件夹,然后做如下运作
1. 找到下载完成的Sikuli.App文件,右击“Show Package Contents”, 解压目录“/Contents/Resources/Java/sikuli-script.jar”
2. 在解压后的文件夹中,找到“sikuli-script/META-INF/lib/libScreenMatchProxy.jnilib”并拷贝至/work/RobotSikuli/tmplib中
3. 在终端中执行“otool -L /work/RobotSikuli/tmplib/libScreenMatchProxy.jnilib”:确保原先所有指向 /opt/local/lib/*.dylib转为指向 @loader_path/../Frameworks/*.dylib
    
    如果执行步骤d,e时有问题,可以直接从网上下载整理好的文件执行,地址为:http://people.csail.mit.edu/vgod/sikuli/sikuli-libs.zip
  • f.在步骤e-2中解压好sikuli-script.jar文件夹中,找到“/sikuli-script/Lib”文件夹,将整个Lib文件夹拷贝至/work/RobotSikuli目录下;然后再将未解压的sikuli-script.jar包也拷贝到/work/RobotSikuli目录中
  • g.下载patch http://people.csail.mit.edu/vgod/sikuli/sikuli-mod.patch ,并该下载好的文件放在/work/RobotSikuli/Lib/sikuli目录中,然后在终端中执行如下动作
1. cd到/work/RobotSikuli/Lib/sikuli目录下
2. patch < sikuli-mod.patch
这个patch是给相同目录下的Screen.py及Sikuli.py打patch

Note: 但我不知道为什么要这么做,我根据上述步骤执行时提示“hunks failed”,但是后来验证该步并没有影响后续的动作
  • h. /work/RobotSikuli/中新建一个名称为test_suites的文件夹,在这个文件中放置写好的sikuli脚本,附件中有一个已经写好的sikuli脚本可以下载下来备用(Calc1.sikuli.zip(58.9 KB)

  • i. /work/RobotSikuli/中新建一个名称为my_lib的文件夹,把附件中文件“Calc.py”拷贝该文件夹中,现在我们来看一下目前RobotSikuli文件夹结构

  • j. 打开终端,先跳转至/work/RobotSikuli/目录下,然后执行如下语句:java -d32 -Dpython.path=Lib -jar sikuli-script.jar Calc1.sikuli, 执行完成后,可以查看结果,这样就验证了Sikuli确实可以在命令行的情况执行脚本
(3)将Sikuli脚本转换成Robot Framework可识别的libraries
  • a. 根据Robot中说明,引用自定义的libraries时最简单的办法就是直接将一个module(in Python)或class(in Jython)映射成Robot中的"keywords name(相当于类)", 参考放在mylib中的sikuli脚本的.py文件,其就相当于是一个module了,可以直接当作test libraries被调用。
  • b. 接下来我们要做的就是通过Robot驱动Sikuli的脚本运行,我们需要做的就是在使用Robot的格式想一个全新的脚本,脚本中所用的keywords可以直接引用.py文件中的方法名;Robot脚本参见附件robot_calc1.txt(259 B )

(4)执行脚本:根据1中所介绍的原理,我们通过jybot这个工具执行Robot脚本,执行过程如下:

1.打开终端,切换至/work/RobotSikuli目录下
2.export CLASSPATH=sikuli-script.jar
3.jybot --pythonpath=myLib:Lib  test_suites/robot_calc1.txt



(5)运行结果第2个case应该执行失败的,且查看log详细日志时,它的提示是“INFO FAIL:Actual result '4' is not equal to expected result '5'”,但在Report的状态栏显示的是PASS;后来想一下,这个提示只是在INFO中,RobotFramework并不知道没有办法知道INFO是通过还是失败。
          请公司的架构帮忙看了一下RobotFramework的代码,原来RobotFramework生成test report的机制是通过捕获异常来判断是否成功还是失败,在他的建议下,把原来写的sikuli(/myLib/Calc1.py)的脚本做了修正, 修改内容如下:将原有脚本中的print改为raise exception

原来的脚本:

    def verifyResult(self, *args):
        expected_result = str(eval(''.join(args)))
        actual_result = self.getResultFromClipboard()
        #verification
        if actual_result == expected_result:
            print("PASS: Action performed correctly and result equals %s" % expected_result) 
        else:
            print AssertionError("FAIL: Actual result '%s' is not equal to expected result '%s'" % (actual_result, expected_result))

现在的脚本:

    def verifyResult(self, *args):
        expected_result = str(eval(''.join(args)))
        actual_result = self.getResultFromClipboard()
        #verification
        if actual_result == expected_result:
            raise AssertionError("PASS: Action performed correctly and result equals %s" % expected_result) 
        else:
            raise AssertionError AssertionError("FAIL: Actual result '%s' is not equal to expected result '%s'" % (actual_result, expected_result))

     至此, Sikuli与RobotFramework的集成全部搞定,附上生成的报告



序:感叹啊,高手就是高手,人家只用了几个小时就把RobotFramework的代码及机制全搞清楚了,很快就能定位问题所在,这就是差距啊,我什么时候才能达到这种水平呢?

TAG: RobotFramework Robotframework Sikui 集成

 

评分:0

我来说两句

Open Toolbar