《Web接口开发与自动化测试基于Python语言》--第9章

第9章 接口测试工具介绍

本章开始介绍接口测试工具的使用,应该说是从理论过渡到实际的过程。

接口工具分类:

  • 接口测试工具:这类工具提供的功能比较简单,可以模拟和发送HTTP请求,并显示返回接口数据。eg:HttpRequester、Postman等;

  • 接口自动化测试工具:功能相比接口测试工具更强大,一般提供用例的批量执行、接口返回接口的断言及测试报告的生成等。eg:JMeter、Robot Framework、soapUI等;

  • 接口性能测试工具:测试接口的性能,验证接口的并发处理能力。eg:JMeter、LoadRunner、soapUI等。

9.1 Postman测试工具

Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件。

Ps: 如今这个年代啊,想访问个谷歌,不想点办法是不行啊!这个工具是要通过Chrome添加的,这里推荐给大家一个比较省时省力的方法,就是通过修改hosts文件来访问,具体可以问度娘。

安装完成后,通过GET请求,调用【查询发布会接口】:

http://127.0.0.1/api/get_event_list/?eid=1

效果如图:

《Web接口开发与自动化测试基于Python语言》--第9章_第1张图片

再发送POST请求,调用【添加发布会接口】:

http://127.0.0.1/api/add_event/

效果如图:

《Web接口开发与自动化测试基于Python语言》--第9章_第2张图片

这里又存在一个问题:

如果我们直接按书中来的话,该URL始终会返回403错误,查看具体的报错信息:

Forbidden (CSRF cookie not set.): /api/add_event/
[01/Aug/2017 14:53:50] "POST /api/add_event/ HTTP/1.1" 403 2857

也就是说缺少认证信息,而书中没有教我们如何去解决该问题,我们这里不对该工具做过多的研究,直接通过修改settings.py文件的方式规避这段认证信息,将settings.py里的:

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    #'django.middleware.locale.LocaleMiddleware',
    'django.middleware.common.CommonMiddleware',
    #'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

把csrf那一行注释了即可。

9.2 JMeter测试工具

Apache JMeter是Apache组织开发的基于Java的压力测试工具。实际上对于Web页面调用和Web接口的调用本质是一样的,所以JMeter当然可以用来测试Web接口。

9.2.1 安装JMeter

JMeter官方网址:http://jmeter.apache.org/

先决条件:Java 7或以上版本

安装后的效果:

《Web接口开发与自动化测试基于Python语言》--第9章_第3张图片

9.2.2 创建测试任务

操作步骤:

  • 创建线程组

    • 线程数:设置虚拟用户数,一个虚拟用户占用一个进程或线程,线程数就相当于虚拟用户数;

    • Ramp-Up Period(in seconds):设置的线程数的启动时长,单位为秒。eg:线程数位100,准备时长20秒,那么需要20秒钟启动100个线程,平均每秒启动5个线程;

    • 循环次数:每个线程发送请求的个数,如果线程数为100,循环次数为2,那么每个线程发送2次请求,总请求数位100*2=200次,如果勾选了“永远”复选框,那么所有线程会循环发送请求,直到手动单击工具栏上的停止按钮,或者设置的线程运行时间结束才会停止运行。

  • 创建测试任务

    • 本例要测试的接口,将以上三个参数均设置为1,表示1个线程,1秒启动,运行1次。
  • 设置HTTP请求

    • 名称: 本属性用于标识一个HTTP请求的取样器,建议使用一个有意义的名称;

    • 注释: 对于测试没有任何影响,仅用于注释当前HTTP请求的说明;

    • 服务名称或IP: HTTP请求发送的目标服务器名称或IP地址;

    • 端口号: 目标服务器的端口号,默认值为80;

    • 协议: 向目标服务器发送HTTP请求时的协议,可以是HTTP或HTTPS,默认不填为HTTP;

    • 方法: 发送HTTP请求的方法,可用方法包括GET、POST、HEAD、PUT、OPTIONS、TRACE、DELETE等;

    • Content encoding: 内容的编码方式,默认值为iso8859;

    • 路径: 目标URL路径(不包括服务器地址和端口);

    • 自动重定向: 如果选中该选项,那么发送HTTP请求后得到的响应就是302/301时,JMeter自动重定向到新的页面;

    • Use keep Alive: 当该选项被选中时,JMeter和模板服务器之间使用keep-Alive方式进行HTTP通信,默认选中;

    • Use multipart/form-data for HTTP POST: 当发送HTTP的POST请求时,使用Use multipart/form-data方法发送,默认不选中;

    • 同请求一起发送参数: 在请求中发送URL参数,对于带参数的URL,JMeter提供了一个简单的参数化方法,用户可以将URL中的所有参数都设置在该表格中,表格的每一行是一个参数值。

效果如下图所示:

《Web接口开发与自动化测试基于Python语言》--第9章_第4张图片

添加查看结果树,为JMeter提供的常用监控器之一,用于显示每个请求的服务器响应结果,其中Text窗口显示请求对象,取样器结果窗口用于显示服务器响应信息。

9.3.2 添加接口测试

  • 查询嘉宾信息

《Web接口开发与自动化测试基于Python语言》--第9章_第5张图片

  • 添加嘉宾信息

《Web接口开发与自动化测试基于Python语言》--第9章_第6张图片

9.3.4 添加断言

对于自动化测试来说,断言功能必不可少。

对上述两个自动化接口测试添加断言,右键“查询嘉宾信息”–“添加”–“断言”–“响应断言”。

《Web接口开发与自动化测试基于Python语言》--第9章_第7张图片

  • 要测试的响应字段: 包括响应文本、Document(text)、URL样本、响应信息、Response Headers、Lgnore Status等选项,虽然测试接口返回的JSON格式数据,但对于JMeter来说,返回数据可以作为文本,所以,勾选“响应文本”;

  • 模式匹配规则: 提供了包括、匹配、Equals、Substring等选项,这里只需要验证返回数据中是否包含主要的关键字,所以,勾选“包括”单选框;

  • 要测试的模式: 其实就是要断言的数据,单击“添加”按钮,输入要断言的数据。

Fu*k,增加了断言之后,运行测试,查询嘉宾信息接口,始终都是返回失败,查看具体的失败原因,总是显示eid为空,奇怪了,回去查代码吧,才发现,原来自己在写查询嘉宾信息接口的时候,有多处错误,但是当时都没有进行进行测试,所以一直没发现,包括:status单词拼写错误、缩进行错误、request获取数据方法错误本来是GET获取的自己写成了POST获取!哎,修正上述错误代码后,重新运行测试,终于通过了:

《Web接口开发与自动化测试基于Python语言》--第9章_第8张图片

9.3 Robot Framework测试框架

Robot Framework是一个通用型的验收测试和验收测试驱动开发的自动化测试框架(ATDD)。

特点:

  • 使用简单

  • 有非常丰富的库

  • 可以像编程一样编写测试用例

  • 支持开发系统关键字

9.3.1 环境搭建

  1. 安装Robot Framework框架

    PyPI地址:https://pypi.python.org/pypi/robotframework

  2. 安装Requests库

    PyPI地址:https://pypi.python.org/pypi/requests

  3. 安装robotframework-requests库

    PyPI地址:https://pypi.python.org/pypi/robotframework-requests

9.3.2 基本概念与用法

Robot Framework框架,将测试项目分为三层:

  • Test Project: 既可以创建成目录,也可以创建成文件,若创建成目录,则可以在它下面创建Test Suit;若创建成文件,则只能在它下面创建Test Case;

  • Test Suit: 同样可以创建成目录,或者文件,若创建成目录的话,则可以它下面创建子Test Suit,若创建成文件的话,则只能在它下面创建Test Case,子Test Suit同样分为目录或文件;

  • Test Case: 只能创建在文件中。

可以这样理解:

Test Project和Test Suit分别对应测试目录、测试文件,而Test Case就是测试文件中的一条测试用例。

Robot Framework的文件后缀:

.robot、.txt、.tsv、.html

Robot Framework的后台命令:

pybot

Robot Framework的日志文件:

  • output.xml:是以XML格式记录的测试结果,阅读起来不够直观,可以通过读取XML文件中的测试结果来生成定制化的测试报告;

  • log.html:偏向于测试日志,记录脚本每一步的执行情况;

  • report.html:偏向于测试报告,总体展示测试用例的执行情况;

Robot Framework的后台命令格式:

pybot test.robot #运行指定文件

pybot *.robot #运行当前目录下以.robot为后缀名的测试文件

pybot test_a #运行当前test_a目录下的所有用例

pybot ./ #运行当前目录下的所有测试文件

9.3.3 接口测试

Robot Framework的标准库:

  • Builtin:提供了最基本的关键字来实现打印,eg:变量定义、If语句、For循环语句等;

  • Screenshot:提供了截图关键字;

  • DataTime:提供了关于时间操作的关键字;

  • Web自动化测试:SeleniumLibrary、Selenium2Library、Selenium2Library for Java、watir-robot;

  • Windows GUI测试:AutoItLibrary;

  • 移动测试:Android library、iOS library、AppiumLibrary;

  • 数据库测试:Database Library(Java)、Database Library(Python)、MonogDB library;

  • 文件对比测试:Diff Library;

  • HTTP测试:HTTP library(livetest)、HTTP library(Requests);

GET请求的查询发布会接口测试用例:

*** Settings ***
Library           RequestsLibrary
Library           Collections

*** Test Cases ***
test_get_event_list
    ${payload}=    Create Dictionary    eid=1
    Create Session    event    http://10.18.214.88: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}

POST请求的嘉宾签到接口测试用例:

*** Settings ***
Library           RequestsLibrary
Library           Collections

*** Test Cases ***
test_user_sign_success
    Create Session    sign    http://10.18.214.88:8000/api
    &{headers}    Create Dictionary    Content-Type=application/x-www-form-urlencoded
    &{payload}    Create Dictionary    eid=11    phone=13122002200
    ${r}    Post Request    sign    /user_sign/    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}    success
    ${sta}    Get From Dictionary    ${dict}    status
    ${status}    Evaluate    int(200)
    Should Be Equal    ${sta}    ${status}

以POST请求为例,分析:

  • 通过“Create Session”关键字创建HTTP会话服务器,通过sign指定http://10.18.214.88:8000/api为该会话的基础URL;

  • POST请求一般需要创建header标头,用来指定请求信息的内容类型为application/x-www-form-urlencoded,在创建POST请求时指定;

  • &{payload}定义请求接口的参数,即发布会id和签到手机号;

  • 通过“Post Request”关键字发送POST请求;

至此,我们已经了解到了Robot Framework的基本概念,以及其他几个接口测试工具,工具只是一种方法,最终使用哪一个,还要看自身产品的契合度,选择合适自己产品的接口测试工具。

你可能感兴趣的:(Python,RobotFramework)