Python的ATDD框架-robotframework

Robot Framework是一款python编写的功能自动化测试框架。具备良好的可扩展性,支持关键字驱动,可以同时测试多种类型的客户端或者接口,可以进行分布式测试执行。主要用于轮次很多的验收测试和验收测试驱动开发(ATDD)。

同样为自动化测试框架,和Robot Framework齐名的是另一款框架Cucumber,两者的对比如下:

1.png

由于现在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请求)

3.png

上图是运行成功后的结果。
被测试的系统: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的插件)

Test suite.png
keywords.png
*** 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的情况下,直接编写测试用例也是很方便的。

4.png

当然在熟悉以后,直接使用代码方式编写,也是一样一样。
写完测试用例后在当前的目录直接运行命令: pybot 测试用例文件名
可看到如下的运行结果:

3.png
5.png

同时,可以看到已经有3个文件,log.html,output.xml和report.html,从report.html可以很好的看到这次的运行结果。

robotframework是一款很好很强大的自动化测试框架,对于ATDD的这种方式来说,它的支持已经很方便的了,很多公司也在使用这个框架,有兴趣的朋友可以多看看咯。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,783评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,360评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,942评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,507评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,324评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,299评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,685评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,358评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,652评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,704评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,465评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,318评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,711评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,991评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,265评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,661评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,864评论 2 335

推荐阅读更多精彩内容