本章开始介绍接口测试工具的使用,应该说是从理论过渡到实际的过程。
接口工具分类:
接口测试工具:这类工具提供的功能比较简单,可以模拟和发送HTTP请求,并显示返回接口数据。eg:HttpRequester、Postman等;
接口自动化测试工具:功能相比接口测试工具更强大,一般提供用例的批量执行、接口返回接口的断言及测试报告的生成等。eg:JMeter、Robot Framework、soapUI等;
接口性能测试工具:测试接口的性能,验证接口的并发处理能力。eg:JMeter、LoadRunner、soapUI等。
Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件。
Ps: 如今这个年代啊,想访问个谷歌,不想点办法是不行啊!这个工具是要通过Chrome添加的,这里推荐给大家一个比较省时省力的方法,就是通过修改hosts文件来访问,具体可以问度娘。
安装完成后,通过GET请求,调用【查询发布会接口】:
http://127.0.0.1/api/get_event_list/?eid=1
效果如图:
再发送POST请求,调用【添加发布会接口】:
http://127.0.0.1/api/add_event/
效果如图:
这里又存在一个问题:
如果我们直接按书中来的话,该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那一行注释了即可。
Apache JMeter是Apache组织开发的基于Java的压力测试工具。实际上对于Web页面调用和Web接口的调用本质是一样的,所以JMeter当然可以用来测试Web接口。
JMeter官方网址:http://jmeter.apache.org/
先决条件:Java 7或以上版本
安装后的效果:
操作步骤:
创建线程组
线程数:设置虚拟用户数,一个虚拟用户占用一个进程或线程,线程数就相当于虚拟用户数;
Ramp-Up Period(in seconds):设置的线程数的启动时长,单位为秒。eg:线程数位100,准备时长20秒,那么需要20秒钟启动100个线程,平均每秒启动5个线程;
循环次数:每个线程发送请求的个数,如果线程数为100,循环次数为2,那么每个线程发送2次请求,总请求数位100*2=200次,如果勾选了“永远”复选框,那么所有线程会循环发送请求,直到手动单击工具栏上的停止按钮,或者设置的线程运行时间结束才会停止运行。
创建测试任务
设置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中的所有参数都设置在该表格中,表格的每一行是一个参数值。
效果如下图所示:
添加查看结果树,为JMeter提供的常用监控器之一,用于显示每个请求的服务器响应结果,其中Text窗口显示请求对象,取样器结果窗口用于显示服务器响应信息。
对于自动化测试来说,断言功能必不可少。
对上述两个自动化接口测试添加断言,右键“查询嘉宾信息”–“添加”–“断言”–“响应断言”。
要测试的响应字段: 包括响应文本、Document(text)、URL样本、响应信息、Response Headers、Lgnore Status等选项,虽然测试接口返回的JSON格式数据,但对于JMeter来说,返回数据可以作为文本,所以,勾选“响应文本”;
模式匹配规则: 提供了包括、匹配、Equals、Substring等选项,这里只需要验证返回数据中是否包含主要的关键字,所以,勾选“包括”单选框;
要测试的模式: 其实就是要断言的数据,单击“添加”按钮,输入要断言的数据。
Fu*k,增加了断言之后,运行测试,查询嘉宾信息接口,始终都是返回失败,查看具体的失败原因,总是显示eid为空,奇怪了,回去查代码吧,才发现,原来自己在写查询嘉宾信息接口的时候,有多处错误,但是当时都没有进行进行测试,所以一直没发现,包括:status单词拼写错误、缩进行错误、request获取数据方法错误本来是GET获取的自己写成了POST获取!哎,修正上述错误代码后,重新运行测试,终于通过了:
Robot Framework是一个通用型的验收测试和验收测试驱动开发的自动化测试框架(ATDD)。
特点:
使用简单
有非常丰富的库
可以像编程一样编写测试用例
支持开发系统关键字
安装Robot Framework框架
PyPI地址:https://pypi.python.org/pypi/robotframework
安装Requests库
PyPI地址:https://pypi.python.org/pypi/requests
安装robotframework-requests库
PyPI地址:https://pypi.python.org/pypi/robotframework-requests
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 ./ #运行当前目录下的所有测试文件
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的基本概念,以及其他几个接口测试工具,工具只是一种方法,最终使用哪一个,还要看自身产品的契合度,选择合适自己产品的接口测试工具。