Python的ATDD框架-robotframework

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

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

Python的ATDD框架-robotframework_第1张图片
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请求)

Python的ATDD框架-robotframework_第2张图片
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的插件)

Python的ATDD框架-robotframework_第3张图片
Test suite.png
Python的ATDD框架-robotframework_第4张图片
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的情况下,直接编写测试用例也是很方便的。

Python的ATDD框架-robotframework_第5张图片
4.png

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

Python的ATDD框架-robotframework_第6张图片
3.png
Python的ATDD框架-robotframework_第7张图片
5.png

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

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

你可能感兴趣的:(Python的ATDD框架-robotframework)