(12)Robot Framework的Scalar变量$和List变量@
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(12)Robot Framework的Scalar变量$和List变量@相关的知识,希望对你有一定的参考价值。
参考技术A 变量的声明、赋值及其使用
List Variables-List变量及其用法
每个变量都可以用 变量标识符变量名 来进行表示,变量标识符在之前用户关键字的地方介绍了一下,Scalar变量用 $ 作为标识符,List型变量用 @ 作为标识符,不过这只能作为一个初步的区分,使用 $ 的变量,实际上也可以在接收List值后转化成List变量。转化的内容会在List变量里介绍。
其实这里没有什么特别的变量声明,因为RF底层是Python,所以他的语法也有些类似,变量不需要特定声明,只要有初始化赋值即可使用。
如果硬要说有声明,那可以把我们在TestSuite下面手动添加的变量理解为声明吧。比如我们可以在TestSuite上点右键或者在Edit区点Add Scalar或Add List来新增变量。
实际上也可以看做另一种形式的变量赋值,一般相当于使用Set Variable进行初始化赋值。
可以Import需要用到得Library
赋值也是有几种的,根据自己的需求进行处理吧。
通常这种方式主要使用Set Variable或类似的使用了Set的关键字对变量进行赋值。例如:
主要用于返回值上,包括系统关键字的返回值和用户关键字的返回值(从广义上说,Set那个也是返回值),例如:
之前的用户关键字里也有很多例子。
详见 流程与数据分离最后一篇 ,使用小v 的argument。
特别注意:如果一个变量没有经过赋值,使用时会报错的。
通常情况下,每个变量默认都是局部变量。
一个case里的变量,作用域在这个case内部;
一个userkeyword里的变量,作用域在这个userkeyword内部;
一个文件型suite里的变量,作用域在这个suite内部,所有下面的case也都可以使用。
一个目录型suite里的变量,作用域在这个目录内,他下面的文件型suite是无法使用的,所以一般在目录下新增变量没有太大意义。
作用域是可以修改的,即通过一些系统关键字,对变量进行作用域的设定,常用的关键字有:
Set Global Variable ——设定全局级变量
Set Suite Variable ——设定suite级变量
Set Test Variable ——设定case级变量
其实使用变量我觉得不需要说太多了,变量的赋值可以看一下用户关键字的返回值部分,里面的单个返回值和多个返回值其实就是给单个变量赋值和多个变量赋值的例子了。
这里再列几种之前没有写过的例子吧。
例如这样写,在第二行的判断中可以直接写判断条件,现在的条件成立,于是运行结果如下:
如果想把变量作为一个字符串的一部分,可以直接这样写
运行结果如下:
实际上默认情况下RF里的变量都是字符型的,并且两个字符串连接不要加什么符号,直接连起来就行了。
如果你写成aaa+$textbbb,最终结果就是aaa+8866bbb,他会把你写的任何内容都当作字符串的。
看了上面的例子之后,可能有人说我想用123作为数值进行计算该怎么用。
这里要用到一个关键字Evaluate。先看个例子:
运行结果如下:
他的作用是可以让你加载Python的一些库,依赖于Python的语法,相当于直接运行对应的Python语句得到结果。
像上面的例子没有加载库,因为加减乘除这些是Python基本库就有的。下面放一个加载Python库的,如下图,他加载了random和sys两个库,并使用相应的语句生成一个随机数。
运行结果:
具体可以参考一下RF的userguide文档中BuiltIn部分。
介绍List Variables-List变量及其用法。
在我们前面几篇文章里用到了很多List变量,相信以后各位也会碰到需要使用的地方。
和Scalar类似的赋值,除了用Set Variable还可以用Create List。
运行一下:
在使用上要注意看关键字的参数到底是Scalar的还是List,区别就是看变量名前面是否有 ***** (星号),如图:
这个关键字:
name就是支持传入Scalar型的参数
args就是支持可以传入List型值的 。
所谓List型值其实是说支持多个值,即不确定个数的,List-like一样的值,如下图的2、3行:
运行一下:
当然,并不是说没有星号的就不能用List的,只要是多个变量就可以用List传值。
像Log这个关键字,他有2个Scalar型的传入参数,如果我想传List也是可以的,但是必须是一个有2个元素的List,因为Log的第二个参数有默认值,所以如果你传入1个元素的List也是可以的,但是如果传入3个元素的List,那么就会报错了。
运行结果:
你可以写成上面这样,但是我并不推荐这种做法,这里只是为了讲解List的作用而做的示范。
综上,对于有多个参数的关键字,你可以按照需要传入多个Scalar变量,也可以传入List变量,根据你自己的需要选择合适的方式。
之前提过了 Scalar变量 用 $ 作为标识符, List型变量 用 @ 作为标识符,而且他们是可以进行转换的,理论上可以互相进行转换,但是也有一点限制。
这种转换的效果是把整个List变成一个Scalar,我觉得作用主要是对于那些只接收Scalar变量参数的关键字,而你又想传List的全部值的时候,或者其他你需要的把List当作Scalar的情况下使用。
例如Fail关键字,他的msg这个参数只能接收Scalar变量。
如果你想用Fail,把f这个变量的值都打出来,下面这样写是肯定会报错的。
报错信息为 Keyword \'BuiltIn.Fail\' expected 0 to 1 arguments, got 3.
那么我们转换一下,这样写就不报错了。
运行结果:
其实以前介绍用户关键字的时候也演示过,对于返回值是List的关键字,如果你给要赋值的变量写的是Scalar的,他会自动把他变成List的。
还是上面这个例子,我们把@f改成$f
这样也是OK的。
【Question】这里没懂如何就成功发生转换了。
但是,转换是有一点限制的。
首先,变量要进行赋值(类似于初始化)之后才能使用,如果没有进行过赋值的RIDE里会有颜色提示,用一个前面的图
图中的紫色$f就是提示你他没有进行过赋值,此时而系统会默认他就是@f的Scalar形式,这个可以看上面的执行结果。
那么这个限制就在Scalar转换成List的地方,系统会默认$f是@f的Scalar形式,但是他并不会默认@f是$f的list形式,即使$f已经是list了。
看一下例子:
这样写的话运行就会报错:Non-existing variable \'@f\' .
那这时候$f有什么用呢?除了前面介绍的作为Scalar型变量,值是所有元素,还可以根据index直接获得某个元素。
例如:
运行结果:
看完上面的限制之后,还要补充一点,系统会默认$f是@f的Scalar形式,这个也是有限制,必须是$f没有被赋值过的情况,如果$f被赋值过是什么情况呢?
看看例子:
你觉得$f会是什么值呢?
【Question】这里跟教程的截图,返回结果不一致了。有点蒙,理解还没到位。
下面是教程给出的答案:
一个重要的影响就是会导致下面的List元素获取出现越界的情况。
List元素的获取只有一种方式,无论是一维List还是二维List,都是用$变量名[index],就是用$的变量,在变量名后面加上方括号,里面是序号。
运行:
运行结果:
如果log后面只写$f[1],那么得到的结果如图:
参考文章给出的运行结果:
总之,就是用方括号来表明你需要的元素,如果是多维List,要想清楚你到底要哪层的,不要写少了或者写多了。
【Question】这运行结果不一致,真是令人困扰。。。
以上是关于(12)Robot Framework的Scalar变量$和List变量@的主要内容,如果未能解决你的问题,请参考以下文章
使用 Robot Framework 在 PyCharm 上运行测试
Notepad++函数列表的Robot Framework解析