51Testing软件测试论坛

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

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 3066|回复: 0
打印 上一主题 下一主题

RobotFramework之Python调用RF关键字

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2018-6-21 13:42:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这个需求说实话是有那么些奇葩,因为正常的框架不会用到这个需求,要么就纯Python来实现,要么
就纯RobotFramework来实现,用RobotFramework的时候是可以正常调用Python的,但是反过来就有
点蛋疼了。

我们现在的框架就是基于RobotFramework实现的,但是由于RobotFramework在某些地方的扩展性太
低,某些时候用Python来实现更为高效,不过现有的RobotFramework工程已经有非常多的沉淀了,
要是把这部分全部重写,工作量太大了,因此就有了这么个奇葩的需求。在网上搜索了大半天后,终
于还是放弃了,只能自己去看源代码来实现了。

简单粗暴的实现

有一种非常简单粗暴的实现方式,用RobotFramework写一个测试用例,然后这个用例调用对应的关键
字,再用Python来执行这条用例,就实现了调用关键字的功能,但是这样有两个弊端。

每次调用关键字都要写测试用例,非常麻烦
如果要获取返回值,就很蛋疼了
更为优雅的实现

整个部分实现起来其实不难,只不过RobotFramework的源代码没有什么人去解读,也没有很好的翻译
文档,其实在之前的解析文章中用到的robot.api中就已经涉及到这个点了,实现代码如下:

class RobotAbout(object):
    """
    调用RobotFramework的方法
    eg:
    ra = RobotAbout.RobotAbout()
    ra.exec_keywords('xxx.robot', ['获取随机数', '获取计数'])
    """

    def exec_keyword(self, path_to_file, keyword, arg=None):
        """
        执行RobotFramework的关键字
        :param path_to_file: String,RobotFramework文件的路径,一般是执行文件的相对路径,绝对路
径也可以
        :param keyword: String,执行的关键字
        :param arg: List[String], 执行关键字的参数,如果没有则不传
        :return: None, 没有返回则表示执行通过,可以查看执行文件目录下的log.html来定位问题
        """
        suite = TestSuite('Test')
        suite.resource.imports.resource(path_to_file)
        test = suite.tests.create('TEST', tags=['smoke'])
        if arg:
            if isinstance(arg, list):
                test.keywords.create(keyword.decode('utf-8'), args=arg)
            else:
                raise TypeError('args must be list')
        else:
            test.keywords.create(keyword.decode('utf-8'))
        result = suite.run(critical='smoke')
        if result.suite.status == 'PASS':
            pass
        else:
            ResultWriter('test.xml').write_results()
给我灵感的页面就在官方的说明文档上,这里有一段非常有意思的说明:


这里提供了两种方式执行RobotFramework,一种是用TestSuiteBuilder,这种其实跟我们之前的方法没
啥区别,都是执行一个测试用例,第二种方法则是用Python来写一个RobotFramework的测试用例,这
种思路可以通过抽象成一个类,就可以达到优雅的执行RobotFramework的关键字了。

需要注意,官方文档写的是suite.resource.imports.library,而RobotFramework的文件引用都是要用R
esource来引用的,不能原样照搬。所以这里我们要去看它的源代码来实现:

  1. <p>robot.running.model.py</p><p>
  2. </p><p>class ResourceFile(object):</p><p>
  3. </p><p>    def __init__(self, doc='', source=None):</p><p>        self.doc = doc</p><p>        self.source = source</p><p>        self.imports = []</p><p>        self.keywords = []</p><p>        self.variables = []</p><p>
  4. </p><p>    @setter</p><p>    def imports(self, imports):</p><p>        return model.Imports(self.source, imports)</p><p>
  5. </p><p>    @setter</p><p>    def keywords(self, keywords):</p><p>        return model.ItemList(UserKeyword, items=keywords)</p><p>
  6. </p><p>    @setter</p><p>    def variables(self, variables):</p><p>        return model.ItemList(Variable, {'source': self.source}, items=variables)</p><p>从这里我们能看到,imports是由一个装饰器@setter来处理的,那么只要跟进它的方法就能看到:</p><p>
  7. </p><p>robot.model.imports.py</p><p>
  8. </p><p>class Imports(ItemList):</p><p>
  9. </p><p>    def __init__(self, source, imports=None):</p><p>        ItemList.__init__(self, Import, {'source': source}, items=imports)</p><p>
  10. </p><p>    def library(self, name, args=(), alias=None):</p><p>        self.create('Library', name, args, alias)</p><p>
  11. </p><p>    def resource(self, path):</p><p>        self.create('Resource', path)</p><p>
  12. </p><p>    def variables(self, path, args=()):</p><p>        self.create('Variables', path, args)</p>
复制代码

这里就告诉了我们,import这个列表中可以放library,resource和variables

因此在这里我们只要把源代码改成suite.resource.imports.resource(path_to_file)就可以正常的引用RobotFramework的关键字了。

其他注意点

在调试的过程中我发现一个问题,如果关键字用中文编写,那么必须要把调用的关键字编码成utf-8,
否则会报错找不到关键字。就像上面的代码这样处理:

test.keywords.create(keyword.decode('utf-8'), args=arg)
或者如果你不在方法中处理,也可以这样传入参数:

ra.exec_keyword('../xxx/xxx.robot', u'获取随机数')




本帖子中包含更多资源

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

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

本版积分规则

关闭

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

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

GMT+8, 2024-11-22 23:13 , Processed in 0.063054 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

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