上面的 RF、Selenium2library、IntelliBot插件 Run Robot Framework file 和 Run Robot Framework TestCase 都安装好后我们来看一个例子
*** Settings ***
Library SeleniumLibrary
*** Test Cases ***
百度搜索宋曲
Open Browser http://www.baidu.com chrome
Set Selenium Implicit Wait 5
Input Text id=kw 宋曲\n
${firstRet}= Get Text id=1
Should Contain ${firstRet} 宋曲
百度搜索宋曲,这段代码的意思是,打开了一个百度搜索的网址,设置了全局等待时间,然后搜索宋曲,之后取它的内容做一个检查。具体的细节先不用纠结,我们先大概看懂它做什么用的,后面会详细的讲解 Robot 的语法。
这里面有一点要注意的是,我们以前做 selenium 自动化的时候, Selenium 库它需要知道 Webdriver 程序的路径,都是我们在代码里面指定的路径。但是 Robot 里面,在导入测试用例的时候它是没有地方去指定这个路径的,这里我们有个办法解决。方法: 在我们环境变量里面添加 Chromdriver 的路径
test suite 和 testcase
测试套件,就是测试用例的集合。一般我们把功能相关的测试用例组合起来放在一起,成为某个测试套件,这个套件具体有多少用例要根据情况而定了,看看你的测试用例有多少功能相近或者是初始化条件一致的,大家把它放在一起。测试套件可以是一个目录也可以是一个文件。
我们把上面的代码执行一下,首先要切到这个目录。
刚才的测试用例就打开了一个百度搜索的网页,然后百度宋曲,然后去做了一些检查。我们看一下这里有一些执行的结果
接下来我们看一下它们做了哪些事情下面简单解释一下。首先我们这里有个测试用例叫 *** Test Cases ***
,这里面 ***
开头的我们称它为一种表,Robot 的数据文件中大体都是由表构成的,我们这里的文件就包含了两个表,一个是 Settings 表,一个是 Test Cases 表。从名字上看 Settings 做一些配置的设置一些东西, Test Cases 就是用例表。Robot 总共支持四种表,分别为:Settings, Variables, Test Cases, Keywords
表名必须出现在第一单元格中。表名大小写不敏感
Settings 表,是这个测试套件的 全局配置表。比如,说明这个测试套件要使用的测试库、资源文件,测试套件的环境初始化(setup)和清除(tear down),该套件内的标签等等。比如说 python 里面 import 跟这里面的 Library一样的。导入一个库,就像 python 里面 import 某个 selenium 的库类似这种,比如说这个测试套件要使用的库,我们就把它放进去。
Test Cases表,是用来定义这个测试套件的 测试用例的。比如说我们这个测试用例,这里有个顶头写的百度搜索宋曲这是我们测试用例的名字,接下来每一行都有黄色的我们刚称它为关键字。这个关键字它是我们编程语言里面对应函数的概念,它对应我们 python 里面的函数调用,它实现了一个基本的功能,所以我们运行用例的时候是不是打开了一个网页,就是执行了测试用例的第一行,然后设置全局等待时间,然后输入宋曲,然后取它的内容去做检查,这就是我们用例执行的基本过程,所以我们前面讲 Robot 的核心就是关键字,关键字它提供了我们自动化的一些能力集,所以我们经常说 Robot 是一个关键字驱动的一个测试框架。
Variables 表,就是这个测试套件的 全局变量表
Keywords表,是用来定义这个测试套件的,用户关键字的测试用例表里面的每个测试用例 大概可以分为 :配置部分 、主体部分,
用例配置部分:[Documentation]该用例的文字说明、[Tags]该用例的标签、[Setup], [Teardown]该用例的初始化和清除操作、[Template]声明该用例是模板关键字驱动的。本用例只包含测试数据、[Timeout]设置用例超时时间。
用例主体部分主要是由关键字组成的:
- 关键字的来源:测试库、资源文件、用例所在文件的关键字表。
- 用例主体部分也包含变量赋值
测试用例的主干
关键字
这里面测试用例部分除了第四行,其它每一行的第一列都是关键字(keyword)。RF 里面的关键字有我们可以看做是对应变成语言里面的函数的概念。关键字其实就是对应了 python 或者 java 里面的一个函数调用,实现一个基本的功能。所以运行用例的时候,上面的每行,Robot Framework 基本上就是执行了一个函数嗲用。后面列有内容的是这个关键字对应的参数,就像函数可能需要参数一样。RF 的核心就是关键字,关键字提供了自动化的能力集。所以我们也经常说 RF 是关键字驱动的测试框架。测试库
RF 有很多的关键字。不同的关键字由不同的测试库实现。比如上面的例子中,我们对浏览器进行操作的关键字,就是来自于 selenium2library 这个库。所以第一行代码就是申明了,我们要导入 selenium2library 这个库。实现关键字的库,按类型来分,基本可以分为 RF 标准库和扩展库。-
标准库
标准库是安装好 RF 后,就已经安装好的 python 库文件,一般放在 python 的 Lib\site-packages\robot\libraries 目录下面。RF 标准库,具体来说,是下面这些。- BuiltIn
- Collections
- Data Time
- Dialogs
- OperatingSystem
- Process
- Screenshot
- String
- TeInet
- Xml
这些标准库,根据名字就可以看出其不同的用途。比如 Dialogs 库,是提供了很多对话框给自动测试的过程中让 QA 来确定或者输入一些决定测试流程的信息用的。而 Datatime 库则是提供日期、时间相关的关键字给开发者使用的。
其中第一个标准库 BuitIn 又是标准库中很特别的一个。因为使用这个库提供的关键字,事先是不需要导入的,直接使用。而要使用其它的库里面的关键字,必须先导入,比如我们例子里面就是用 import Library 来导入的 selenium2library 库的。
- 扩展库
就像 python 语言虽然有丰富的内置库,但是我们要高效的开发各种各样的程序,必须能够自行开发扩展库,提供更多的功能。
RF 也是一样的,光是靠标准库,还远远不够。RF 可以让开发者自行开发扩展库。其实标准库和扩展库比起来,主要的区别就是没有 RF 内置,其开发方式和标准库并无不同。
由于 RF 在自动测试领域较为广泛的应用,RF 开源社区已经有一些比较优秀第三方扩展库,现在在 RF 官网已经给出,我们上例中的 Selenium2Library 就是其中之一。大家可以去这个网址去 查看其它的官方推荐扩展库
https://robotframework.org/#libraries。
如果以后有机会参与到比较大的 RF 自动化开发中去,肯定要针对具体项目的需求,自己开发扩展库,提供一批和公司测试系统相关的关键字,供开发自动化用例的QA 使用。如何自行开发扩展库,后面我们会介绍,下面我们先打开这个链接进入看一下。
点击 EXTERNAL。
就找到了 SeleniumLibrary 。
这个是 SeleniumLibrary 里面的 keyword documentation
大家可以点进去看一下。
之后再点击 Keywords。
这个文档里面就介绍了,里面有哪些 Keywords
我们可以看到有很多很多,后面再说怎么看这个文档,大家先知道,如果我不知道哪里有我们可以去文档查,我们现在看到的这个是网上的第三方的库selenium。相当于是别人写好的,我们可以自己去用的,如果我们要测试的这个场景没有第三方的库可以用,我们通常还可以自己去开发,这种也是我们大家在日后的工作中经常会做的,后面的章节有个案例测试一个教管系统,它没有现成的测试库,那我们就需要自己去开发用 python 作为程序,去开发测试库来提供函数作为我们测试库里面的关键字,这样 Robot 就可以使用我们 python 里面的关键字了。
测试用例的执行
第一种是我们不推荐的直接在 robot 文件里面右键的。因为可能会出现一些问题。所以不建议在 pycharm 里面运行。
第二种是切换到目录里面执行,这个是我们推荐的,后面我们运行程序都会通过这种方式。
大家看下它下面有三个文件 Output 输出文件,一个 Log,一个 Report。我们一般会看一下 Log 文件,大家只需要把它的路径拷贝一下放到浏览器里面直接打开,就可以看到我们 Test Cases 执行的日志,我们简单看一下这个日志。
最上面看到我们叫 T1 的 Test Log,这个 log 具体执行的内容在这个地方。
比如说我这个Test SUITE 叫 t1 大家看一下,我们测试套件文件叫做 testsuite 叫 t1。那我们 Log 名字就是 t1 test log。
然后它的 SUITE 名字叫 t1,下面的 Test ,一个 Test 对应一个测试用例,我们就叫百度搜索宋曲,可以看到上面 pycharm 里面的截图里面有一个百度搜索宋曲 是 Test cases 下面的测试用例,如果下面有两个的话,他就会有两个。比如这里我们添加一个百度搜索宋曲2。
*** Settings ***
Library SeleniumLibrary
*** Test Cases ***
百度搜索宋曲
Open Browser http://www.baidu.com chrome
Set Selenium Implicit Wait 5
Input Text id=kw 宋曲\n
${firstRet}= Get Text id=1
Should Contain ${firstRet} 宋曲
百度搜索宋曲2
Open Browser http://www.baidu.com chrome
Set Selenium Implicit Wait 5
Input Text id=kw 宋曲\n
${firstRet}= Get Text id=1
Should Contain ${firstRet} 宋曲
我们再执行一下,运行结果如图
我们把刚才的 Log 刷新一下。这里面就有两个 Test。
都在一个测试套件的文件里,里面有两个测试用例。这就是一个很漂亮的形式展示我们测试 Log。它上面还有一些统计。
比如说总共执行了2个测试用例,成功2个失败0个等等,花了多少时间,这里面都有很详细的记录。比如我们 Input Text 打印的一些 log 有一些具体的内容时间等等,打印的都非常好,格式很漂亮很完美,这个大家心里先有个概念,看看长什么样子。
用例文件语法
前面说过 Robot 是表格式的开发,有一些图形界面的开发工具,比如说 RIDE 它打开之后它是长这个样子的:
***Test Case*** |
|||
---|---|---|---|
百度搜索 |
|||
Import Library |
Selenium2Library | ||
Open Browser |
http://www.baidu.com | chrome | |
Set Selenium Implicit Wait |
5 | ||
Input Text |
id=kw | 宋曲\n | |
${firstRet}= | Get Text | id=1 | |
Should Contain |
${firstRet} | 宋曲 |
有人会说跟我们刚才讲的案例不一样。如果你把它每一行每一列都加上横竖线,其实它们长的是一样的。这是它文件的样式。
- RF 的测试套件文件使用一种纯文本的文件格式,纯文本文件扩展名可以是 .robot 或者 .txt,RF 官方推荐用 robot 。其实 RF 还支持其他的文件格式来记录测试用例,比如 html,tvs 都是可以的。 但是RF 官方推荐用 .robot pycharm 插件里面对 .robot 的支持比较好, .txt 有一些东西显示不是那么完美。所以大家以后还是使用 .robot 吧。
另外一个大家需要注意下的我们 pychrom 缺省的编码方式是 utf-8,在 pychrom 的右下角能看到。这样的话对中文的支持会比较好一点,大家如果这边不是的话需要改一下。
纯文本的格式
测试套件的文件都是由表组成的,就是已
***
开头的就是表的名字(一个*
或以上都可以,四五个也可以)但是建议大家写成三个。而且表的首字母都是大写的,其实它大小写是不敏感的,我们这里 Settings 和 Test Case 大写的原因,是因为我们的插件不大写就不能联想。所以为了插件使用起来比较方便,建议大家首字母大写。测试用例里面,测试用例的名字要放在第一列,要顶头写。用例的具体内容是从第二列开始写的。如果不加横线竖线的话,那我们就用空格的形式。我们纯文本格式怎么表示第一列是空格呢?
前面要加两个以上的空格来表示,否则它就会作为一个新的测试用例的名称了,这里我们建议大家用四个空格。
我们说的纯文本格式就是我们截图的样子,它每张表里面每个表格的单元格之间都至少要空两个或者以上的空格隔开。
如果你只空一个空格它会把它作为一个不认识的关键字,大家看,本来这是一个关键字如果中间我只空一个空格加上它的参数,它会把它作为一个不认识的关键字。我们这里也建议是四个空格,这样看起来更清晰一点。
还有一种隔开方式就是用 | 隔开, | 前后都用一个空格。比如下面的代码
| *** Test Cases *** |
| tc1 |
| | baidu search | 宋曲 | 宋曲 新书上传 |
| | baidu search | 宋曲小说 | 宋曲小说(皓月未央) |
| tc3 |
| | ${ret}= | multiply | 2 | 3 |
| | log to console | ${ret} |
| tc4 |
| | ${q} | ${r}= | divide | 8 | 2 |
| | log to console | ${q}:${r} |
| *** Keywords *** |
| baidu search |
| | [Arguments] | ${keyword} | ${firstlinktxt} |
| | Open Browser | http://www.baidu.com | chrome |
| | Input Text | id=kw | ${keyword}\n |
| | Set Selenium Implicit Wait | 2 |
| | ${firstRet}= | Get Text | css=div.result:first-of-type>h3 |
| | Should Be Equal | ${firstRet} | ${firstlinktxt} |
| | Close Browser |
| multiply |
| | [Arguments] | ${x} | ${y} |
| | ${ret}= | Evaluate | ${x} * ${y} |
| | [Return] | ${ret} |
| divide |
| | [Arguments] | ${x} | ${y} |
| | ${q}= | Evaluate | ${x} / ${y} |
| | ${r}= | Evaluate | ${x} % ${y} |
| | [Return] | ${q} | ${r} |
就是每个需要空格的地方我都加了 | , | 的前后各有一个空格,这样每一行各个元素的边界很清晰的。但是目前我们 Pycharm IDE 它不支持这种 | 的方式,所以看起来都是灰色的样子。这里大家可以对比一下那个形式更好看一点或者更好些一点。个人不喜欢 | 这种形式,比较麻烦而且Pycharm IDE 也不支持比较麻烦。
注意 一个关键字之间只能空一个空格。