【Django】【六】【接口测试工具】【JMeter&Robot Framework】
9.2 JMeter
9.2.1 安装JMeter
http://jmeter.apache.org/
JMeter由Java语言开发的,最新的JMeter3.0 运行需要Java7 或以上版本的环境
JMeter下载完成后,将apache-jmeter-3.0.zip 文件解压,进入解压目录.../apache-jmeter-3.0/bin/ 双击ApacheJMeter.jar文件启动JMeter
9.2.2 创建测试任务
创建线程组,一个线程组可以看作一个测试任务。添加线程组, 右击测试计划,在快捷键菜单中单击“添加”-> “Threads(Users)”-> 线程组
设置线程组。线程组主要包含三个参数: 线程数 Ramp-UP Period(in saconds) 循环次数
线程数: 设置虚拟用户数。一个虚拟用户占用一个进程或线程。线程数就相当于虚拟用户数。
Ramp-UP Period(in secondes): 设置的线程数的启动时长, 单位为秒。如果线程数为100,准备时长为20(秒),那么需要20秒启动100个线程,平均每秒启动5个线程。
循环次数:每个线程发送请求的个数。如果线程数为100,循环此时2,那么每个线程发送2次请求。总请求数100*2=200次。 如果勾选了“永远”复选框,那么所有线程会循环发送请求,
直到手动单击工具栏上的停止按钮,或者设置的线程运行时间结束才会停止运行。
因为我们要做的是接口测试,所以将各个参数都设置成1,表示1个线程,1秒启动,运行1次。
添加HTTP请求。右击“线程组”,在快捷菜单中单击“添加”->Sampler->HTTP请求。
HTTP请求设置主要包含以下选项:
- 名称:本属性用于标识一个HTTP请求的取样器,建议使用一个有意义的名称。
- 注释:对于测试没有任何影响,仅用于注释当前HTTP请求的说明。
- 服务器名称或IP:HTTP请求发送的目标服务器名称或IP地址。
- 端口号:目标服务器的端口号,默认值80
- 协议:向目标服务器发送HTTP请求时的协议,可以是HTTP或者HTTPS 默认不填为HTTP
- 方法:发送HTTP请求的方法,可用方法包括GET POST HEAD PUT OPTIONS TRACE DELETE等
- Content encoding: 内容的编码方式,默认ios8859
- 路径:目标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中的所有参数都设置在该表格中,表格的每一行是一个参数值。
添加查看结果树, 右击“线程组” -> 添加 -> 监听器 -> 查看结果树
9.2.3 添加接口测试
添加嘉宾信息
选项 | 参数 |
名称 | 查询嘉宾信息 |
服务器名称或IP | 127.0.0.1 |
端口 | 8000 |
方法 | GET |
路径 | /api/get_guest_list/ |
Parameters |
eid: 1 phone: 13800110011 |
再次添加”HTTP请求“取样器,用于添加嘉宾信息,填写选项
选项 | 参数 |
名称 | 添加嘉宾信息 |
服务器名称或IP | 127.0.0.1 |
端口 | 8000 |
方法 | POST |
路径 | /api/add_guest/ |
Parameters |
eid: 11 realname:david phone: 13122002200 email:david@mail.com |
执行接口测试,单击工具栏绿色“启动”按钮,并查看结果树,
8.2.4 添加断言
右击“查询嘉宾信息” -> 添加 -> 断言 -> 响应断言
- 要测试的响应字段:包括响应文本、Document(text)、 URL样本、响应信息、Response Headers、Lgnore Status 选项。虽然当前测试接口返回的是JSON格式的数据,但对于JMeter来说,返回数据可以作为文本,所以,勾选“响应文本”
- 模式匹配规则:提供了包括、匹配、Equals、 Substring等选项,输入要断言的数据。
- 要测试的模式:其实就是要断言的数据。单击“添加”按钮,输入要断言的数据。
对于查询嘉宾接口的断言,可以添加模糊匹配“200” “success" 以及嘉宾手机号等信息
9.3 Robot Framework 测试框架
Robot Framework是一个通用型的验收测试和验收测试驱动开发的自动化测试框架(ATDD) 它具有易于使用的表格来组织测试过程和测试数据。
我们可以像编写程序一样编写Robot Framework脚本。
Robot Framework 脚本 | ||||
${a} | Set variable | 59 | ||
run keyword if | ${a}>=90 | log | 优秀 | |
... | ELSE IF | ${a}>=70 | log | 良好 |
... | ELSE IF | ${a}>=60 | log | 及格 |
... | ELSE | log | 不及格 |
Robot Framework 特点
- 使用简单
- 有非常丰富的库
- 可以像编程一样写测试用例
- 支持开发系统关键字
9.3.1 环境搭建
Robot Framework 基于Python语言开发,目前Robot Framework 3.0已经支持python3,但是基于该框架的大多Library尚未完全支持Python3,好在用来做借口测试的RequestLibrary已经对python3做了支持,所以,基于当前需求,我们可以在Python3下使用Robot Framework运行接口自动化测试。
1 安装Robot Framework 框架
本身并不提供任何类型的测试,它只是提供了作为自动化测试框架的基本功能,如用例的批量执行、测试报告的生成等,当然它也包含了一些基础库,用于脚本基本语法的编写
PyPI地址: https://pypi.python.org/pypi/robotframework
问题:Mac上已安装robot framework,但是在命令行敲pybot提示:
command not found: pybot
解决:高版本弃用了pybot
第一种方法:换robot即可
第二种方法:卸载高版本,换成低版本
pip3 uninstall robotframework
pip3 install robotframework==3.0
2 安装Requests库
Requests库基于Python语言 用于模拟发送HTTP请求。roboframework-requests的运行基于Requests,所以,需要先安装Requests
PyPI地址: https://pypi.python.org/pypi/requests
3 安装robotframework-requests库
robotframework-requests即为RequestsLibrary库,基于Robot Framework 和 Requests 提供的HTTP接口测试
PyPI地址: https://pypi.python.org/pypi/robotframework-requests
接下来练习如何编写Robot Framework脚本。用什么IDE来编写脚本呢?RobotFramework-RIDE 可以,然而他的角色只是一款IDE,不使用它一样可以编写和运行Robot Framework脚本。这里之所以没有介绍RIDE的安装,主要原因是因为它目前尚未支持Python3。原因是RIDE是基于wxPython(该库是Python下非常有名的GUI库)开发的,而wxPython目前不支持Python3,所以,RIDE想支持Python3就变得比较困难。
除了RIDE,还可以选择Sublime Text3 安装Package Control以及安装插件 https://github.com/andriyko/sublime-robot-framework-assistant 【备注】Sublime Text3环境配置参考 https://www.cnblogs.com/suren2017/p/13218885.html
在 Sublime Text3菜单栏单击view-> Syntax -> Robot Framework syntax highlighting ,选择 Robot Framework 语法高亮。
9.3.2 基本概念及用法
Robot Framework框架中,一般将测试项目分为三层:Test Project , Test Suit , Test Case
- 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用例的编写与运行。
首先,创建测试目录rf_test/ 在该目录下创建test.robot文件。 通过Sublime Text3打开文件,编写一个简单的Robot Framework脚本。
*** Settings ***
*** Test Cases ***
testcase
log robot framework
- *** Settings *** 部分用于引用Library, 当前没有引用,默认为空
- *** Test Cases *** 部分用于编写测试用例
- testcase 顶格写,表示用例的名称
- log robot framework: log 前面四个空格,表示该行属于testcase用例的一行语句,‘log’为打印关键字,与Python语言的print()方法作用类似,'robot framework'为打印的字符串,关键字与字符串之间的间距为四个空格。
安装好Robot Framework框架后,在/Library/Framework/Python.framework/Versions/3.7/bin 下会多出一个pybot.bat文件,并且确保python环境变量已经添加好。接下来,打开cmd.exe 在任意目录下输入‘pybot -h‘回车。
如果出现帮助信息,则说明此命令可用,如果提示'pybot 不是内部或外部命令‘ 请检查目录是否添加环境变量path。
运行测试。
B0178RQ2019070018:rf_test wangxue$ pybot test.robot
==============================================================================
Test
==============================================================================
| FAIL |
Test case name cannot be empty.
------------------------------------------------------------------------------
Test | FAIL |
1 critical test, 0 passed, 1 failed
1 test total, 0 passed, 1 failed
==============================================================================
Output: /Users/wangxue/Library/Python/3.7/bin/guest/sign/rf_test/output.xml
Log: /Users/wangxue/Library/Python/3.7/bin/guest/sign/rf_test/log.html
Report: /Users/wangxue/Library/Python/3.7/bin/guest/sign/rf_test/report.html
B0178RQ2019070018:rf_test wangxue$ pybot test.robot
==============================================================================
Test
==============================================================================
testcase | PASS |
------------------------------------------------------------------------------
Test | PASS |
1 critical test, 1 passed, 0 failed
1 test total, 1 passed, 0 failed
==============================================================================
Output: /Users/wangxue/Library/Python/3.7/bin/guest/sign/rf_test/output.xml
Log: /Users/wangxue/Library/Python/3.7/bin/guest/sign/rf_test/log.html
Report: /Users/wangxue/Library/Python/3.7/bin/guest/sign/rf_test/report.html
除了 脚本运行过程中的打印信息外,Robot Framework还生成了三个文件,分别为output.xml log.html report.html
output.xml 是以XML格式记录测试结果,阅读起来不太直观。我们可以使用不同的语言读取XML文件中的测试结果,生成定制化的测试报告。
log.html report.html相对来说美观的多,log.html偏向于测试日志,记录脚本的每一步执行情况。
最后,介绍几种pybot命令的运行测试用例的策略
cmd.exe
.../rf_test> pybot test.robot # 运行指定文件
.../rf_test> pybot *.robot #运行当前目录下以.robot为后缀的测试文件
.../rf_test> pybot test_a #运行当前test_a目录下的所有用例
.../rf_test> pybot ./ #运行当前目录下的所有的测试文件
9.3.3 接口测试
Robot Framework是一个通用型自动化测试框架,它本身只提供基础的测试功能。例如,测试用例的组织、运行、测试报告的生成以及一些标准库,如 Builtin String Screenshot DataTime Process等
在标准库Builtin中提供了最基本的关键字来实现打印,如变量定义、if语句、for循环等。Screenshot库中提供了截图关键字; DataTime库提供了关于时间操作的关键字。
当我们想要完成不同类型的测试时,只需安装不同的扩展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)
前面已经安装好了 robotframework-requests(RequestsLibrary) 接下来使用该库所提供的关键字来进行接口测试。
首先编写GET请求的查询发布会接口测试用例 【注意】 四个空格 下面是文本 不过要以再下方的截图为准
*** settings ***
Library RequestsLibrary
Library Collections
*** Test Cases ***
test_get_event_list
${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}
下面来解释每一行的意义
首先,引用RequestsLibrary库和Collections库。RequestsLibrary就是安装的robotframework-requests, 提供接口操作相关的关键字。而Collections库是用来操作字典的,因为接口的返回数据是JSON格式,所以必须转化成字典才能进行断言。
test_get_event_list 定义测试用例名字,测试获取发布会信息接口
---------------------
${payload}= Create Dictionary eid=1
Create Session event http://127.0.0.1:8000/api
${r} Get Request event /get_event_list/ params=${payload}
------------------------
- 通过Create Dictionary关键字定义字典变量 ${payload} ,字典有一个键值eid=1 该字典将会作为接口的参数
- Create Session 关键字用来创建一个HTTP会话服务器。通过event 指定http://127.0.0.1:8000/api为该会话的基础URL
- Get Request关键字用来发起一个GET请求,接口URL为event+/get_event_list/,接口参数为 ${payload} .左后将接口返回数据赋值给变量${r}
----------------------------
Should Be Equal As Strings ${r.status_code} 200
log ${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} message
Should 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. 这里获取message对应的值给变量${msg}
- Should Be Equal关键字用于比较${msg}是否等于success
接下来以同样的方式获取到字典status对应的状态码,可以得到状态200是整数类型。然而,在Robot Framework中直接编写的内容为字符串。所以,这里借助强大的Evaluate关键字,他可以直接调用Python语言提供的方法。例如,这里调用int() 把一个‘200’字符串转为整数类型,并与字典中取出来的整数200进行比较。
接下来再编写一个POST请求的嘉宾签到接口测试用例