obot Framework 的架构是一个通用型的验收测试和验收测试驱动开发的自动化测试框架(ATDD)。它具有易于使用的表格来组织测试过程和测试数据。
Robot Framework 特点:使用简单,非常丰富的库,可以像编程一样写测试用例,支持开发系统关键字
环境搭建
目前Robot Framework3.0 已经支持Python3.x,但是基于该框架的大多Library 还并未完全支持Python3.x,好在用来做接口测试的RequestsLibrary 已经支持了Python3.x,所以,我们可以在Python3.x 进行环境的搭建和接口自动化测试
安装Robot Framwork:
https://pypi.python.org/pypi/robotframework
它同样支持pip 命令安装:
pip install robotframework
安装Requests:
robotframework-requests 的运行依赖于Requests 库,待会儿会详细介绍Requests 库的使用,这里我们先通过pip 命令进行安装。
pip install requests
安装robotframework-requests:
目前PyPi 仓库中的robotframework-requests 库暂时还不支持Python3.x不过我们可以在GitHub 上获取最新的项目代码来安装。GitHub 地址:https://github.com/bulkan/robotframework-requests将项目克隆或下载并解压,执行目录下的setup.py 文件进行安装。
robotframework-requests-master>python3 setup.py install
实践时间
那么,接下来应该练习编写如何Robot Framework 脚本;用什么IDE 来编写脚本呢?如果你阅读过其它Robot Framework 的安装资料的话,也许会认为我所介绍的安装过程遗留了Robot Framework -RIDE(以下简称RIDE),是的!对于编写Robot Framework 脚本来说,RIDE 几乎是必不可少的。然而它的角色是依然只是一款IDE,也就是说不用它一样可以编写和运行Robot Framework 脚本。这里之所以没有介绍RIDE 的安装,主要原因是因为它目前还不并支持Python3,我想,之所以还不支持Python3 的原因之一是因为RIDE 是基于wxPython(该库是Python 下非常有名的GUI 库)开发的,而wxPython 目前并不支持Python3,所以,RIDE想支持Python3 就变得比较困难。那么除了RIDE 之外,还可以用什么工具来编写Robot Framework 脚本?Robot Framework 目前提供了各种主流编辑器的插件支持。
读者可以选择在自己熟悉的编辑器中安装相应的插件,这里用到了Sublime Text2,所以,这里我们选择Sublime assistant 插件安装。
Github 地址:https://github.com/andriyko/sublime-robot-framework-assistant同样的方式克隆或下载插件代码到本地,将解压目录放到Sublime Text2 的Packages\目录下,重启动Sublimt Text2。
在Sublimt Text2 菜单栏“查看”-->“语法”-->“Botot Framework syntax highlighting”,选择Robot Framework
类型的语法。
关于,如何编写Robot Framework 脚本,先暂时停下,接下来需要了解一下Robot Framework 的一些概念知识。
在Robot Framework 中创建测试项目和单元测试框架(unittest)中基本一致
忆一下,当我们用单元测试框架unittest 创建测试用例的过程,首先创建一个.py 文件。在文件中当创建测试类并继承unittest.TestCase 类,再接下来就是在测试类下面创建以“test”开头的方法,称之为一个一个的用例。如果创建的测试文件(.py)多了,可以把这些文件放到一个目录下,或者一个目录的子目录下面,最后通过discover()方法指定这个目录来运行测试用例。
Robot Framework 框架测试用例的创建相似,首先,如果你的用例很少,可以只创建一个文件。一般后缀名为.robot 或.txt,也可以将后缀名命名为.tsv 或.html。在文件中编写一个一个的用例。如果创建了多用例文件,也可以将这些文件放到一个测试目录下,通过“pybot”命令指定对该目录下的所有用例运行。接下来练习一下Robot Framework 用例的创建与运行。首先创建测试目录rf_test/ ,在该目录下创建test.robot 文件。通过Sublime Text2 打开文件,编写如下内容.
test.robot
*** Settings ****** Test Cases ***testcaselog robot framework
*** Settings *** 部分用于引用Library,当前没有引用,默认为空。
*** Test Cases *** 部分用于编写测试用例。testcase 顶格写,表示用例的名称。log robot framework log 前面四个空格,表示该行为testcase 的一行语句,log 为打印关键字,与Python 的print()方法类似,“robot framework”为打印的字符串,注意关键字与字符串之间的间距为四个空格。
如何运行Robot Framework 用例?首先,在安装好Robot Framework 之后,在Python 的Script/目录下会多出一个pybot.bat 文件,并且确保“C:\Python35\Scripts\”目录已经添加到了环境变量path 下面。接下来,打开Windows 命令提示符,在任意目录下输入“pybot -h”命令回车。如果出现帮助信息,说明pybot 命令可用,如果提示pybot 不是内部或外部命令,请检查环境变量是否正确的配置。
运行测试:
rf_test>pybot test.robot==============================================================================Test==============================================================================testcase | PASS |------------------------------------------------------------------------------Test | PASS |1 critical test, 1 passed, 0 failed1 test total, 1 passed, 0 failed==============================================================================Output: D:\rf_test\output.xmlLog: D:\rf_test\log.htmlReport: D:\rf_test\report.html
除了运行过程中的打印信息外,Robot Framework 还生成了三个文件,分别为output.xml 、log.html 和report.html。output.xml 是以XML 格式记录测试结果。阅读起来不够直观,在我看来,它的作用是提供给我们测试结果,让我们读取该文件生成定制化的测试报告。例如,你可以使用Python 语言读取该文件生成自定义的测试报告。log.html 和report.html 要美观的得多,log.html 偏向于测试日志,记录脚本每一步的执行情况。report.html偏向于测试报告,总体性的展示测试用例的执行情况。log.html 文件通过浏览器打开,如图
最后,介绍几种“pybot”命令的运行测试用例的策略:
rf_test>pybot test.robot#运行指定文件...\rf_test>pybot *.robot#运行当前目录下以.robot 为后缀名的测试文件...\rf_test>pybot test_a#运行当前test_a 目录下的所有用例...\rf_test>pybot ./#运行当前目录下的所有以.robot 为后缀名的测试文件
关于,更多用法,读者可以通过“pybot -h”查看帮助。
Robot Framework 测试框架更像一个自动化测试平台,它本身只提供了最基础的测试功能,例如,测试用例的组织、运行、测试报告的生成,以及最基本的Builtin 库,该库提供了最基本的关键字来实现打印,变量定义,if 语句,for 循环等。那么,我们想要完成不同类型的测试,就需要安装不同的Library。Robot Framework 提供了非常丰富的Library。
Web 自动化测试:SeleniumLibrary,Selenium2Library,Selenium2Library for Java,watir-robot 等。
Windows GUI 测试:AutoItLibrary。
移动测试:Android library,iOS library,AppiumLibrary 等。
数据库测试:Database Library (Java),Database Library (Python),MongoDB library 等。
文件对比测试:Diff Library。
HTTP 测试:HTTP library (livetest),HTTP library (Requests)等。
夸完了Robot Framework 的强大,接下来介绍接口测试用例的编写。在前面环境搭建一节,已经教读者安装好了robotframework-requests 库,接下来使用该库来编写接口测试用例。
test if.robot
*** Settings ***Library RequestsLibraryLibrary Collections*** Test Cases ***testget${payload}= Create Dictionary eid=1Create 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} 200log ${r.json()}${dict} Set variable ${r.json()}#断言结果${msg} Get From Dictionary ${dict} messageShould Be Equal ${msg} success${sta} Get From Dictionary ${dict} status${status} Evaluate int(200)Should Be Equal ${sta} ${status}
虽然前面已经对Robot Framework 的语法有了一定的认识,但我相信在你看到上面这一段脚本时内心几乎是崩溃的。如果用RIDE 编写脚本,这些脚本会横竖整齐的填写在“表格”中。如果用Sublime Text3 编写脚本的话,起码有代码着色和空格位。然而,这样的脚本确实看起来比较杂乱,不过,还是希望你能耐下心来和我一起学习。
----------------------------------------------------------
Library RequestsLibrary
Library Collections
--------------------------------------
首先,引用了RquestsLibrary 库和Collections 库,RquestsLibrary 就是我们安装的robotframework-requests,用来进行接口测试的相关操作。而Collections 库是用来操作字典的,因为接口的返回数据是Json 格式,转化成字典才能进行断言。
testget
testget 用来操作GET 接口的用例。
${payload}= Create Dictionary eid=1Create Session event http://127.0.0.1:8000/api${r}= Get Request event /get_event_list/ params=${payload}
先来看testget 用例的前三行,通过“Create Dictionary”关键字定义字典变量${payload},字典有一个键个HTTP 会话服务器。event 为该会话的别名,http://127.0.0.1:8000/api为该会话的基本url.“Get Requests”关键字用来发起一个GET 请求,接口URL 为event + /get_event_list/,接口参数为${payload}。最后将接口返回信息赋值给变量${r}。
Should Be Equal As Strings ${r.status_code} 200log ${r.json()}
通过${r.status_code}可以得到请求的HTTP 状态码,通过“Should Be Equal As Strings”关键字判断其是否为200。通过${r.json()}可得将json 格式的返回值转化为字典,并通过log 打印。
${dict} Set variable ${r.json()}断言结果${msg} Get From Dictionary ${dict} messageShould Be Equal ${msg} success${sta} Get From Dictionary ${dict} status${status} Evaluate int(200)Should Be Equal ${sta} ${status}
再接下来的操作主要是对返回字典的验证。将${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 进行比较。到此,这一个完整接口用例介绍完毕。接下来再编写一个POST 请求的接口测试用例。
……
testpost
${header} Create Dictionary Content-Type=application/json${payload}= Create Dictionary eid=1Create Session event http://127.0.0.1:8000/api ${header}${r}= Post Request event /add_event/ data=${payload}Should Be Equal As Strings ${r.status_code} 200log ${r.json()}${dict} Set variable ${r.json()}#断言结果${msg} Get From Dictionary ${dict} messageShould Be Equal ${msg} parameter error${sta} Get From Dictionary ${dict} status${status} Evaluate int(10021)Should Be Equal ${sta} ${status}
POST 接口用例基本与前面介绍的GET 接口用例相似,但略有不同。
${header} Create Dictionary Content-Type=application/json${payload}= Create Dictionary eid=1Create Session event http://127.0.0.1:8000/api ${header}${r}= Post Request event /add_event/ data=${payload}
首先,POST 请求一般需要创建header 标头,用来指定请求信息的内容类型。在创建HTTP 会话服务器时指定。另外,POST 请求所用到的关键字为“Post Request”。最后,关于Robot Framework 框架的介绍就到此为止,不得不说它是一个非常优秀的测试框架,应用范围也很广泛。另外,关于RequestsLibrary 中所提供的关键字,可以在下面的文档中查看。
http://bulkan.github.io/robotframework-requests/
小节
关于接口测试相关的工具还有很多。今天蜻蜓点水似的介绍了这款比较常见的接口测试工具的简单使用。使读者可以快速的了解并使用这些接口测试工具。对于Robot Framework 工具来说,它可挖掘的功能还有很多。对比下Jmeter , Jmeter 更擅长各种类型的性能测试,Robot Framework 擅长各种类型自动化测试。当然,在学习各种测试工具使用的同时,不要忘记基本功,编程能力的提升,这才是重中之重。