Robot Framework是一款python编写的功能自动化测试框架。具备良好的可扩展性,支持关键字驱动,可以同时测试多种类型的客户端或者接口,可以进行分布式测试执行。主要用于轮次很多的验收测试和验收测试驱动开发(ATDD)。
同样为自动化测试框架,和Robot Framework齐名的是另一款框架Cucumber,两者的对比如下:
由于现在Python3里面对RIDE和Selenium2Library的支持还不好(应该说就是不支持。。。浪费了我一下午的时间查如何能装上Selenium2Library,晕啊),所以在Python3的环境下虽然有对应的RobotFramework3.x,使用上还是有些不方便,不过基于 「契可尼效应」(也就是轻微强迫症啦),我还是尝试了在Python3下面小玩了一下RF。
安装环境
Python 3.5.2
robotframework-3.0(安装命令:pip install robotframework)
robotframework_requests-0.4.7(安装命令:pip install robotframework-requests)
PyCharm Community Edition 2016.3.2
测试需求:(这次我们先实现一个接口测试的小目标,也就是模拟一下Get和Post请求)
上图是运行成功后的结果。
被测试的系统:Django搭建的一个Web系统,其中有两个接口为: http://127.0.0.1:8000/api/get_event_list (GET请求来获取会议列表)
http://127.0.0.1:8000/api/add_event(POST请求来新增一个会议)
1 Pycharm上新建一个项目rf_test,然后右键新建一个robot的文件,可以新建Test Suites的,也可以新建Keywords的,前提是你的pycharm里面需要加上robotframework的插件)
*** Settings ***
Library RequestsLibrary
Library Collections
*** Test Cases ***
testget
${payload}= Create Dictionary eid=1
Create Session event http://127.0.0.1:8000/api
${r}= Get Request event /get_event_list/ params=${payload}
Should Be Equal As Strings ${r.status_code} 200
log ${r.json()}
${dict} Set variable ${r.json()}
#断言结果
${msg} Get From Dictionary ${dict} message
Should Be Equal ${msg} success
${sta} Get From Dictionary ${dict} status
${status} Evaluate int(200)
Should Be Equal ${sta} ${status}
testpost
Create Session event http://127.0.0.1:8000/api
&{headers} Create Dictionary Content-Type=application/x-www-form-urlencoded
&{payload}= Create Dictionary eid=1
${r}= Post Request event /add_event/ data=${payload} headers=${headers}
Should Be Equal As Strings ${r.status_code} 200
log ${r.json()}
${dict} Set variable ${r.json()}
#断言结果
${msg} Get From Dictionary ${dict} message
Should Be Equal ${msg} parameter error
${sta} Get From Dictionary ${dict} status
${status} Evaluate int(10021)
Should Be Equal ${sta} ${status}
在Pycharm中装robotframework插件最简单的方式是把上述的代码用Pycharm打开,则Pycharm会智能的检测到你需要安装robotframework的插件。
2 从新建的模板上我们可以看到第一个段落是 Settings(设置)
Settings包含的内容是需要引用的标准库或者自己写的库文件。
比如 如下的写法表示需要引用RequestsLibrary 和Collections库(前提就是需要装robotframework和robotframework-requests的第三方包,Collections库是用于操作字典,在这个场景中,接口的返回数据格式为Json,需要转化以后才能进行断言)
*** Settings ***
Library RequestsLibrary
Library Collections
还可以在Settings里面写的是关于这个文件的描述(Documentation)和引用自己写的库(Resource),比如:
*** Settings ***
Documentation A test suite with a single test for valid login.
...
... This test has a workflow that is created using keywords in
... the imported resource file.
Resource resource.robot
*** 3 Test Cases里面写和测试用例相关的内容***
*** Test Cases ***
testget
${payload}= Create Dictionary eid=1
Create Session event http://127.0.0.1:8000/api
${r}= Get Request event /get_event_list/ params=${payload}
Should Be Equal As Strings ${r.status_code} 200
log ${r.json()}
${dict} Set variable ${r.json()}
#断言结果
${msg} Get From Dictionary ${dict} message
Should Be Equal ${msg} success
${sta} Get From Dictionary ${dict} status
${status} Evaluate int(200)
Should Be Equal ${sta} ${status}
testget 表示这个测试用例的名称为testget,当然你也可以取一个另外的名字来标示。
测试用例的代码解读:
第一行:通过“Create Dictionary”关键字定义字典变量${payload},字典有一个键值 eid=1。该字典将会作为接口的参数。
第二行:“Create Session”关键字用来创建一个 HTTP 会话服务器。event 为该会话的别名,http://127.0.0.1:8000/api为该会话的基本 url.
第三行:“Get Requests”关键字用来发起一个 GET 请求,接口 URL 为 event + /get_event_list/,接口参数为${payload}。最后将接口返回信息赋值给变量${r}
第四行:通过${r.status_code}可以得到请求的 HTTP 状态码,通过“Should Be Equal As Strings”关键字判断其是否为 200(200表示Http请求返回是正常的状态码)。
第五行:通过${r.json()}可得将 json 格式的返回值转化为字典,并通过 log 关键字打印。
第六行:对返回字典的验证。将${r.json()}通过定义变量关键字“Set Variable”赋值给变量
${dict}。
第七行:同样的可以用 # 来进行注释
第八行:“Get From Dictionary”关键字由前面的引入的 Collections 库提供,可以取到字典中 key 对应 value。这里获取 key 为“message”对应的 value 赋值给变量${msg}。
第九行:“Should Be Equal”关键字用于比较${msg}是否等于“success”。
第十行:取到字典 key 为“status”对应的 value。可是得到的 value 200 是整数类型。然而,在 Robot Framework 中直接编写的内容为字符串。
第十一行:借助强大的 Evaluate,它可以直接调用 Python所提供的方法。例如,这里调用 Python 的 int()方法把 200 转整数类型,并与字典中的取出来的整数 200 进行比较。
第十二行:比较status和sta的值来做断言。
POST 接口用例基本与前面介绍的 GET 接口用例相似,但略有不同。
${header} Create Dictionary Content-Type=application/json
${payload}= Create Dictionary eid=1
Create Session event http://127.0.0.1:8000/api ${header}
${r}= Post Request event /add_event/ data=${payload}
在POST 请求需要创建 header 报头,用来指定请求信息的内容类型。在创建 HTTP 会话服务器时指定。另外,POST 请求所用到的关键字为“Post Request”。
从上面的例子中我们可以看出来,RobotFramework比较难一点的地方其实就在于你要熟悉其提供的关键字。
关于 RequestsLibrary 中所提供的关键字,可以在下面的文档中查看。
http://bulkan.github.io/robotframework-requests/
如果是用的Python2.7,可以使用RIDE的情况下,直接编写测试用例也是很方便的。
当然在熟悉以后,直接使用代码方式编写,也是一样一样。
写完测试用例后在当前的目录直接运行命令: pybot 测试用例文件名
可看到如下的运行结果:
同时,可以看到已经有3个文件,log.html,output.xml和report.html,从report.html可以很好的看到这次的运行结果。
robotframework是一款很好很强大的自动化测试框架,对于ATDD的这种方式来说,它的支持已经很方便的了,很多公司也在使用这个框架,有兴趣的朋友可以多看看咯。