python调用rf关键字_RobotFramework之Python调用RF关键字

本文介绍了如何在Python中调用RobotFramework的关键字。首先,简单粗暴的方法是通过编写测试用例并用Python执行,但这存在一些不便。然后,文章详细讲解了一种更优雅的实现方式,通过Python直接调用并执行RF关键字,具体实现涉及对RobotFramework源代码的理解,包括TestSuiteBuilder和ResourceFile类的使用。在实际操作中,还需注意关键字编码问题,确保能正确识别中文关键字。
摘要由CSDN通过智能技术生成

背景

这个需求说实话是有那么些奇葩,因为正常的框架不会用到这个需求,要么就纯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的文件引用都是要用Resource来引用的,不能原样照搬。所以这里我们要去看它的源代码来实现:

robot.running.model.py

class ResourceFile(object):

def __init__(self, doc='', source=None):

self.doc = doc

self.source = source

self.imports = []

self.keywords = []

self.variables = []

@setter

def imports(self, imports):

return model.Imports(self.source, imports)

@setter

def keywords(self, keywords):

return model.ItemList(UserKeyword, items=keywords)

@setter

def variables(self, variables):

return model.ItemList(Variable, {'source': self.source}, items=variables)

从这里我们能看到,imports是由一个装饰器@setter来处理的,那么只要跟进它的方法就能看到:

robot.model.imports.py

class Imports(ItemList):

def __init__(self, source, imports=None):

ItemList.__init__(self, Import, {'source': source}, items=imports)

def library(self, name, args=(), alias=None):

self.create('Library', name, args, alias)

def resource(self, path):

self.create('Resource', path)

def variables(self, path, args=()):

self.create('Variables', path, args)

这里就告诉了我们,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'获取随机数')

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
robotframework调⽤python类⽅法_(五)RobotFramework基 础。。。 上⼀⼩节,你已经感受到了 Robot Framework 的基本说法,这⼀⼩节你将会看到 Robot Framework 更多强⼤的⽤法。 if 语句 通过 "run keyword if" 关键字可以编写 if 分⽀语句。 *** Test Cases *** test case8 ${a} Set variable 59 run keyword if ${a}>=90 log 优秀 ... ELSE IF ${a}>=70 log 良好 ... ELSE IF ${a}>=60 log 及格 ... ELSE log 不及格 ⾸先定义变量 a 等于 59 。 If 判断 a ⼤于等于 90 ,满⾜条件 log 输出 "优秀 "; 不满⾜上⾯的条件,接着 else if 判断 a ⼤于等于 70 ,满⾜条件 log 输出 "良好"; 不满⾜上⾯的条件,接着 else if 判断 a ⼤于等于 60 ,满⾜条件 log 输出 "及格"; 上⾯的条件都不满⾜,else log 输出"不及格"。 注意 sele if 和 else 前⾯的三个点点点(...) for 循环 在 Robot Framework 中编写循环通过 ":FOR" 。 1、循环 0~9 。 *** Test Cases *** test case9 :FOR ${i} IN RANGE 10 \ log ${i} 通过":FOR"定义 for 循环;IN RANGE ⽤于指定循环的范围。 2、遍历列表。 *** Test Cases *** test case10 @{abc} create list a b c : FOR ${i} IN @{abc} \ log ${i} "create list" 关键字⽤来定义列表(a,b,c),"@{}"⽤来存放列表。通过过 ":FOR" 循环来来遍历@{abc}列表中的字符。 强⼤的 Evaluate 为什么说"Evauate"关键字强⼤呢。因为通过它可以使⽤ Python 语⾔中所提供的⽅法。 1、 ⽣成随即数 在 Python 中我们可以这样来引和并使⽤⽅法: C:\Users\fnngj> python Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import random >>> random.randint(1000, 9999) 9777 random 模块的 randint()⽅法⽤于获取随机数。 在 Robot Framework 中使⽤ "Evauate" 也可以调⽤ Python 所提供的 random 模块下的 randint()⽅法。 *** Test Cases *** test case11 ${d} Evaluate random.randint(1000, 9999) random log ${d} 2、 调⽤⾃⼰编写的 Python 程序 ⾸先创建 D:/rf_test/count.py ⽂件。 def add(a,b): return a + b if __name__ == "__main__": a = add(4,5) print(a) 通过add函数实现两个数相加,这是再简单不过的⼩程序了。 下⾯就通过 Robot Framework 调⽤ count.py ⽂件中的 add()函数。 *** Test Cases *** test case12 Import Library D:/rf_test/count.py ${a} Evaluate int(4) ${b} Evaluate int(5) ${add} add ${a} ${b} log ${add} 在 Robot Framework 中所有的内容都是字符串类型,所以,需要通过 "Evaluate" 将 4 和 5 转化为 int 类型后,再调⽤ add 计算两个 数的和。 注释 Robot Framework 中添加注释也⾮常简单。"Comment" 关键字⽤于设置脚本中的注释。除此之外,你也可以像 Python ⼀样使 ⽤"#"号进⾏注释。 *** Test Cases *** test case13 Comment 这是注释 #这也是注释 如果你熟悉 Python 编程语⾔,那么 Robot Framework ⼏乎没有实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值