读书人

RFS的web自动抽验收测试第13讲 分

发布时间: 2013-01-28 11:49:56 作者: rapoo

RFS的web自动化验收测试——第13讲 分支与循环的用法

引言:什么是RFS——RobotFramework+Selenium2library,本系列主要介绍web自动化验收测试方面。

@齐涛-道长 新浪微博)

抱歉让大家久等了,这一讲我们重点来介绍分支与循环的用法,其实这2个不是Selenium2Library里的,是RF自带的。

一、分支

在Robotframework2.7.4之前的版本,我们要想写IF比较容易,可以直接使用Run keyword if 就行了,但是如果想写ELSE IF和ELSE,就不是那么方便了,以前的版本想写判断分支就必须要再写一个Run keyword if ,然后写不同的条件。

好在2.7.4的版本开始新增了这个判断分支结构的扩展,也就是在Run keyword if的语句基础上,集成了ELSE IF和ELSE进来。

1、简单分支

分支的结构如下:

Run keyword if 条件1 do action1

... ELSE IF 条件2 do action2

<... ELSE IF 条件X do action X >

... ELSE do action N

先写个例子好了,这也是参考更新文档里的例子。

RFS的web自动抽验收测试——第13讲 分支与循环的用法

其中ELSE IF和ELSE前面的3个点是必须点的,否则无法识别的。

下面把第一行的${a}的值改成0,然后运行一下看看

RFS的web自动抽验收测试——第13讲 分支与循环的用法

大家可以自己修改${a}和${b}的变量值,来验证一下这个分支判断是否正确,结果我就不展示了。

上面给的结构只是一个标准的结构,你可以根据自己的需要进行改造。

比如中间的ELSE IF是可以有多个的,写多一些就有点像CASE分支了

RFS的web自动抽验收测试——第13讲 分支与循环的用法

你可以只写个ELSE IF,或者只写ELSE,看你的需要。

如果只有ELSE的话,也可以写到一行,如下图(截图截不下了,后面看不到的是2)

RFS的web自动抽验收测试——第13讲 分支与循环的用法

2、复杂分支

上面这些都是结构比较简单的,你也可以写出复杂结构的判断分支。

RFS的web自动抽验收测试——第13讲 分支与循环的用法

因为表格展示的太多列了,截图不方便,直接截图源代码了。

需要说明的是在第二个ELSE IF中又加了一个Run keyword if ,在最后ELSE里也加了一个Run keyword if 带ELSE的(源代码把log 8换行了,实际他们在一行里)

经过我的实验,在ELSE IF里只能加Run keyword if ,后面不能带ELSE,带了也没用。

而在ELSE里可以再加Run keyword if 同时带个ELSE。

好吧,不知道你们看懂了没用,这种复杂结构确实很难阅读,没有特别必要还是都写成标准的结构就好了,复杂的结构肯定可以整理成多个ELSE IF的或者整合一下条件,那样看起来也清晰很多。

我试着整合了一下上面的分支,看起来清晰了很多。

RFS的web自动抽验收测试——第13讲 分支与循环的用法

当然,我这只是个例子,我觉得我整合后的代码和原意稍有区别,主要在${b}<=7那里,好吧,怪我前面写的太复杂了。

如果你确实要写这么复杂,那就复杂的写吧,或许在document里写清楚你的判断逻辑,这样别人也会容易看懂些。

3、condition条件

基本上分支说的差不多了,我还想补充说一下condition的写法,大家也可以自己按F5查看,在Run keyword if 的帮助里提到:

Runs the given keyword with the given arguments, if `condition` is true.
The given `condition` is evaluated similarly as with `Should Be True` keyword, and `name` and `*args` have same semantics as with `Run Keyword`.

他的condition会进行evaluated类似于Should Be True这个关键字,那么我们继续看一下这个关键字的帮助:

If `condition` is a string (e.g. '${rc} < 10'), it is evaluated as a Python expression using the built-in 'eval' function and the keyword status is decided based on the result. If a non-string item is given, the status is got directly from its truth value as explained at http://docs.python.org/lib/truth.html.

实际上condition会用python语法进行判断,相当于执行了evaluate(下一讲会讲到)。那么具体的可以在http://docs.python.org/lib/truth.html.查到。

常用的贴几个:

OperationResultNotesOperationMeaningNotes

IN RANGE主要是用一个整数序列做循环的计数器,如图的IN RANGE 10,运行时就是从0到9,如果写IN RANGE 1 10,那就是从1-9。

需要注意的就是RANGE里不会执行到最后那个数字,也就是10是不执行的,到9就结束了。如果你想执行到10,那就写IN RANGE 11。

如果IN RANGE后面只写一个数字N,那么就是从0到N-1的整数序列。

当然既然是序列也可以加step步进,即序列的间隔。如果要加step,就必须把起始和结束的数字都写上,然后在后面写上step,可以是正数也可以是负数,如下图就是一个负数step的例子:

RFS的web自动抽验收测试——第13讲 分支与循环的用法

2、IN:

RFS的web自动抽验收测试——第13讲 分支与循环的用法

IN的用法就比较自由了,你可以把IN后面的内容理解为一个LIST变量的全部元素,这个循环相当于遍历每个元素。这里的元素可以是字符串,也可以是数值,随意。

所以你可以像我那样把元素直接写出来,也可以直接放一个@{}的LIST变量。比如下面这样:

RFS的web自动抽验收测试——第13讲 分支与循环的用法

运行结果如下:

RFS的web自动抽验收测试——第13讲 分支与循环的用法

具体使用IN还是IN RANGE看具体需要,我只提供例子,大家自行选择具体方法。

比如你写IN 1 2 3 4 5 6 7 8 9 就不如直接用IN RANGE 1 10,效果都一样,像我这样的懒人肯定愿意用后者。

3、双重循环

以前写vbs的FOR循环可以这样写:

FOR i=1 to 10

FOR J=1 to 8

do something

next J

next i

但是目前RF这里的FOR循环无法直接支持这样做,只能间接的做。

首先另外新增一个user keyword,比如我下面这个forJ

RFS的web自动抽验收测试——第13讲 分支与循环的用法

然后在前面那个for循环里调用这个forJ,这样就实现出了上面那种效果了。

RFS的web自动抽验收测试——第13讲 分支与循环的用法

运行结果,太长了,只贴最后的部分吧。

RFS的web自动抽验收测试——第13讲 分支与循环的用法

如果要在forJ里使用变量${i}的值,可以把forJ加上一个入参,把${i}传过去就好了,这个大家自己去做一下吧。

这一讲就结束了,欢迎提问,下一讲计划介绍evaluate这个方法,这个方法很不错,弥补了一部分RF的短板。