rf调用的python函数报错_Robot Framework(15)- 扩展关键字
如果你还想从头学起Robot Framework,可以看看这个系列的文章哦!
前言
什么是扩展关键字?就是你自己写的 Python 文件,里面包含了函数或者类
然后 RF 导入这个 Python 模块,就可以调用函数或者类方法,它们就是扩展关键字
Python 模块作为测试库
模块文件名作为测试库的名字
比如:Python 模块名叫 MyLibrary,文件名是 MyLibrary.py,那么测试库的名字就叫做 MyLibrary
Python 模块和 Robot 文件同目录下的栗子
这是目录结构哈
python 模块的代码
defreturnlist():return [i for i in range(10)]defreturn_dict():return {"a": "hahhahahaahah"}#以下划线开头的函数不能作为RF关键字
def_returnlist2():return [1, 2]
robot 代码
进入test目录下,运行以下命令
robot -P . test.robot
执行结果
知识点
_前缀的方法不会作为关键字,在Python里面, _ 开头的方法是私有方法,RF 不会识别到它
Python 方法作为关键字也是大小写不敏感的
RF 中会把关键字的 _ 和单个空格忽略掉,所以 returndict、return dict、return_dict 都是调用同一个关键字
Python 类作为测试库的栗子
项目目录
所有 Python 测试代码都在 tlib2.py 里面哦
最终运行是在【15_扩展关键字】目录下运行的,命令如下
robot -P . testrf
栗子一:类初始化不需要传参
python 代码
classSubLibrary:def __init__(self):pass
defreturnint(self):return 2020
def_returnint2(self):return 4
robot 代码
测试结果
知识点
在类里面, _ 前缀的方法不会当做关键字
同样,类中声明的方法当做关键字的话,大小写不敏感
栗子二:类初始化需要传参
python 代码
from robot.api importloggerclassSubLibrary2:def __init__(self, host, port, table='test'):
self.host=host
self.port=port
self.table=tabledefprintaddr2(self):
logger.console('host:%s,port:%s,table:%s' % (self.host, self.port, self.table))
robot 代码
测试结果
知识点
如果类的 __init__ 初始化方法需要传参,则在导入库后面跟对应的参数列表
拓展 Python 知识点:先有类对象,还是先执行类初始化方法?
__new__ 方法产生对象
__init__ 对象的初始化方法
先 new 一个对象,再 init 一个对象
栗子三:类名和模块名相同
python 代码
from robot.api importloggerclasstlib2:def __init__(self, host, port):
self.host=host
self.port=portdefprintaddr(self):
logger.console('host:%s,port:%s' % (self.host, self.port))
robot 代码
测试结果
知识点
如果类名和模块名相同,可以不用导入类名
栗子四:使用路径法导入 Python 模块
Python 代码用的还是栗子三的
robot 代码
测试结果
知识点
如果用路径法,需要注意导入 Python 模块需要有文件后缀哦,且用 / 来表示目录下
重点:使用路径法,只能导入和模块名相同的类名!
Python 扩展库的搜索规则
统一的规则
先根据 robot 文件自身当前目录下查找库文件
如果没有找到则再根据 --pythonpath 和 -P 提供的搜索路径进行搜索
最后找 Python 安装的路径
Python 库引入了其他模块
背景
当 robot 文件导入的 Python 测试库引入了其他模块时,应该怎么写导入路径?
正确写法
确保导入的模块路径和RF导入的模块起始路径统一
看栗子
testother.robot 导入 test.py 模块, test.py 模块引入了 login.py 模块的方法
目录结构
login.py 代码
from robot.api importloggerdeflogin_test():
logger.console('test login')
test.py 代码
from pylib.login importlogin_test#from login import login_test 报错
deftest():
login_test()
robot 的代码
在 othertest 目录下运行下面命令
robot -P . testother.robot
测试结果
结论
可以看到 robot 文件引入的路径是 pylib 开头, test 模块引入 login 模块的路径也是 pylib 开头
如果路径是 login 开头导入,那么运行robot文件将会报错(如下图,包含了解析错误)
Python 库中的 class 存在继承
背景
当 robot 文件导入 Python 测试库的类继承了另一个类,应该怎么写导入路径?
正确写法
确保导入的模块路径和RF导入的模块起始路径统一
使用的时候 RF 文件只需导入子类即可
看栗子
test.robot 引入了 other.py 模块下的 Child 类,而 Child 类继承了 Base.py 模块下的 Father 类
目录结构
base.py 的代码
from robot.libraries.BuiltIn importloggerclassFather:def __init__(self):
logger.console('init Father')defmoney(self):return '$10000'
other.py 的代码
from robot.api importloggerfrom pylib.Base importFatherclassChild(Father):def __init__(self):
Father.__init__(self)
logger.console('init Child')defuse_money(self):returnself.money()defmake_money(self):return '$9999'
robot 的代码
在 testClass 目录下运行下面命令
robot -P . test.robot
测试结果
文章来源: www.cnblogs.com,作者:小菠萝测试笔记,版权归原作者所有,如需转载,请联系作者。
原文链接:https://www.cnblogs.com/poloyy/p/12989402.html
rf调用的python函数报错_Robot Framework(15)- 扩展关键字相关推荐
- 在flask中同步调用celery.task函数报错分析
问题介绍 为方便理解,简单说明一下项目,项目中使用的依赖模块有:flask,flask-sqlalchemy,flask-celery等等. 在同步方式调用task函数的时候出现了DetachedIn ...
- ios .mm文件调用c语言函数报错,深入浅出 iOS 编译
前言 两年前曾经写过一篇关于编译的文章<iOS编译过程的原理和应用>,这篇文章介绍了iOS编译相关基础知识和简单应用,但也很有多问题都没有解释清楚: Clang和LLVM究竟是什么 源文件 ...
- 安装python37路径报错_Robot framework安装python3.7导入HttpLibrary.HTTP报错
报错信息: 20200106 18:23:28.178 [WARN]: Importing test library "HttpLibrary.HTTP" failed Trace ...
- python 函数报错TypeError: object of type 'int' has no len()
函数源码 _times = 0 def hannuota(nlist,mfrom,mpass,mto):global _timesn=len(nlist)#n=nlist._length_if n== ...
- 关于vs2010调用python中Py_Initialize函数报错的原因
程序刚开始运行到Py_Initialize()函数,报错:ImportError: No module named site 如遇到这个函数报错那么基本上就是你没有将相关路径添加到环境变量中. 两个方 ...
- python def函数报错详解_python自定义函数def的应用详解
这篇文章主要介绍了python自定义函数def的应用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 这里是三岁,来和大家唠唠 ...
- python3中调用map函数报错map object at 0x000001EF004D97B8
python3中调用map函数报错<map object at 0x000001EF004D97B8> 在python中这样的一段代码报错: a=map(int,input().split ...
- 2021-06-10 工作笔记 ng-change不能触发的解决方法+wui-date日期选择器使用onchange调用函数报错
当通过JavaScript来修改ng-model的值,ng-change不能触发 <input type="number" ng-model="testNumber ...
- RF踩坑之调用pyautogui鼠标操作报错
因为要用到拖拽页面元素,但是robotframework 自带的drag and drop方法无法运行但不报错. 百度说是selenium 的darg and drop 不支持html5. 只能自己调 ...
最新文章
- STM32 电机教程 25 - ST MCLIB实战之开环svpwm控制
- Enum枚举类|注解Annotation
- android文件系统挂载过程,有线挂载Android4.2文件系统
- Python中random模块生成随机数详解
- python 知乎接口_ZhihuVAPI 是一个可以让你以一种优雅的形式调用知乎数据的 Python 包....
- SURF特征提取(使用matlab自带函数)
- html登陆滑动验证,JavaScript实现登录滑块验证
- STM32F427V系列的触摸屏驱动
- egret 里面设置MovieClip的scale缩放值时,没有效果的情况
- 数据库-数据模型(分类、三要素、概念)
- 接入网、承载网、核心网是什么,交换机路由器是什么、这个和网络的协议有什么关系呢?
- 文曲星猜数字游戏java代码_急求一份完整的文曲星上的猜数字游戏的课程设计...
- 计算机装系统找不到硬盘,电脑重装系统找不到硬盘驱动器怎么办?
- linux--Repo的介绍与安装
- 算法设计 - 01背包问题
- 快衰落,慢衰落,大尺度衰落,小尺度衰落的关系
- 物联1131.1132博客链接
- 网页设计中的色彩心理学
- 浅谈我对元宇宙、Web3、区块链与NFT的理解
- 沧海一声笑的人生态度
热门文章
- java读取配置文件properties
- springboot _全局异常@RestControllerAdvice@ExceptionHandler
- leetcode 138. Copy List with Random Pointer | 138. 复制带随机指针的链表(复杂链表的复制)
- 【SpringMVC】SpringMVC 对 Date 类型转换
- ES9的新特性:异步遍历Async iteration
- 使用Tomcat Native提升Tomcat IO效率
- 理解MySQL——架构与概念
- 为什么操作系统会有随机性
- 2pc_two phase commit详情
- 04.search_template